从一个单元测试用例来说说编程中的编码问题
扫描二维码
随时随地手机看文章
编码简述以及Windows默认配置
一提到编码大家最熟悉的莫过于ASCII
(American Standard Code for Information Interchange), 其采用7个bit
表示128个字符,包含了常见的英文字符、数字,控制字符等。但是ASCII
不包含中文,日文等文字的编码,便出现了针对中文的编码GB2312
,GBK
等编码,针对日文的Shift_JIS
编码,他们都兼容ASCII
编码,微软]称为ANSI
(American National Standards Institute)编码。但是有个问题,就是各个编码之间不兼容,比如我们都知道一个字符的编码说到底都是二进制表示,那么0xB182
在GB2312
中编码为偙
,但是在Shift_JIS
编码中为こ
。说到这里读者是不是会有两个问题:- 上述的编码并不涵盖世界上所有语言的字符。于是这个时候出现了
Unicode
编码方案,而对应的编码方式主要有UTF-8
,UTF-16
,UTF-32
. - 上述例子中编码值
0xB182
在GB2312
和Shift_JIS
编码方式中有不同的字符表示。这对于对于程序员来说处理起来不是很友好了,比如0xB182
这个字符保存的文本,在你的操作系统中用notepad
打开会显示什么字符呢?这个时候你也许会发现,怎么在不同人的机器上会显示不同的字符样式呢?
偙
:同一个文件在另一个Windows系统上打开可能显示字符
こ
:然后同一个文件在另一个Windows系统上也可能显示乱码。
Notepad在解析的时候,是根据当前的Windows的默认配置的区域有关系,在
控制面板\时钟和区域->区域->管理->更改系统区域设置
(修改后会提示重启生效)这个配置关联着一个相应的
Code Page
, 这个就表明使用的编码方式。比如我本机配置的是中文(简体,中国)
,那么通过命令行chcp
得到代码页为936
,通过微软的MSDN
可以查询到为GB2312
(ANSI/OEM Simplified Chinese (PRC, Singapore); Chinese Simplified (GB2312)
)。根据我当前的配置
Code Page
为936
,那边便在GB2312
相应字符集中找到对应的字符偙
进行显示啦。如果
Code Page
为932
(ANSI/OEM Japanese; Japanese (Shift-JIS)
),那边便从Shift-JIS
相应的字符相应的字符集中找到字符こ
进行显示。如果
Code Page
为437
(OEM United States
), 把每个字节当成一个单独的字符为‚±
乱码样式。一个单元测试
有一定编码经验的同学一定听说过URL Encoding,在RFC1738
中规定URL中的除了字母和数字[0-9a-zA-Z]
,特殊符号$-_. !*'(),
以及一些保留字可以不做编码,对于其他的字符需要对其进行编码,比如汉字程序员
对应三个字对应的UTF-8
编码为E7A88B
,E5BA8F
和E59198
(字节按照从低到高排序), 其对应的UTF-8
的URL Encoding(Percent-Encoding)的编码为程序员
。URL Encoding不是本章节的重点,本章节的重点在于通过一个单元测试用例,来看一看Visual Studio
中字符串的编码(本文基于Visual Studio 2015
)。那么先上一个基于gtest
的测试用例,测试用主要测试了原型为std::string UrlEncoding(const std::string