基础知识
字符编码
这里仅列举一些结论. 完整的描述, 发展背景及现状, 可参考以下博客链接等:
- Character Encoding: https://en.wikipedia.org/wiki/Character_encoding
- Unicode: https://en.wikipedia.org/wiki/Unicode
- Unicode转UTF-8: http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
- 查询Unicode: http://www.chi2ko.com/tool/CJK.htm
- ASCII(American Standard Code for Information Interchange) 仅有7bits, 共计128个码.
- ANSI(American National Standards Institute) 是对ASCII的扩展,
可以为1个字节(兼容原ASCII), 也可以为2个字节(扩展以支持最多编码, 如中文).
中文扩展的编码集被称为GB2312, 基于不同语言的扩展彼此不兼容. - Unicode用一个字符集编码不同语言的字符, 与UCS(Universal Coded Character Set)紧密关联.
目前有UCS-2(16bits)和UCS-4(32bits), 前者较为常用.
当谈到具体某个文件的编码时, 有时说Unicode, 实际上指的就是UCS-2. - UTF(Unicode Transformation Formats)用于交换传输Unicode编码.
有UTF-8, UTF-16, UTF-32, UTF-1, UTF-7等标准.
UTF-8最常用, 可将Unicode编码映射为1~4字节.
具体转换细节, 参见以上链接.
字符序(Endianness)
- Big-Endian将逻辑高位(MSB, most significant byte)存储在内存低址,
Little-Endian将逻辑低位(LSB, least significant byte)存储在内存低址. - Big-Endian应用更为广泛: 数据互联网(IPv4, IPv6, TCP, UDP等)中采用.
- Little-Endian广泛应用于微处理器(受Intel影响).
- 其他: mixed-endian or middle-endian, bi-endian.
更详细的背景信息, 参见:
https://en.wikipedia.org/wiki/Endianness
字符序标记(BOM, Byte Order Mark)
- BOM能够指定字符序(Big-Endian 或者 Little-Endian), 也能指明采用的Unicode编码方式(UTF-8, UTF-16 or UTF-32).
- 并不要求, 也不推荐在UTF-8中使用BOM(可以使用).
- 很少在UTF-32中使用BOM, 若需使用, 参见UTF-16的BOM.
- 没有BOM或其他说明, 则默认以Big Endian理解.
| 编码 | BOM |
|---|---|
| UTF-8-BOM | EF BB BF |
| UCS-2 BE BOM | FE FF |
| UCS-2 LE BOM | FF FE |
更详细的信息, 包括更多的BOM取值, 参见:
https://en.wikipedia.org/wiki/Byte_order_mark
实验
背景信息:
“联”的Unicode编码为\U8054, 对应的UTF-8编码为E8 81 94;
“通”的Unicode编码为\U901A, 对应的UTF-8编码为E9 80 9A;
“U”的Unicode编码为\U55.
实验平台: (任选其一)
1. Windows 10 中文版;
2. Windows 10 英文版 (Current language for non-Unicode programs is set to Chinese (Simplified, China));
实验1: 默认编码
实验操作: 新建空白txt文档, 以中文输入法输入”联通”并保存. 重新打开该文档.
实验现象: 打开文档, 显示乱码.
实验解释:
1. 新建空白文档并打开,
汉字”联通”默认以Chinese Simplified(GB2312) - Codepage 936编码保存,
实际内容为: C1 AA CD A8.
2. 在无BOM的情况下, 程序采用探索式(heuristic)的方式判断文件编码是ANSI还是UTF-8.
实际内容以二进制表示为: 1100 0001 1010 1010 1100 1101 1010 1000.
可按UTF-8格式解读: 11 000001 10 101010 11 001101 10 101000.
解读出的Unicode码为\U006A\U0368.
其中, 第一个码不合法, 因其值可以用1字节UTF-8表示, 最终显示为乱码;
第二个码对应的Character Name为COMBINING LATIN SMALL LETTER C, 是一个位于上方的C符号, 正确显示.
实验2: 验证不同编码结果间的转换
实验工具: Notepad++
实验操作: 观察多种不同编码下, “联通U“的实际保存内容.
实验结果:
| 编码 | 编码结果 |
|---|---|
| ANSI | C1 AA CD A8 55 |
| UTF-8 | E8 81 94 E9 80 9A 55 |
| UTF-8-BOM | EF BB BF E8 81 94 E9 80 9A 55 |
| UCS-2 BE BOM | FE FF 80 54 90 1A 00 55 |
| UCS-2 LE BOM | FF FE 54 80 1A 90 55 00 |
2013

被折叠的 条评论
为什么被折叠?



