如何理解unicode和utf-8

时间:2015-02-27 07:45:36

标签: python unicode utf-8

我已经阅读过来自w3schools的python docs和unicode教程的unicode方法,但我仍然不清楚将字符串转换为unicode和utf-8等编码。

据我所知,在ascii和latin-1字符集和编码中,当存储在文件中时,字符会转换为二进制表示。

我是否认为需要更多一个字节来表示的unicode字符使用utf-8等编码转换为二进制表示并存储在文件中并在读取它们时我必须使用utf-8编码进行解码它们。

现在我从一个网页上复制了一些unicode,并使用普通的open(“new.txt”,“w”)函数将其存储在一个文件中,并且它有效。这5个泰卢固语字符在该文件中占用30个字节。我能够读回这些。即使我没有指定utf-8编码,这种转换如何正确发生?

with open("new.txt") as file_2_read:
text = file_2_read.read()
print text, len(text), type(text)
utext = text.decode('utf-8')
with open("new1.txt", "w") as file_2_write:
    file_2_write.write(text)

$ python u1.py 
తెలుగులిపి 30 <type 'str'>
తెలుగులిపి 10 <type 'unicode>

1 个答案:

答案 0 :(得分:2)

with open("new.txt") as file_2_read:
    text = file_2_read.read()

print text, len(text), type(text)    # తెలుగులిపి 30 <type 'str'>

utext = text.decode('utf-8')
print utext, len(utext), type(utext) # తెలుగులిపి 10 <type 'unicode>

这就是这里发生的事情:

with open("new.txt") as file_2_read:
    text = file_2_read.read()

Python从文件中读取一些字节序列,它类似\xe0\xb0\xa4\xe0\xb1\x86...。此序列对应于原始字符串的utf8编码 - 但Python不知道这一点。它只是一大块字节。

print text, len(text)

Python将这些字节直接发送到控制台。您的控制台编码也恰好是utf8,因此您可以看到正确的字符。 &#39; text&#39;中有30个字节,因此有&#34; 30&#34;。

utext = text.decode('utf-8')

我们将字节转换为unicode并获取包含10个unicode字符的字符串。这基本上是一个&#34;代码点&#34; (=数字)。

print utext, len(utext)

现在,要打印unicode字符串,Python需要将其转换回字节。它使用sys.stdout.encoding,恰好是utf8,生成一些字节序列(再次\xe0\xb0\xa4\xe0\xb1\x86...)并将其发送到控制台。 utext中有10个代码点,因此有&#34; 10&#34;。

注意:以上内容仅适用于python2,而不适用于py3。