转载自:
http://www.cnitblog.com/vcleaner/archive/2005/06/20/456.html
Unicode的出现是为了适应软件国际化的需要。Unicode不同于双字节字符集(DBCS)。
一、相关操作函数
1、DBCS使用下面的函数操作字符串:
CharNext——获得后一个字符
CharPrev——获得前一个字符
IsDBCSLeadByte——判断是否为两个字节字符的第一个字节
C++运行期库提供了以"_mbs"开头的一系列的函数操作DBCS。类似的函数有_mbscat等。
2、ANSI字符集是一个美国标准。C++运行期库提供了以"str"开头的一些列的函数操作此字符集。
3、C++运行期库为Unicode字符集提供了一系列以"wcs"开头的函数。
二、对应的数据类型
1、对于ANSI字符定义为char。
2、对于Unicode的字符定义为wchar_t。
三、使用环境
1、首先要说明的是Win98对于Unicode的支持是很微弱的,所以如果要在Win98上运行Unicode编译的程序,可能造成运行错误或者失败。
2、由于Win2000及以后的OS的内核都是使用Unicode编写的,所以虽然可以在其上运行ANSI编码的程序,但是其运行过程中很多地方都需要将ANSI转换为Unicode以后,调用Unicode版本的函数,因为这个转换的过程存在所以ANSI的程序运行效率不高。在Win2000上最好使用Unicode编写程序。
四、编写通用的程序
1、在编程的时候使用TCHAR数据类型,此类型能够根据预编译宏的定义,将其转换为ANSI或者是Unicode。
2、预编译宏_MBCS、_UNICODE和UNICODE。_MBCS是多字节和ANSI字符串的编译宏。此时TCHAR将转换为char。_UNICODE和UNICODE是Unicode编码的预编译宏,TCHAR将转换为wchar_t。
3、_UNICODE和UNICODE与_MBCS不能在编译的时候同时被定义。
4、_UNICODE宏用于C运行期库的头文件,UNICODE宏用于Windows头文件。一般同时定义这两个宏。
转载自:
http://www.xland.com.cn/article/7/133/0704/17978.htm
今天写的一段代码涉及到MBCS编码和UNICODE编码的相互转换,查了一下MSDN的相关资料,整理如下:
在VC6中,默认使用MBCS编码,即多字节字符,实际就是支持大于0x80的ASCII码。这样,一个中文字可以表示为2个字节,GB2312就是这样表示的。
VC6的默认安装是不带UNICODE库的,要在VC6中写UNICODE程序,必须安装CRT和MFC的Unicode库。
要使你的程序支持Unicode,要在你的项目属性中去掉"_MBCS"宏定义,增加"UNICODE"和"_UNICODE"两个宏定义。(注意,这两个都应该加上,因为CRT和MFC使用UNICODE定义,而STL则使用_UNICODE)
如果你的程序是MFC的,则Unicode版MFC库的入口点是wWinMainCRTStartup。
为了方便开发者,VC6中提供了Tchar.h,里面定义了一些宏用来帮助写两种编码都兼容的代码。
类型
一般文本 数据类型名称 | _UNICODE 和 _MBCS 未定义 | _MBCS 已定义 | _UNICODE 已定义 |
---|---|---|---|
_TCHAR |
char |
char |
wchar_t |
_TINT |
int |
int |
wint_t |
_TSCHAR |
signed char |
signed char |
wchar_t |
_TUCHAR |
unsigned char |
unsigned char |
wchar_t |
_TXCHAR |
char |
unsigned char |
wchar_t |
_T 或 _TEXT |
无效(由预处理器移除) |
无效(由预处理器移除) |
L(将后面的字符或字符串转换成相应的 Unicode 形式) |
CRT中的相关函数在Tchar.h中都定义了相应的替代,基本是将str换成了_tcs,比如:CRT中的unsigned int strlen(const char *)现在是unsigned int _tcslen(const TCHAR*),在Uniocde时,将被替换为unsigned int _wcslen(const wchar_t)*,而在MBCS时,会被替换为unsigned int _mcslen(const char*)。
看,写Unicode和MBCS兼容的代码挺容易的吧,我总结了一些替换规则
1 将char换成TCHAR (unsigned char必须去掉unsigned)
2 将str函数换成_tcs函数
3 将字符串常量定义加要_T("")宏
4 printf函数族必须修改为wprintf,不过要注意千万不要使用wprintf函数来解析char型
很多时候程序中既需要Unicode,又需要使用ASCII,这时需要用到操作系统的2个API
WideCharToMultiByte用来将Unicode字符串转化为MBCS的
MultiByteToWideChar用来将MBCS字符串转化为Unicode的
一些注意事项:
在Unicode编码下,sizeof没那么可靠了,memset( ,0, sizeof())的习惯用法可能会出大错,改成memset(,0,sizeof()/szieof(TCHAR))就没事了,呵呵
在Unicode下,一个中文字符就是一个字符,len = strlen() / 2;这样可不行了
// 本人补充
字符串指针 (LPTSTR or PTCHAR)
指向常字符串的指针 LPCTSTR