【问题标题】:Is there a way to specify which Unicode format is used in unicode encoding in python 2.7?有没有办法指定在 python 2.7 的 unicode 编码中使用哪种 Unicode 格式?
【发布时间】:2023-04-02 10:39:01
【问题描述】:

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

【问题讨论】:

  • 你的意思是源文件编码还是内存中python字符串的编码?
  • 一个python字符串

标签: python python-2.7 unicode


【解决方案1】:

所以,首先要做的是:您应该使用 Python 3,而不是 Python 2。

文本和unicode的处理是两个版本语言的主要区别,也是他们不得不做不兼容更改的真正原因,muchmuch 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

现在,如果您对此进行了一些测试并成功了,那么您最好在继续之前做两件事

  • 切换到使用 Python 3。此时 Python 2 已经过时 - 通过键入“python3”而不是“Python”来检查它是否尚未安装在您的系统中。如果不是,只需安装它 - 它可以与 Python2 并存

    • 阅读this article,了解当我们谈论编码中的unicode 时真正发生了什么。 (作者 Joel 是 Stackoverflow 本身的创始人,文章来自 2003 年)

【讨论】:

    【解决方案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)。但这是一个内部细节,一般来说不应该影响您的代码。

    【讨论】:

    • Python 2 中的默认编码是 ASCII,而不是 UTF-8。 u"..." 在内存中创建一个 Unicode 对象,但仍受 Python 对文件中存储的 bytes 的解释。
    • @chepner,你对 ASCII 的看法是对的,我会解决的。至于 unicode 文字,那是我的“注 3”
    猜你喜欢
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 2012-03-23
    • 2011-01-07
    • 2013-02-06
    • 1970-01-01
    相关资源
    最近更新 更多