字符编码: 基础知识 ASCII, ANSI, Unicode, UTF, Endianness, BOM

基础知识

字符编码

这里仅列举一些结论. 完整的描述, 发展背景及现状, 可参考以下博客链接等:

  1. Character Encoding: https://en.wikipedia.org/wiki/Character_encoding
  2. Unicode: https://en.wikipedia.org/wiki/Unicode
  3. Unicode转UTF-8: http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
  4. 查询Unicode: http://www.chi2ko.com/tool/CJK.htm
  1. ASCII(American Standard Code for Information Interchange) 仅有7bits, 共计128个码.
  2. ANSI(American National Standards Institute) 是对ASCII的扩展,
    可以为1个字节(兼容原ASCII), 也可以为2个字节(扩展以支持最多编码, 如中文).
    中文扩展的编码集被称为GB2312, 基于不同语言的扩展彼此不兼容.
  3. Unicode用一个字符集编码不同语言的字符, 与UCS(Universal Coded Character Set)紧密关联.
    目前有UCS-2(16bits)和UCS-4(32bits), 前者较为常用.
    当谈到具体某个文件的编码时, 有时说Unicode, 实际上指的就是UCS-2.
  4. UTF(Unicode Transformation Formats)用于交换传输Unicode编码.
    有UTF-8, UTF-16, UTF-32, UTF-1, UTF-7等标准.
    UTF-8最常用, 可将Unicode编码映射为1~4字节.
    具体转换细节, 参见以上链接.

字符序(Endianness)

  1. Big-Endian将逻辑高位(MSB, most significant byte)存储在内存低址,
    Little-Endian将逻辑低位(LSB, least significant byte)存储在内存低址.
  2. Big-Endian应用更为广泛: 数据互联网(IPv4, IPv6, TCP, UDP等)中采用.
  3. Little-Endian广泛应用于微处理器(受Intel影响).
  4. 其他: mixed-endian or middle-endian, bi-endian.

更详细的背景信息, 参见:
https://en.wikipedia.org/wiki/Endianness

字符序标记(BOM, Byte Order Mark)

  1. BOM能够指定字符序(Big-Endian 或者 Little-Endian), 也能指明采用的Unicode编码方式(UTF-8, UTF-16 or UTF-32).
  2. 并不要求, 也不推荐在UTF-8中使用BOM(可以使用).
  3. 很少在UTF-32中使用BOM, 若需使用, 参见UTF-16的BOM.
  4. 没有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

你可能感兴趣的:(unicode,编码,ASCII)