1.3.3 TextViewer
TextViewer展示了任意输入文本的3种编码方式:ANSI(GBK)、Unicode、UTF-8,如图1-15所示。
图1-15 TextViewer的界面
从Windows界面上读到的字符串都是Unicode的。在早期没有Unicode标准时,Windows系统使用ANSI字符集,在ANSI字符集下,英文采用ASCII编码,汉字采用GBK编码。为了进行ANSI与Unicode之间的转换,我们使用了C++标准库提供的wcstombs_s和mbstowcs_s,并封装到了DXP类中。
注意这里的std::wstring在不同平台下有着不同的字符宽度。Windows下wchar_t是2字节字符,macOS下wchar_t是4字节字符,它并不具备跨平台的特性。
为了进行UTF-8字符集的转换,我们封装了一个DUTF8的类,提供了一些静态方法,可以很方便地完成各类UTF-8的字符处理任务。
在RTC程序设计中,数据的传输要同时兼顾高效与跨平台的需要,因此对于文本的内容,通常会使用UTF-8编码。
有了对本节文本的深入理解,我们就可以将想要发出的信息用计算机编码表示出来。然而,要将信息传递给对方,还必须借助于网络,这将在下一节继续介绍。
总结
英文字符的个数较少,使用一字节表示即可。汉字等亚洲文字需要使用两个或更多字节,各国大都定义了自己的字符集。为了统一全球的文字编码,Unicode标准应运而生。为了提高英文的传输效率,UTF-8编码成为非常流行的文本编码。
参考阅读
1.《编码的奥秘》(2000年),Charles Petzold著,伍卫国等译。此书介绍了一些相当有趣的编码历史,例如盲文的编码、ASCII码的由来。
2.《计算机字符编码——Unicode与Windows》(2016年),李建文著。书中列举了所有Windows支持的Unicode字符。
3.UTF-8编码的细节,参考RFC3629。
4.Bjoern Hoehrmann用C语言实现了UTF-8解码器,可在线查阅Flexible and Economical UTF-8 Decoder。
练习题
1.[5分钟](布莱叶盲文系统)路易斯·布莱叶(Louis Braille,1809—1852)于1824年创建了布莱叶盲文系统。该系统使用了64个码字,使用凸起和平面区分1和0。请问该编码表示一个字符需要多少个平凸?
2.[30分钟](ASCII输出)编写一个程序,输出每个ASCII码位及其对应的符号。
3.[30分钟](GBK字符数)编写一个函数,实现输入一个GBK字节流,输出其中包含的GBK字符数。
4.[1小时](GB 18030)2000年3月,我国推出了GB 18030—2000标准,其字符集来自Unicode 3.0,包括27 533个字符。2005年11月,GB 18030—2005成为强制执行的标准,它来自Unicode 4.1,包括76 556个字符。上网查询相关的标准内容,它们相对于GBK做了哪些改进。