一、字符编码
关于字符编码,首先要提到的概念是“本地化”,也有称之“本地策略”,即字符在当前系统的编码规则。
而不同的系统或者不同的编译器,会把字符根据不同的编码方式写到文件中,或者从文件中读取,典型的有ansi、Unicode、utf-8 等多种编码规则,这些规则对应不同的语种有不一样的特性,比如Unicode可以表示中文的字符、阿拉伯语等,utf-8可表示英语、欧洲、中东地区的字符等等。
既然不同的编码导致不同的数据,这就导致了乱码,程序无法正常运行,同一个"hello world"字符串,会编译出不同版本的01编码串,在不同平台解码,却得到不同的结果!
二、ansi和Unicode与字符串数据的关系
- ansi:单个字符编码
- Unicode:双字节编码
- 字符串数据实际上就是字符数组,即某种编码下的字符数组,c的编译器将一个char默认编码为8位,与ansi一样8位
假如现在有个“hello world”,在ansi编码下,内存是88位的0和1,而在Unicode编码下,可能是176位(并不简单的两倍关系,此处是可能的意思)
三、window中的Unicode和Ansi函数
由于现在内存不在稀缺,以及16位编码的能力更优,window默认推荐使用Unicode编码,由于兼容旧版本系统,还继续支持ansi编码,所以底层的api函数通常有两个版本的接口。如:CreateWindowEx与CreateWindowW
底层很多的ansi函数都做过包装,转换成Unicode的api,统一使用Unicode的好处是数据通讯更加方便。
使用Unicode有以下的优势:
- 有利于应用程序本地化
- Unicode版本的二进制文件,可以支持所有语言(是所有语言,不是所有平台)
- 提升效率,执行代码速度更快
- Unicode易于与com集成
- 易于与.net Framework
四、Unicode与ansi的转换
- 系统提供MultiByToWideChar与WideCharToMultiByte进行转化
- 利用本地化locale和国际化facet 能力