Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

字符编码 #2

Open
4rnold opened this issue Jun 16, 2018 · 0 comments
Open

字符编码 #2

4rnold opened this issue Jun 16, 2018 · 0 comments

Comments

@4rnold
Copy link
Owner

4rnold commented Jun 16, 2018

目录

ASCII 编码

ASCII占用8位(bit)。8个bit可以表示256个字符。

ASCII码只规定了128个字符的编码。

ASCII码的问题是字符太少,不能满足世界各国的需要。所以各国其他编码利用剩余的128个字符定义各自不同的编码。

GB2312 & GBK

汉字GB2312 使用两个字节(16位),最多表示65536个字符。

一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFE

gb2312中两个字符组成的编码的字符叫做“全角”字符,而原来在127号以下的那些就叫”半角”字符了

对GB2312扩展就得到了GBK,再扩展得到GB18030(少数民族文字)。

所以,一个字节小于127的编码都按照ASCII码查,大于127的字节+之后的字节(一共两个字节16位)组成汉字的编码。

所以,“一个汉字两个英文字符”就是这么来的。

Unicode

为了统一一种编码,Unicode出现了。

Unicode 目前规划的总空间是17个平面(平面0至16),0x0000 至 0x10FFFF。最前面的65536个字符位,称为基本平面(缩写BMP) 。每个平面有 65536 个码点。

Unicode只规定了每个字符的码点,到底用什么样的字节序表示这个码点,就涉及到编码方法。

最直观的编码方案就是 UTF-32

The characters “U+” are an ASCIIfied version of the MULTISET UNION “⊎” U+228E character (the U-like union symbol with a plus sign inside it), which was meant to symbolize Unicode as the union of character sets. See Kenneth Whistler’s explanation in the Unicode mailing list. (https://stackoverflow.com/questions/1273693/why-is-u-used-to-designate-a-unicode-code-point)

UTF-32

由于Unicode是0x0000 至 0x10FFFF,直接用定长的4个字节来表示对应的字符

U+0000 = 0x0000 0000
U+597D = 0x0000 597D

这样好处是直观,但是太浪费空间了。

为什么不用utf-24呢?都用3个字节表示。

Why is there no UTF-24?

UTF-8

UTF-8是一种变长的编码,从1字节到4字节。

英文字母为1个字节,汉字为3个字节。

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

Reference

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant