Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python使用三个unicode字符表示亚洲句号?这很奇怪?_Python_Unicode_Utf 8 - Fatal编程技术网

Python使用三个unicode字符表示亚洲句号?这很奇怪?

Python使用三个unicode字符表示亚洲句号?这很奇怪?,python,unicode,utf-8,Python,Unicode,Utf 8,python文件: # -*- coding: utf-8 -*- print u"。" print [u"。".encode('utf8')] 产生: 。 ['\xe3\x80\x82'] 为什么python使用3个字符来存储我的1个句号?这真的很奇怪,如果你单独打印出来,它们也都不一样。有什么想法吗?所以非ASCII字符将占用一个以上的字节。在UTF-8中,三个字节(不是真正的字符)用于表示U+07FF和U+FFFF之间的代码点,例如这个字符,表意句号(U+3002) 尝试使用od-

python文件:

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

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

。
['\xe3\x80\x82']
为什么python使用3个字符来存储我的1个句号?这真的很奇怪,如果你单独打印出来,它们也都不一样。有什么想法吗?

所以非ASCII字符将占用一个以上的字节。

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


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

在我看来,UTF-8编码正确。有关UTF-8编码的说明,请参阅。

最新版本的Unicode支持93个不同脚本中的109000多个字符。从数学上讲,编码这些代码点所需的最小字节数是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在其评论中的建议执行,并使用为您的语言设计的最大空间效率的编码。

如果您想了解unicode,我所知道的最好的一个例子是:有趣的是:编码unicode字符串后,您希望看到什么?-1 UTF-8最多需要4个字节。三个字节仅包含BMP(前64K代码点)。“”和其他字符只需要2个字节。但有些字符(实际上,在UTF-8中比其他字符更多)仍然需要3个字节。“”没有意义。不要推荐UTF-16;它实际上是一种传统编码,在BMP之后跳到4字节。[续]东亚用户要么坚持传统编码(其常用字符仅使用两个字节),要么不担心浪费字节,或者(如果是中文)使用非传统GB18030(这是一个UTF和早期编码的超集,仍然只使用2个字节作为常用字符)。感谢您的输入,我了解了更多关于Unicode的知识,并改进了我的答案。您确实需要4个字节才能获得满足(1)对所有17个Unicode平面的支持(2)ASCII兼容性和(3)自同步的编码。