Unicode 字符编码取决于代码点
有几种字符编码,似乎UTF-8处于领先地位,据说是迄今为止最有效的一种。所以我在想,我们为什么不直接用Unicode字符的代码点来编码呢 例如: 字符:'a',-,'p'。。。 代码点:U+0061,U+00E2,U+0408。。。 编码字节:61,e2,408Unicode 字符编码取决于代码点,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代码点表示为编码的代码单元,然后可以
等等。这不是编码字符最有效、最简单的方法吗?一个8位字节最多可以保存256个值(0-255),因此它不能保存大多数Unicode代码点(超过100万个) UTFs()是标准化编码,旨在将Unicode代码点表示为编码的代码单元,然后可以用字节格式表示。UTF名称中表示的数字表示用于编码每个代码单元的比特数:
- 使用8位代码单元
- 使用16位编码单元
- 使用32位代码单元
- 以此类推(还有其他UTF可用,但这3个是使用的主要UTF)
- 在UTF-8中,ASCII范围(U+0000-U+007F)内的代码点使用1个代码单位,较高的代码点根据代码点值使用2-4个代码单位
- 在UTF-16中,BMP(U+0000-U+FFFF)中的代码点使用1个代码单位,较高的代码点使用2个代码单位(称为“代理项对”)
- 在UTF-32中,所有代码点使用1个32位代码单元
如您所见,就字节大小而言,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)一直用于内存中的文本处理。效率是相对的。在关注传输效率的地方,(headercontent 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)