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