所以,首先要做的是:您应该使用 Python 3,而不是 Python 2。
文本和unicode的处理是两个版本语言的主要区别,也是他们不得不做不兼容更改的真正原因,much,much em> 在 Python 3 中更直接。
这意味着要在 Python 2 中谈论 unicode,您必须了解某些事情 - unicode 用于表示 text:字符,无论这些字符具有何种底层表示。
在 Python 2 程序中,在程序本身中键入的所有文本都必须以“u”为前缀的字符串键入,例如 u"..." 或 u'...' - 否则字符串被视为“字节字符串” - 就像在C 代码。 (或者,可以将from __future__ import unicode_literals 放在文件的第一行或第二行,这样会自动完成。
否则,从文本文件、数据库连接、入站 HTTP 请求读入程序的所有数据通常会在 Python2 中以 byte 字符串的形式获取,并且必须显式转换为文本字符串(即 Python 2 中的“unicode objects”)在被处理之前。这是通过调用 bytes-string .decode 方法来完成的 - 您将用于这些字节的编码名称作为第一个参数传递给它。也就是说,如果您有从utf-8 编码文件中读取的数据,则可以通过以下操作将其解码为文本:
data = data.decode("utf-8") # and so on for other encodings.
此外,如果您在 Python2 文件的源代码中键入任何非 ascii 字符,无论它是否在字符串中(或者,例如,在注释中),您都必须在文件的第一行。
这是通过语言解析器以特殊方式处理的 Python 注释完成的 - 第一个 LoC 应包含:
# encoding: utf-8
(当然,你应该输入你的程序编辑器实际使用的编码来存储文件。此外,这个标记的一些变体是允许的,因为写“编码”而不是编码,“:”是可选的,等等)
所以 - 我在前面的 5 段落中描述的内容在 Python 3 中自动发生。但如果您一直跟进,您现在已经有了一个正在运行的程序,其中包含要处理的文本。如您所见,您没有在问题中提到如何您要以不同的方式输入此文本。
因此,就像您将输入字节显式转换为内存中的 unicode 字符串一样,现在您可以使用 .encode 方法将文本转换回您想要的任何文本编码。
如果您有一些文本要写入以 utf-32 little endian 编码的文本文件,您可以这样做:
with open("myfile.txt", "wt") as file_:
file_.write(data.encode("utf-32 LE"))
根据 Eran 的回答,列出了有效的文本编解码器:
https://docs.python.org/2/library/codecs.html#standard-encodings
现在,如果您对此进行了一些测试并成功了,那么您最好在继续之前做两件事: