Windows——一篇文章搞定字符编码

作者:小 琛
欢迎转载,请标明出处

引言:很多人都会在编码中遇到了中文乱码问题,针对Windows平台时,这个问题往往更加严重,这篇文章来解析原因,并汇总出相关知识,保证后续的开发字符集正确。

字符编码问题的由来

一个char是1个字节8位,这是每一个初学者都知道的内容。这个规定是基于ANSI字符集的,C语言编译器将其转换而来。但世界上的语言不止英语一种,类似于一些复杂的语言:汉语、俄语等,往往8位的一个字节不足够来表述清楚目标字符。基于此,上世纪提出了一个概念:双字符集,了解的人都清楚,和它打交道=噩梦。

但比较幸运的是,Unicode字符的提出,让我们可以专心的使用它来解决类似问题,从而实现你的程序兼顾所有语言。

ANSI字符集

关于它,不做过多的讲述,C语言编译器默认的字符集就是ANSI,也就是我们熟知的1字节8位。

除此之外还有一些其它规定,例如:字符数组均以/0结尾

Windows下的宽字节

有一个比较老的操作系统:Windows vista,它使用的字符集就是wchar_t,即UTF-16。这意味着,一个字节16位,这样就可以满足几乎所有的语言要求。
在STL中,与之对应的是std::wstring

Windows下几乎所有的API函数,都有两个版本A版本和W版本,即:ANSI版本和wchar_t版本,可以理解为是窄字符和宽字符版本,

Unicode字符集

Unicode字符集,是1988年提出的一个字符标准,基于此标准,我们在开发中统一了字符集,就可以不用去操心相关的字符问题。

Unicode和UTF-8的关系(重点)

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作为输入

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值