学习
实践
活动
专区
工具
TVP
写文章

一个Unicode字符需要多少字节?

浏览 275关注 0回答 8得票数 266
原文

我对编码有点困惑。据我所知,旧的ASCII字符每个字符占用一个字节。Unicode字符需要多少字节?

我假设一个Unicode字符可以包含来自任何语言的所有可能的字符-我说的对吗?那么每个字符需要多少字节呢?

UTF-7、UTF-6、UTF-16等是什么意思?它们是不同版本的Unicode吗?

我读过Wikipedia article about Unicode,但它对我来说很难。我期待着看到一个简单的答案。

原文
Isaac D. Cohen修改于2015-01-21 07:32

8 个回答

高票数最新
Loduwijk
回答于2011-03-13 23:09
得票数 4

好吧,我也打开了维基百科的页面,在介绍部分我看到了"Unicode可以由不同的字符编码实现。最常用的编码是UTF-8 (它对任何ASCII字符使用一个字节,它在UTF-8和ASCII编码中具有相同的代码值,最多四个字节用于其他字符),现在已经过时的UCS-2 (它对每个字符使用两个字节,但不能在当前Unicode标准中对每个字符进行编码)“。

正如这段引述所示,您的问题在于您假设Unicode是一种单一的字符编码方式。实际上,Unicode有多种形式,在这句话中,其中一种甚至每个字符都有一个字节,就像你习惯的那样。

所以你想要的简单答案是它是不同的。

Zimbabao
回答于2011-03-13 23:15
得票数 33

简单地说,Unicode是一个标准,它将一个数字(称为代码点)分配给世界上所有的字符(它还在开发中)。

现在你需要用字节来表示这个代码点,这就是character encodingUTF-8, UTF-16, UTF-6是表示这些字符的方式。

UTF-8是多字节字符编码。字符可以有1到6个字节(其中一些现在可能不需要)。

UTF-32每个字符都有4个字节的字符。

UTF-16对每个字符使用16位,并且它只表示称为BMP的Unicode字符的一部分(对于所有实际目的,它已经足够了)。Java在其字符串中使用此编码。

Nic Cottrell
修改于2015-01-09 01:03
得票数 7

在UTF-8中有一个强大的工具可以计算任何字符串的字节数:http://mothereff.in/byte-counter

更新:@mathias已经公开了代码:https://github.com/mathiasbynens/mothereff.in/blob/master/byte-counter/eff.js

Yash
修改于2017-09-12 20:26
得票数 1

看看这个Unicode code converter。例如,在"0x... notation“字段中输入0x2009,其中2009 is the Unicode number for thin space,然后单击Convert。十六进制数字E2 80 89 (3字节)出现在"UTF-8 code unit“字段中。

tambre
修改于2019-09-15 15:06
得票数 225

奇怪的是,没有人指出如何计算一个Unicode字符需要多少字节。以下是UTF-8编码字符串的规则:

Binary    Hex          Comments
0xxxxxxx  0x00..0x7F   Only byte of a 1-byte character encoding
10xxxxxx  0x80..0xBF   Continuation byte: one of 1-3 bytes following the first
110xxxxx  0xC0..0xDF   First byte of a 2-byte character encoding
1110xxxx  0xE0..0xEF   First byte of a 3-byte character encoding
11110xxx  0xF0..0xF7   First byte of a 4-byte character encoding

所以快速的答案是:它需要1到4个字节,这取决于第一个字节,它将指示它将占用多少字节。

prewett
回答于2016-07-13 04:45
得票数 3

对于UTF-16,如果字符以0xD800或更大的字符开头,则需要四个字节(两个代码单元);这样的字符称为“代理对”。更具体地说,代理项对的形式如下:

[0xD800 - 0xDBFF]  [0xDC00 - 0xDFF]

哪里..。表示给定范围内的双字节代码单元。任何<= 0xD7FF都是一个代码单元(两个字节)。任何>= 0xE000都是无效的(有争议的是,BOM标记除外)。

请参阅http://unicodebook.readthedocs.io/unicode_encodings.html,7.5节。

John
修改于2017-01-27 17:58
得票数 21

在UTF-8中:

1 byte:       0 -     7F     (ASCII)
2 bytes:     80 -    7FF     (all European plus some Middle Eastern)
3 bytes:    800 -   FFFF     (multilingual plane incl. the top 1792 and private-use)
4 bytes:  10000 - 10FFFF

在UTF-16中:

2 bytes:      0 -   D7FF     (multilingual plane except the top 1792 and private-use )
4 bytes:   D800 - 10FFFF

在UTF-32中:

4 bytes:      0 - 10FFFF

根据定义,10FFFF是最后一个unicode码点,之所以这样定义,是因为它是UTF-16的技术限制。

它也是UTF-8可以用4字节编码的最大码点,但UTF-8编码背后的思想也适用于5字节和6字节编码,以覆盖直到7FFFFFFF的码点。只有UTF-32的一半。

Giorgi Tsiklauri
回答于2020-06-17 22:15
得票数 3

Unicode是一个standard,它为每个字符提供一个唯一的数字。对于世界上存在的所有字符,这些唯一的数字被称为code points (这只是一个唯一的代码)(一些字符还在添加中)。

出于不同的目的,您可能需要用字节来表示这个code points (大多数编程语言都是这样做的),这就是Character Encoding的用武之地。

UTF-8UTF-16UTF-32等都是Character Encodings,并且Unicode的代码点在这些编码中以不同的方式表示。

UTF-8编码具有可变宽度长度,其中编码的字符可以占用1到4个字节;

UTF-16具有可变长度,其中编码的字符可以采用1或2个字节(即8或16位)。这只表示所有称为BMP (基本多语言平面)的Unicode字符的一部分,对于几乎所有情况都足够了。Java的字符串和字符使用UTF-16编码;

UTF-32具有固定的长度,每个字符恰好占用4个字节(32位)。

页面原文内容由nan、Isaac D. Cohen、Loduwijk、Zimbabao、Jonathan Leffler、rdb、Nicolas Barbulesco、Nic Cottrell、ma11hew28、Yash、paul.ago、tambre、DJPJ、MarcusJ、Cee McSharpface、Frediano Ziglio、Chris、prewett、John、Giorgi Tsiklauri提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:https://stackoverflow.com/questions/5290182复制

扫码关注腾讯云开发者

领取腾讯云代金券