有没有办法指定在python 2.7的unicode编码中使用哪种Unicode格式?

时间:2019-06-18 12:15:34

标签: python python-2.7 unicode

所以我想在python 2.7脚本中用Unicode编码一些值。我想知道是否可以指定要使用的Unicode类型,即UTF-8与UTF-32。除此之外,在python 2.7中支持哪些编码还有什么限制,以及如何确定默认编码?

2 个答案:

答案 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并存

    • 阅读this article,以了解我们在编码中讨论unicode时的实际情况。 (作者Joel是Stackoverflow本身的创始人,该文章摘自2003年)

答案 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)。但这是一个内部细节,通常不应该影响您的代码。