Unicode 字符编码取决于代码点

Unicode 字符编码取决于代码点,unicode,character-encoding,Unicode,Character Encoding,有几种字符编码,似乎UTF-8处于领先地位,据说是迄今为止最有效的一种。所以我在想,我们为什么不直接用Unicode字符的代码点来编码呢 例如: 字符:'a',-,'p'。。。 代码点:U+0061,U+00E2,U+0408。。。 编码字节:61,e2,408 等等。这不是编码字符最有效、最简单的方法吗?一个8位字节最多可以保存256个值(0-255),因此它不能保存大多数Unicode代码点(超过100万个) UTFs()是标准化编码,旨在将Unicode代码点表示为编码的代码单元,然后可以

有几种字符编码,似乎UTF-8处于领先地位,据说是迄今为止最有效的一种。所以我在想,我们为什么不直接用Unicode字符的代码点来编码呢

例如: 字符:'a',-,'p'。。。 代码点:U+0061,U+00E2,U+0408。。。 编码字节:61,e2,408


等等。这不是编码字符最有效、最简单的方法吗?

一个8位字节最多可以保存256个值(0-255),因此它不能保存大多数Unicode代码点(超过100万个)

UTFs()是标准化编码,旨在将Unicode代码点表示为编码的代码单元,然后可以用字节格式表示。UTF名称中表示的数字表示用于编码每个代码单元的比特数:

  • 使用8位代码单元
  • 使用16位编码单元
  • 使用32位代码单元
  • 以此类推(还有其他UTF可用,但这3个是使用的主要UTF)
大多数UTF是可变长度的(UTF-32不是),需要1个或多个编码单元来编码给定的码点:

  • 在UTF-8中,ASCII范围(U+0000-U+007F)内的代码点使用1个代码单位,较高的代码点根据代码点值使用2-4个代码单位

  • 在UTF-16中,BMP(U+0000-U+FFFF)中的代码点使用1个代码单位,较高的代码点使用2个代码单位(称为“代理项对”)

  • 在UTF-32中,所有代码点使用1个32位代码单元

例如,使用您提到的代码点,它们的编码如下:

U+0061 LATIN SMALL LETTER A UTF | Codeunits | Bytes ----------------------------------------- UTF-8 | x61 | x61 ----------------------------------------- UTF-16 | x0061 | x61 x00 (LE) | | x00 x61 (BE) ----------------------------------------- UTF-32 | x00000061 | x61 x00 x00 x00 (LE) | | x00 x00 x00 x61 (BE) U+0061拉丁文小写字母A UTF |代码单位|字节 ----------------------------------------- UTF-8 | x61 | x61 ----------------------------------------- UTF-16 | x0061 | x61 x00(LE) || x00 x61(BE) ----------------------------------------- UTF-32 | x00000061 | x61 x00 x00 x00(LE) || x00 x00 x00 x61(BE) U+00E2小写字母A随以扬抑符 UTF |代码单位|字节 ----------------------------------------- UTF-8 | xC3 xA2 | xC3 xA2 ----------------------------------------- UTF-16 | x00E2 | xE2 x00(LE) || x00 xE2(BE) ----------------------------------------- UTF-32 | x000000E2 | xE2 x00 x00 x00(LE) || x00x00x00xe2(BE) U+0408西里尔文大写字母JE UTF |代码单位|字节 ----------------------------------------- UTF-8 | xD0 x88 | xD0 x88 ----------------------------------------- UTF-16 | x0408 | x08 x04(LE) || x04 x08(BE) ----------------------------------------- UTF-32 | x0000048 | x08 x04 x00 x00(LE) || x00 x00 x04 x08(BE) 为了更好的衡量,这里有几个其他的例子:

U+20AC EURO SIGN UTF | Codeunits | Bytes ------------------------------------------- UTF-8 | xE2 x82 xAC | xE2 x82 xAC ------------------------------------------- UTF-16 | x20AC | xAC x20 (LE) | | x20 xAC (BE) ------------------------------------------- UTF-32 | x000020AC | xAC x20 x00 x00 (LE) | | x00 x00 x20 xAC (BE) U+20AC欧元符号 UTF |代码单位|字节 ------------------------------------------- UTF-8 | xE2 x82 xAC | xE2 x82 xAC ------------------------------------------- UTF-16 | x20AC | xAC x20(LE) || x20 xAC(BE) ------------------------------------------- UTF-32 | x000020AC | xAC x20 x00 x00(LE) || x00 x00 x20 xAC(BE) U+1F601笑脸 UTF |代码单位|字节 ----------------------------------------------- UTF-8 | xF0 x9F x98 x81 | xF0 x9F x98 x81 ----------------------------------------------- UTF-16 | xD83D xDE01 | x3D xD8 x01 xDE(LE) || xD8 x3D xDE x01(BE) ----------------------------------------------- UTF-32 | x0001F601 | x01 xF6 x01 x00(LE) || x00 x01 xF6 x01(BE)
如您所见,就字节大小而言,UTF-8并不总是最有效的。它适用于基于拉丁语的语言,但不适用于亚洲语言、符号、表情符号等。另一方面,它不存在endian问题,如UTF-16和UTF-32 do,因此它适用于数据存储和通信。对于Unicode的大多数常用用法,UTF-8已经足够好了,尽管在某些情况下UTF-16更好。在内存中处理Unicode数据时,UTF-16比UTF-8(UTF-32最好)更容易使用,因为要处理的变量更少。

0x408
不适合字节。正如@PetSerAl指出的,这不是编码。当您需要表示U+0408时,它将占用多个字节。UTF-8、UTF-16和UTF-32是使用多个字节对信息进行编码的不同方式。它们有不同的折衷方案。UTF-8对于文件和流是常见的。自VB4、Java、.NET、JavaScript、Win32 API等以来,UTF-16(或其前身UCS-2)一直用于内存中的文本处理。效率是相对的。在关注传输效率的地方,(header
content encoding:gzip
)经常被使用,就像在本页中一样。没有人提到代码单位,但现在已经很清楚了。谢谢:) U+0408 CYRILLIC CAPITAL LETTER JE UTF | Codeunits | Bytes ----------------------------------------- UTF-8 | xD0 x88 | xD0 x88 ----------------------------------------- UTF-16 | x0408 | x08 x04 (LE) | | x04 x08 (BE) ----------------------------------------- UTF-32 | x00000408 | x08 x04 x00 x00 (LE) | | x00 x00 x04 x08 (BE) U+20AC EURO SIGN UTF | Codeunits | Bytes ------------------------------------------- UTF-8 | xE2 x82 xAC | xE2 x82 xAC ------------------------------------------- UTF-16 | x20AC | xAC x20 (LE) | | x20 xAC (BE) ------------------------------------------- UTF-32 | x000020AC | xAC x20 x00 x00 (LE) | | x00 x00 x20 xAC (BE) U+1F601 GRINNING FACE WITH SMILING EYES UTF | Codeunits | Bytes ----------------------------------------------- UTF-8 | xF0 x9F x98 x81 | xF0 x9F x98 x81 ----------------------------------------------- UTF-16 | xD83D xDE01 | x3D xD8 x01 xDE (LE) | | xD8 x3D xDE x01 (BE) ----------------------------------------------- UTF-32 | x0001F601 | x01 xF6 x01 x00 (LE) | | x00 x01 xF6 x01 (BE)