
Unicode字符集与UTF-8、UTF-16、UTF-32字符编码1. Unicode的由来1.1 为什么需要Unicode1.2 Unicode版本查看2. Unicode字符编号2.1 Unicode1.02.2 Unicode3.13. Unicode字符集AI参考4. 疑问4.1 CJK统一表意文字是什么4.2 如何查看Emoji表情方式1方式25. Unicode标准文档5.1 查看方式5.2 标准文档关键内容5.2.1【2.5 Encoding Forms章节】5.2.2 【2.5.3 UTF-8 章节】5.2.3【3.9.3 UTF-8 章节】6. Unicode字符编码-【UTF-8】6.1 UTF-8的4种字节序列6.2 UTF-8编码算法6.3 UT8-8编码查看6.3.1 大写英文字母【A】6.3.2 版权符号【©】6.3.3 中文字符【汉】6.3.4 颜文字【】6.3.4 总结6.4 UTF-8 BOMByte Order Mark6.4.1 byte order mark字节序标记6.4.2 UTF-8中BOM的编码6.4.3 查看UTF-8 BOM1. Unicode的由来Unicode的Uni含义为【Unique Universal Uniform】所以Unicode中文名也叫单一码、万国码或者统一码。1.1 为什么需要UnicodeASCII字符集最后一次更新是1986年。非英语国家使用计算机时发现他们国家的字符不在ASCII字符集中于是利用ASCII码剩余的编码位对ASCII字符集进行扩充但是不同的国家对ASCII的扩充不同。例如法国扩充的128个字符是法国的字母而俄罗斯扩充的是俄罗斯的西里尔字母。另一些国家例如中国日本韩国使用计算机时也发现ASCII字符集不够用即使扩充也不够用。所以就必须要用多字节的字符编码。于是不同国家发明适合自己的字符编码中国大陆GB2312中国台湾Big5日本Shift-JIS韩国EUC-KR这些字符集之间互不兼容。同一个字符编码在不同的字符集中表示的字符不同。1988年Apple、Xerox等软件公司组成了一个机构叫Unicode联盟Unicode Consortium。他们想定义一个字符集可以容纳全世界所有字符每个字符分配唯一编号并对字符进行统一编码。1.2 Unicode版本查看Unicode版本查看1991年第一个版本Unicode1.0采用双字节编码编号从【0-65535】即【0x0000-0xffff】共65536个字符。但是光中国就有十万多汉字想容纳全世界的字符明显不够。2001年Unicode3.1采用四字节编码编号范围0x0000~0x10ffff并把字符编号分为17个平面每个平面有65536个可编号位。2. Unicode字符编号Unicode的字符编号非常简单使用连续的自然数来编号使用编号的十六进制并且加前缀U即Unicode的缩写。例如字符编号0 是 U0000字符编号127 是 U007F字符编号65535 是 UFFFF2.1 Unicode1.0采用双字节编号编号从0b0000 0000 0000 0000 到 0b1111 1111 1111 1111 0~65535即0x0000~0xffff2.2 Unicode3.1采用四字节编号编号范围 0000 0000 0000 0000 0000 0000 0000 0000 到 1111 1111 1111 1111 1111 1111 1111 1111 分为17个平面每个平面有65536个可编号位。平面0是基本平面(BMP)平面1~16是辅助平面(SMP)平面0 0000 0000 0000 0000 0000 0000 0000 0000 到 0000 0000 0000 0000 1111 1111 1111 1111 即0x0000~0xffff平面10000 0000 0000 0001 0000 0000 0000 0000 到 0000 0000 0000 0001 1111 1111 1111 1111 即 0x10000~0x1ffff平面20000 0000 0000 0010 0000 0000 0000 0000 到 0000 0000 0000 0010 1111 1111 1111 1111 即 0x20000~0x2ffff平面30000 0000 0000 0011 0000 0000 0000 0000 到 0000 0000 0000 0011 1111 1111 1111 1111 即0x30000~0x3ffff。。。。平面150000 0000 0000 1111 0000 0000 0000 0000 到 0000 0000 0000 1111 1111 1111 1111 1111 即 0xf0000~0xfffff平面160000 0000 0001 0000 0000 0000 0000 0000 到 0000 0000 0001 0000 1111 1111 1111 1111 即 0x100000~0x10ffff17个平面编号是连续的例如平面1的最后一个编号0xffff加1就是0x10000即平面2的第一个编号以此类推。Unicode17个平面总编号范围【0x0000~0x10ffff】共17 * 65536 1114112个可编号位。3. Unicode字符集unicode官方字符集https://www.unicode.org/charts/AI参考unicode字符deepseek参考4. 疑问4.1 CJK统一表意文字是什么CJK的含义是Chinese Japan Korean中国创造了汉字日本韩国朝鲜越南先学习中国的汉字然后把中国汉字渐渐演变成他们的汉字字形仿照汉字创造他们特有的汉字例如越南的喃字。有些汉字意思是一样的但在不同国家的字形有稍微的变化。Unicode把这些意思一样但是字形有差异的汉字统一整理在CJK统一表意文字里面。CJK统一表意文字例如不同国家/地区字形不同G中国大陆H中国香港T中国台湾J日本K韩国V越南KP朝鲜4.2 如何查看Emoji表情方式1方式2https://www.unicode.org/emoji/charts-17.0/emoji-list.html5. Unicode标准文档5.1 查看方式官网连接-》搜索【Unicode Technical Site】 -》搜索【Latest Version】-》搜索【Archival PDF: UnicodeStandard-17.0.pdf】https://www.unicode.org/versions/Unicode17.0.0/UnicodeStandard-17.0.pdf5.2 标准文档关键内容5.2.1【2.5 Encoding Forms章节】The Unicode Standard provides three distinct encoding forms for Unicode characters, using 8-bit, 16- bit, and 32-bit units. These are named UTF-8, UTF-16, and UTF-32, respectively. The “UTF” is a carryover from earlier terminology meaning Unicode (or UCS) Transformation Format.Unicode标准提供了三种不同的编码方式分别是使用8字节16字节32字节。他们被称作UTF-8, UTF-16, UTF-32UTFUnicode (or UCS) Transformation Format.5.2.2 【2.5.3 UTF-8 章节】UTF-8 is a variable-width encoding form, using 8-bit code units, inwhich the high bits of each code unit indicate the part of the code unit sequence towhich each byte belongsUTF-8 是一种可变长的编码形式使用 8 位的编码单元8bit码元每个编码单元的高位表示每个字节属于编码单元序列的哪一部分5.2.3【3.9.3 UTF-8 章节】6. Unicode字符编码-【UTF-8】Unicode标准提供了三种不同的编码方式分别是使用8字节16字节32字节。他们被称作UTF-8, UTF-16, UTF-326.1 UTF-8的4种字节序列UTF-8字节序列有效编码位Unicode编号范围码点范围编码个数单字节0xxxxxxx70x00~0x7f128全部都是ASCII字符双字节110xxxxx 10xxxxxx110x80~0x7ff三字节1110xxxx 10xxxxxx 10xxxxxx160x800~0xffff四字节11110xxx 10xxxxxx 10xxxxxx 10xxxxxx210x10000~0x10ffffUTF-8字节序列首字节一定是以 0 、110 、1110 、11110开头后续字节一定是以10开头是续字节标志。非0开头的首字节有一个特点多少个1就代表这个字符有多少个字节。有效编码位每个字节的前几位都固定了不固定的位数就是有效编码位Unicode编号范围Unicode采用连续的自然数来编号总编号范围【0x0000~0x10ffff】单字节的字节序列有7个有效编码位0b1111111即【0x7f】双字节的字节序列有11个有效编码位0b11111111111【即0x7ff】三字节的字节序列有16个有效编码位0b1111111111111111即【0xffff】四字节的字节序列有21个有效编码位0b111111111111111111111即【0x1fffff】但是Unicode的最高编号为0x10ffff各范围边界是连续衔接的0x7f 之后是 0x800x7ff 之后是 0x8000xffff之后是 0x10000。6.2 UTF-8编码算法确定字符的【Unicode字符编号】比如中文字符【汉】的Unicode字符编号为 【0x6c49】 即【0b0110 1100 0100 1001】可以在CJK同一表意字符中查看确定字符序列几个字节。中文字符【汉】字符编号为 0x6c49在0x800~0xffff 这个编号范围因此是三字节序列把字符编号转成二进制然后把【字符编号的二进制数据】填充到 【字节序列的有效编码位】中如果没填充满则高位填0。例如0b0110 1100 0100 1001 填充到三字节序列的有效编码位二进制数据0110 1100 0100 1001字节序列1110xxxx 10xxxxxx 10xxxxxx填充结果111001101011000110001001即【0xe6b189】这个填充结果就是中文字符【汉】的UTF-8编码。6.3 UT8-8编码查看6.3.1 大写英文字母【A】大写英文字母的Unicode编号【0x0041】即【0b01000001】在【0x00-0x7f】这个范围所以是单字节序列二进制数据100 0001字节序列0xxxxxxx填充结果0100 0001即【0x41】6.3.2 版权符号【©】Unicode编号【0x00A9】即【0b10101001】在【0x80~0x7ff】范围所以是双字节填充后11000010 101010010xc2a9二进制数据10101001字节序列110xxxxx 10xxxxxx填充结果1100001010101001即【0xc2a9】6.3.3 中文字符【汉】见上文 6.2章节6.3.4 颜文字【】Unicode编号【0x1f60e】即【0b00011111011000001110】在【0x10000-0x10ffff】范围所以是4字节二进制0001 1111 0110 0000 1110字节序列11110xxx 10xxxxxx 10xxxxxx 10xxxxxx填充结果11110x00100111111001100010001110未填满高位补01111000010011111100110001000 1110即【0xf09f988e】6.3.4 总结6.4 UTF-8 BOMByte Order Mark6.4.1 byte order mark字节序标记只有16bit 32bit码元的数据才要考虑字节序问题8bit码元的数据只有一个字节没有字节序问题UTF-8就是8bit码元UTF-8是一个字节一个字节处理数据不需要考虑字节序的问题UTF-8增加字节序标记主要用作UTF-8数据签名用来标记数据是UTF-8编码的数据。Unicode使用编号为【0xfeff】的字符放在文本数据的最开头来做字节序标记这个字符是零宽度不中断空格也就是不可见字符。【0xfeff】这个编号几乎不会出现在其他字符编码中例如GB2312 GBK GB18030Unicode3.2版本后【0xfeff】就不表示任何字符了只用作字节序标记零宽度不中断空格改用【0x2060】UTF-8不需要也不推荐使用BOM。但是如果UTF-8的数据是从其他使用了BOM的编码格式转换过来或者这个BOM是用来作为UTF-8签名可能会看到这个BOM。6.4.2 UTF-8中BOM的编码在UTF-8中BOM是编号为【0xfeff】编码是 EF BB BF 计算方式0xFEFF 范围在【0x800~0xffff】因此是三字节序列。二进制0b1111 1110 1111 1111三字节序列1110xxxx 10xxxxxx 10xxxxxx填充后111011111011101110111111也就是十六进制的【0xEF BB BF】6.4.3 查看UTF-8 BOMidea中给文件添加BOMvscode中查看