所以我想在python 2.7脚本中用Unicode编码一些值。我想知道是否可以指定要使用的Unicode类型,即UTF-8与UTF-32。除此之外,在python 2.7中支持哪些编码还有什么限制,以及如何确定默认编码?
答案 0 :(得分:0)
因此,首先要做的是:您应该使用Python 3,而不是Python 2。
文本和unicode的处理是这两种语言之间的主要区别,并且是它们必须进行不兼容更改的真正原因,这是 much , much 在Python 3中更简单。
这意味着要在Python 2中谈论unicode,您必须了解某些事情-unicode用来表示 text :字符,而与这些字符具有的基本表示方式无关。
在Python 2程序中,在程序本身中键入的所有文本都必须使用前缀为“ u”的字符串键入,例如u"..."
或u'...'
-否则,这些字符串被视为“字节字符串”-仅就像在C代码中一样。 (或者,可以将from __future__ import unicode_literals
放在文件的第一行或第二行中,因此这是自动完成的。
否则,从文本文件,数据库连接,入站HTTP请求读入程序的所有数据通常将在Python2中以 byte 字符串的形式获取,并且必须显式转换为文本字符串(即在Python 2中称为“ unicode对象”)。这是通过调用bytes-string .decode
方法来完成的,您将第一个参数传递给这些字节的编码名称用作该参数。也就是说,如果您有从utf-8
编码文件中读取的数据,则可以通过执行以下操作将其解码为文本:
data = data.decode("utf-8") # and so on for other encodings.
此外,如果您在Python2文件的源代码中键入任何非ascii字符,无论该字符位于字符串内(例如,位于注释内),都必须在文件的第一行。
这是通过语言解析器以特殊方式处理的Python注释完成的-第一个LoC应该包含:
# encoding: utf-8
(当然,您应该键入程序编辑器实际用于存储文件的编码。此外,还可以使用此标记的某些变体,例如使用“ coding”而不是编码,“:”是可选的,等等)
所以-我在前面的 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
现在,如果您对此进行了一些测试并成功了,那么您最好做两件事,然后再继续进行下去:
切换为使用Python3。在这一点上,Python 2确实过时了-通过键入“ python3”而不是“ Python”来检查它是否尚未安装在系统中。如果不是,只需安装它-它可以与Python2并存
答案 1 :(得分:-2)
在python 2中,字符串默认为ASCII。您可以对它们进行解码并重新编码。 支持的编码可以在这里找到:https://docs.python.org/2/library/codecs.html#standard-encodings
这是一个例子:
a = "my string" # a is ASCII encoded bytes
b = u"my string" # b is unicode, not encoded
c = a.decode() # c is unicode, not encoded, by default decoding ASCII, you can specify otherwise as an argument
d = c.encode('utf-32') # d is utf-32 encoded bytes
print type(a) # output: <type 'str'>
print type(b) # output: <type 'unicode'>
print type(c) # output: <type 'unicode'>
print type(d) # output: <type 'str'>
注1:在python 3中有些不同。
注意2:为了在脚本中编写非ascii文字(也就是说,如果您想将a = "☂"
作为代码的一部分来编写,而不是让a
只是一个包含您所获得数据的变量, (从某处)),您必须在文件顶部声明编码,更多信息here。在python 2中,文字代码只接受一小部分unicode字符。 (当然,您不受限制)。
注意3:当然,虽然您不对unicode类型进行编码,但python内部会对其进行编码(如果我没记错的话,可以将其编码为utf-32)。但这是一个内部细节,通常不应该影响您的代码。