Python使用三个unicode字符来表示亚洲的fullstop?这很奇怪?

时间:2011-12-02 00:31:31

标签: python unicode utf-8

python文件:

# -*- coding: utf-8 -*-

print u"。" 
print [u"。".encode('utf8')]

产地:

。
['\xe3\x80\x82']

为什么python使用3个字符来存储我的1个完整停止?这真的很奇怪,如果你单独打印每一个,它们也都是不同的。有什么想法吗?

4 个答案:

答案 0 :(得分:7)

在UTF-8中,三个字节(不是真正的字符)用于表示U + 07FF和U + FFFF之间的代码点,例如此字符,IDEOGRAPHIC FULL STOP(U + 3002)。

尝试使用od -x转储脚本文件。您应该找到用于表示该字符的相同三个字节。

答案 1 :(得分:1)

UTF-8 is a multibyte character representation所以非ASCII字符将占用多个字节。

答案 2 :(得分:0)

正确地将UTF-8编码给我。有关UTF-8编码的说明,请参阅here

答案 3 :(得分:0)

最新版本的Unicode支持93种不同脚本中的109,000多个字符。从数学角度来说,编码该代码点所需的最小字节数是3,因为这是17位的信息。 (Unicode实际上保留了21位范围,但这仍然适用于3个字节。)因此,您可能合理地期望每个字符在最简单的可想象编码中需要3个字节,其中每个字符都表示使用尽可能小的整数字节的整数。 (事实上​​,正如dan04所指出的,你需要4个字节才能获得所有Unicode的功能。)

常见的数据压缩技术是使用短令牌来表示频繁出现的元素,即使这意味着不常发生的元素需要比其他情况更长的令牌。 UTF-8是一种Unicode编码,它使用这种方法以较少的字节存储用英语和其他欧洲语言编写的文本,代价是需要更多字节用于用其他语言编写的文本。在UTF-8中,最常见的拉丁字符只需要1个字节(UTF-8与ASCII重叠以方便英语用户),其他常见字符只需要2个字节。但是有些字符需要3个甚至4个字节,这比他们在“天真”编码中需要的要多。根据定义,您询问的特定字符在UTF-8中需要3个字节。

在UTF-16中,它发生了,这个代码点只需要2个字节,但其他字符需要4个(UTF-16中没有3个字节的字符)。如果你真的关心空间效率,就像John Machin在他的评论中所建议的那样,使用一种旨在为你的语言提供最大空间效率的编码。