Python 如何理解unicode和utf-8

Python 如何理解unicode和utf-8,python,unicode,utf-8,Python,Unicode,Utf 8,我已经阅读了python文档中的unicode操作指南和W3学校的unicode教程,但我仍然不清楚如何将字符串转换为unicode和utf-8之类的编码 我知道在ascii和latin-1字符集和编码中,字符在存储到文件中时会转换为二进制表示 我认为需要一个以上字节来表示的unicode字符会使用编码(如utf-8)转换为二进制表示,并存储在文件中,这样的想法正确吗?在读回这些字符时,我必须使用utf-8编码对其进行解码 现在我从网页上复制了一些unicodeతెలుగులిపి 并使用普通的

我已经阅读了python文档中的unicode操作指南和W3学校的unicode教程,但我仍然不清楚如何将字符串转换为unicode和utf-8之类的编码

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

我认为需要一个以上字节来表示的unicode字符会使用编码(如utf-8)转换为二进制表示,并存储在文件中,这样的想法正确吗?在读回这些字符时,我必须使用utf-8编码对其进行解码

现在我从网页上复制了一些unicodeతెలుగులిపి 并使用普通的open(“new.txt”,“w”)函数将其存储在一个文件中。这5个Telugu字符在该文件中占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>
打开(“new.txt”)作为文件读取:
text=file_2_read.read()
打印文本、len(文本)、type(文本)
utext=text.decode('utf-8')
打开(“new1.txt”、“w”)作为文件\u 2\u写入:
文件2_write.write(文本)
$python u1.py
తెలుగులిపి 30
తెలుగులిపి 10
Python从文件中读取一些字节序列,就像
\xe0\xb0\xa4\xe0\xb1\x86…
。这个序列对应于原始字符串的utf8编码——但Python对此一无所知。它只是一大块字节

print text, len(text)
Python将这些字节直接发送到控制台。您的控制台编码恰好也是utf8,因此您可以看到正确的字符。“文本”中有30个字节,所以有“30”

我们将字节转换为unicode,得到一个包含10个unicode字符的字符串。这基本上是一个“代码点”(=数字)数组

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


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

非常感谢georg!还有一件事;当我使用decode()将其转换为unicode时,那么这10个字符是unicode码点,而不是utf-8码点吗?我无法理解encode()和decode()的作用以及encode()的作用。你能提供一些能帮我澄清这一点的文本/书籍吗。再次感谢@阿努卡普:是的,“码点”只能是“unicode”,没有“utf-8”(或任何其他编码)码点。@阿努卡普:是的,令人困惑的东西。一定要阅读和阅读
with open("new.txt") as file_2_read:
    text = file_2_read.read()
print text, len(text)
utext = text.decode('utf-8')
print utext, len(utext)