作者:小 琛
欢迎转载,请标明出处
引言:很多人都会在编码中遇到了中文乱码问题,针对Windows平台时,这个问题往往更加严重,这篇文章来解析原因,并汇总出相关知识,保证后续的开发字符集正确。
一个char是1个字节8位,这是每一个初学者都知道的内容。这个规定是基于ANSI字符集的,C语言编译器将其转换而来。但世界上的语言不止英语一种,类似于一些复杂的语言:汉语、俄语等,往往8位的一个字节不足够来表述清楚目标字符。基于此,上世纪提出了一个概念:双字符集,了解的人都清楚,和它打交道=噩梦。
但比较幸运的是,Unicode字符的提出,让我们可以专心的使用它来解决类似问题,从而实现你的程序兼顾所有语言。
关于它,不做过多的讲述,C语言编译器默认的字符集就是ANSI,也就是我们熟知的1字节8位。
除此之外还有一些其它规定,例如:字符数组均以/0结尾
有一个比较老的操作系统:Windows vista,它使用的字符集就是wchar_t,即UTF-16。这意味着,一个字节16位,这样就可以满足几乎所有的语言要求。
在STL中,与之对应的是std::wstring
Windows下几乎所有的API函数,都有两个版本A版本和W版本,即:ANSI版本和wchar_t版本,可以理解为是窄字符和宽字符版本,
Unicode字符集,是1988年提出的一个字符标准,基于此标准,我们在开发中统一了字符集,就可以不用去操心相关的字符问题。
Unicode的实现方式有很多种,例如:UTF-8、UTF-16、UTF-32。现在使用最广泛的是UTF-8格式。
很多人会有一个误解:UTF-8,那就是一字节8位,和NISI有什么区别呢?为什么它能处理字符编码问题?
UTF-8:UTF-8将一些字符编码为一个字节,一些字符编码为2个字节,一些字符编码为3个字节,一些字符编码为4个字节。值在0x0080以下爱的字符集压缩为1个字节,对于英语非常适合,0x0080到0x07FF之间的字符转换为2个字节,对于欧洲和中东语言很适合;0x0800以上的内容转为3个字节,适合东亚地区语言;最后代码对被写为四个字节。
总结下来就是:该规则是一个灵活变化的规则,可以应对不同的语言,如果做一个测试的话,将一个Unicode类型字符串加入中文,字节数是有变化的。
实际开发中,尤其针对Windows程序,将自己的工程设置为Unicode字符集会减轻很大一部分工作,具体的设定方法用visual stdio设置高级保存设置即可。
注意一点:std::string 默认的字符集是ANSI,所以如果你从控制台输入中文,将其传入某些接口,一定要做字符转换!!!
又或许可以尝试用wstring作为输入