Linux 与 Windows 对UNICODE 的处理方式

Linux 与 Windows 对于字符及字符串(无论是否 UNICODE模式)基本处理函数接口都遵循 POSIX标准,是一致的。Windows在这个基础上还在TCHAR.h中封装了自己的一个接口定义,以利于用 UNICODE宏就可以让程序在不同的环境中运行。

原本非UNICODE定义基于 char 类型,UNICODE定义基于 wchar_t 类型, Windows 在winnt.h中分别定义两个宏来代表这两种类型,

typedef char CHAR;

#ifndef _MAC
typedef wchar_t WCHAR;    // wc,  16-bit UNICODE character
#else
// some Macintosh compilers don't define wchar_t in a convenient location, or define it as a char
typedef unsigned short WCHAR;    // wc,  16-bit UNICODE character
#endif

然后基于以上定义定义了一系列 TCHAR 宏,这样,可以让你的程序轻松地在 UNICODE  及 非 UNICODE环境之间移植,你只要使用 TCHAR相关的宏定义
 
在定义 wcs(wide char string 缩写) 常量时,需要使用L 前缀的字符串常量,如。

wchar_t mywstring = L "my wide char string";

Windows 也提供了相应的封装宏定义 __T。

#ifdef  UNICODE
#define __T(x)      L ## x
...
#else
#define __T(x)      x
...
#endif

在编程时,你应该使用 _T 或 _TEXT,他们都一样

/* Generic text macros to be used with string literals and character constants.
  Will also allow symbolic constants that resolve to same. */

#define _T(x)      __T(x)
#define _TEXT(x)    __T(x)

当编译参数UNICODE有定义时,定义 _tcs* 字符串宏如下,其中函数或宏名字以"_"开头可以理解为不属于 POSIX 范围,亦即 linux中找不到相应函数。

#ifdef UNICODE 
。。。略
/* String functions */

#define _tcscat    wcscat
#define _tcschr    wcschr
#define _tcscpy    wcscpy
#define _tcscspn    wcscspn
#define _tcslen    wcslen
#define _tcsncat    wcsncat
#define _tcsncpy    wcsncpy
#define _tcspbrk    wcspbrk
#define _tcsrchr    wcsrchr
#define _tcsspn    wcsspn
#define _tcsstr    wcsstr
#define _tcstok    wcstok

#define _tcsdup    _wcsdup
#define _tcsnset    _wcsnset
#define _tcsrev    _wcsrev
#define _tcsset    _wcsset

#define _tcscmp    wcscmp
#define _tcsicmp    _wcsicmp
#define _tcsnccmp  wcsncmp
#define _tcsncmp    wcsncmp
#define _tcsncicmp  _wcsnicmp
#define _tcsnicmp  _wcsnicmp

#define _tcscoll    wcscoll
#define _tcsicoll  _wcsicoll
#define _tcsnccoll  _wcsncoll
#define _tcsncoll  _wcsncoll
#define _tcsncicoll _wcsnicoll
#define _tcsnicoll  _wcsnicoll

。。。略
 
当没有 UNICODE 定义时,_tcs* 宏定义指向普通操作

#else  /* ndef _UNICODE */
。。。略
#define _tcscat    strcat
#define _tcscpy    strcpy
#define _tcsdup    _strdup

#define _tcslen    strlen
。。。略
 #ifdef  _MBCS
。。。略
 #define _tcschr    _mbschr

#define _tcscspn    _mbscspn

#define _tcsncat    _mbsnbcat

#define _tcsncpy    _mbsnbcpy

#define _tcspbrk    _mbspbrk

#define _tcsrchr    _mbsrchr

#define _tcsspn    _mbsspn

#define _tcsstr    _mbsstr

#define _tcstok    _mbstok

#define _tcsnset    _mbsnbset

#define _tcsrev    _mbsrev

#define _tcsset    _mbsset

#define _tcscmp    _mbscmp

#define _tcsicmp    _mbsicmp

#define _tcsnccmp  _mbsncmp

#define _tcsncmp    _mbsnbcmp

#define _tcsncicmp  _mbsnicmp

#define _tcsnicmp  _mbsnbicmp


。。。略
#else  /* !_MBCS */
。。。略
#define _tcschr    strchr
#define _tcscspn    strcspn
#define _tcsncat    strncat
#define _tcsncpy    strncpy
#define _tcspbrk    strpbrk
#define _tcsrchr    strrchr
#define _tcsspn    strspn
#define _tcsstr    strstr
#define _tcstok    strtok
#define _tcsnset    _strnset
#define _tcsrev    _strrev
#define _tcsset    _strset
#define _tcscmp    strcmp
#define _tcsicmp    _stricmp
#define _tcsnccmp  strncmp
#define _tcsncmp    strncmp
#define _tcsncicmp  _strnicmp
#define _tcsnicmp  _strnicmp
。。。略
#endif
#endif

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/0b819edc95475df38963e08bd17f6627.html