现在的位置: 首页 > 综合 > 正文

Windows中的字符编码

2017年10月04日 ⁄ 综合 ⁄ 共 1333字 ⁄ 字号 评论关闭

Windows中的字符编码

kezunhai@gmail.com

http://blog.csdn.net/kezunhai


          在进行Window C++开发过程中,对char、tchar、wchar_t等联系和区别不是很清楚,会遇到各种字符编码的问题,如char*无法转换为w_char*、wchar*等。本文将来简单介绍下Windows中的字符编码问题。

          为什么会出现众多的字符编码?这是因为单字节只能表示256个字符,而对于中文、日文中的汉字等字符则就无法表示。为此,就出现了双字节字符集(DBCS:Double Bytes CharSet)。在双字节字符集中,字符串中的每个字符可以包含一个字符或两个字符,这样就导致在编程过程中无法对字符进行统一处理,给开发人员带来了额外的负担。如下面的例子:

int main(int argc, char*argv[])
{
	char* str = "hello中国";
	int len = strlen(str);	
	cout<<"\""<<str<<"\" = "<<len<<endl;
	char c = (char)getchar();
	if(c ==27)
		exit(1);
		
	return 1;		
}

运行结果如下:

在上面的例子中,我们可以知道str字符串中有多少字节,但却无法知道有多少个字符,在ANSI C标准中没有相应的接口函数能够处理。

         1988年apple和Xerox公司推出了Unicode标准。Unicode字符串中的每个字符都采用16位两个字节来表示,因此可以表示65000多个字符,这样几乎全世界的绝大多数语言都可以表示了。在早期的ANSI C标准中是对unicode不支持的(win 98是在后期对string.h文件进行了修改后才增加了对unicode字符编码的支持)。ANSI C中的字符处理函数不能很好的处理unicode的字符,于是就出现了一系列与ANSI
C对于的unicode字符处理函数,如下:


从上面看到,所以的unicode函数均以wcs开头(表示宽字节字符集:Wide charset),因此在需要调用unicode函数的地方,只需要将str替换成wcs即可。

         到这里,又有个问题,对于采用了str或wcs显式调用的代码来说,无法非常容易的同时为ANSI 和Unicode代码进行编译。为此,定义了一个Tchar.h头文件。Tchar.h头文件的唯一作用就是帮助创建ANSI和Unicode通用源代码文件。在该头文件中有定义有宏:UNICODE或_UNICODE

如果定义UNICODE或_UNICODE

         则 typedef wchar_t tchar

如果没定义

      则 typedef char tchar

同样,还有对其他字符处理函数的重定义,具体可以参考tchar.h文件。

        如此,在Windows C++编程中,如果不能确定自己需要使用哪种编码字符,建议采用tchar形式,系统会自动在ANSI和UNICODE之间智能选择,以避免字符编码问题。


想了解更多请参考:Windows核心编程

作者:kezunhai出处:http://blog.csdn.net/kezunhai欢迎转载或分享,但请务必声明文章出处。 
         

抱歉!评论已关闭.