如何理解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。
我已经阅读了 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。