当我们将字符串写入文件时,为什么我们需要关心编码?

时间:2014-11-10 16:02:36

标签: python encoding

我阅读了Python2 Unicode HOWTOUnicode In Python, Completely Demystified以了解Python的Unicode系统,我遇到了类似的代码:

f = open('test.txt','w')
f.write(uni.encode('utf-8'))
f.close()

为什么unicode str在写入文件之前需要进行编码?

我知道默认编码是ASCII,因此会出错,因为超出范围。

但是当我把它写入文件时,是不是只是将RAM中uni的位复制到文件中,为什么程序需要关心编码?

1 个答案:

答案 0 :(得分:1)

Unicode字符是称为代码点的抽象实体,并且具有多种编码,例如UTF32,UTF16和UTF8。每个字符需要6个字节来表示单个实体中的所有字符(即使这样,unicode也有非间距字符,因此可以说大小更大)。为了让事情变得混乱,许多系统使用"代码页"在Unicode标准化之前存在的,它们是位和它们显示的字符之间的不同映射。

Python的unicode字符是RAM中的UTF16。所以马上我们看到了一个问题。如果你想写为UTF8,内存中的字符串将无法正常工作。 Python需要读取内存中的UTF16字符串并写入UTF8字符串。

另一个微妙的问题是基于英特尔的处理器是"小端"但Unicode多字节编码是" big endian" (意思是单词中的字节排序不同)。即使您想编写UTF-16,也必须进行更改。由于这个小/大的问题,通常在字符串的前面写一个BOM(字节顺序标记),以便编码器可以猜出格式。

字符可以用多种方式表示(编码),那么默认值应该是什么?这是一件历史性的事情。由于ACSII是历史记录(至少是unix历史记录),它仍然是默认值。

在编写非二进制数据时,我们总是需要通过某种编解码器。这是我们为多语言计算成熟和计算系统变得足够强大以应对它所花费的时间所付出的代价。我的Commodore 64无法处理Phoenician