python文件:
# -*- coding: utf-8 -*-
print u"。"
print [u"。".encode('utf8')]
生产:
。
['xe3x80x82']
为什么python使用3个字符来存储我的1个句号?这真的很奇怪,如果你单独打印出来,它们也都是不同的。什么好主意吗?
在UTF-8中,三个字节(不是真正的字符)用于表示U+07FF和U+FFFF之间的代码点,例如这个字符,IDEOGRAPHIC FULL STOP (U+3002)。
尝试用od -x
转储脚本文件。您应该在这里找到用于表示字符的相同的三个字节。
UTF-8是一个多字节字符表示,因此非ASCII字符将占用多于一个字节。
在我看来是正确的UTF-8编码。有关UTF-8编码的解释请参阅此处。
最新版本的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在他的评论中建议的那样做,并使用设计为您的语言最大限度地节省空间的编码。