在编译许多程序的时候,我们常常会出现诸如指针转换错误或者const char[] 不能转换成XX的错误,这时很可能就是项目编码的问题了,如果您使用的是VS编程环境,那么打开工程属性,里面就有个选项是给你选择采用多字符集还是采用unicode。而对于这两者,我坚定不移的喜欢unicode~
在多字节环境下,系统会按照ASCII字符表中128个字符进行截断操作,由于汉字是占用两个的字节的,所以在即有汉字又有英文的字符串中,该函数只会截断字符串右边英文字符,而对于汉字则无法处理。
而对于Unicode字符集使用两个字节对世界上几乎所有的语言进行编码(0×0000-0xFFFF),它可以表达的字符数量为16位,即65536个字符,每种语言的代码段不同,两个字节所表达的字符是唯一的,所以在该环境下,每一个字符都有唯一的一个编码,那么在进行截断操作时,自然不会出现意料之外的结果。
而我看过好几本有名气的C++的书中,都是说到一个项目或者程序的编码最好都选择Unicode(可是在几本国内出的书里不但没提及,而且提供的源代码也全都是“多字节”的),在此,我并没有鄙视多字节的意思,只是觉得写出通用的,跨语言的代码时候最好采用unicode。
下面这段话是来自MSDN:
要完成应用程序的 Unicode 编程,还必须:
使用 _T 宏有条件地编写字符串的代码,使之可移植到 Unicode。
当传递字符串时,请注意函数参数要求的长度是以字符为单位还是以字节为单位的。如果在使用 Unicode 字符串,这一区别是很重要的。
使用 C 运行时字符串处理函数的可移植版本。
使用以下用于字符和字符指针的数据类型:
TCHAR 这里将使用 char。
LPTSTR 这里将使用 char*。
LPCTSTR 这里将使用 const char*。CString 提供 operator LPCTSTR 来在 CString 和 LPCTSTR 之间进行转换。
CString 还提供识别 Unicode 的构造函数,赋值运算符和比较运算符。
呵呵~补充一点就是使用_T的时候,如果系统提示你它是没有定义的标识符的话,带上atlstr.h就ok了。哈,又是一个笔记~