如何理解unicode和utf-8

How to understand unicode and utf-8

我已经阅读了 python 文档中的 unicode 操作方法和 w3schools 中的 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>
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,因此您会看到正确的字符。 'text'中有30个字节,所以有"30".

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

我们将bytes转换成unicode,得到一个包含10个unicode字符的字符串。这基本上是一个数组 "codepoints" (=numbers).

print utext, len(utext)

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

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