AkiraZ's blog

愿键盘的余温传递到更遥远的将来

中文 / English
0%

Ascii Unicode 与 UTF-8

事情的起因是这样的

我在NGA上看到个帖子,说是在不同的语言环境下的游戏文本

英文文本

日文文本

中文文本

对应的编码不一样,对应的分别是Ascii编码的英文Longing,UTF-8编码的日文的あこがれ和中文的憧憬

就很好奇,跟着楼主给的链接去看了一下 Unicode 和 UTF-8

Ascii 编码

这几乎已经是计算机的基础常识了,使用7bit编码的128个字符,在一个字节中最高位为0.最高位为1的编码留空

于是许多国家就对最高位1的留白进行了编码,比如中文GB2312,但是每种语言又有自己的编码方式,相当混乱

Unicode 字符集

于是出现了 Unicode,是一个囊括了世界上所有符号甚至还有emoji的字符集。

比如,汉字的 Unicode 是十六进制数4E25,转换成二进制数足足有15位(100111000100101),也就是说,这个符号的表示至少需要2个字节。表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多。

如果同时要直接表示英文符号的话在3-4个字节中会留空2-3字节,存在空间浪费。

UTF-8 编码

UTF-8是一种针对 Unicode 字符集的编码方式,规则如下

  • 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。
  • 对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。
Unicode符号范围
(十六进制)
UTF-8编码方式
(二进制)
0000 0000-0000 007F 0xxxxxxx
0000 0080-0000 07FF 110xxxxx 10xxxxxx
0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

的 Unicode 是4E25100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800 - 0000 FFFF),因此的 UTF-8 编码需要三个字节,即格式是1110xxxx 10xxxxxx 10xxxxxx。然后,从的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,的 UTF-8 编码是11100100 10111000 10100101,转换成十六进制就是E4B8A5

记事本中的编码方式

notepad

  • ANSI,Ascii + GB2312(简体中文)或其它自定编码Big5(繁体中文)
  • UTF-16 LE,小端 UTF-16
  • UTF-16 BE,大端 UTF-16
  • UTF-8
  • 带有BOM的UTF-8,BOM(byte order mark),用来标记大端(FEFF)/小端(FFFE)。但是标准的UTF-8是不需要BOM的,这只是一种扩展形式。




参考链接

http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html