如何在Python中将\xXY编码的字符转换为UTF-8?

6
我有一段文本,其中包含诸如“\xaf”、“\xbe”等字符,根据这个问题的理解,这些字符是ASCII编码的字符。
我想在Python中将它们转换为它们的UTF-8等价物。通常的string.encode("utf-8")会抛出UnicodeDecodeError异常。是否有更好的方法,例如使用codecs标准库?
样例200个字符在这里

你的样本中没有包含任何\xaf或类似字符。你有包含这些字符的样本吗? - dkarp
您的样本数据有效的UTF-8。使用“记录分隔符”和“单元分隔符”控制字符。 - dan04
根据 enca (http://linux.die.net/man/1/enca) 的说法,它是 UTF-8 编码,但被“非文本数据”所包围或穿插。 - Jindřich Mynarz
3个回答

3

.encode 的作用是将 Unicode 字符串(在 Python 2.x 中为unicode,在 Python 3.x 中为 str)转换为字节字符串(在Python 2.x中为str,在 Python 3.x 中为 bytes).

在 Python 2.x 中,可以对 str 对象调用 .encode 方法,Python 隐式地先解码该字符串到 Unicode:即 s.encode(e) 的效果就像你写成了 s.decode(sys.getdefaultencoding()).encode(e)

问题在于默认编码方式是 "ascii",而你的字符串包含非 ASCII 字符。你可以通过显式指定正确的编码方式来解决这个问题。

>>> '\xAF \xBE'.decode('ISO-8859-1').encode('UTF-8')
'\xc2\xaf \xc2\xbe'

这没问题,但是其余的文本都是以UTF-8编码的(至少enca报告是这样的)。因此,这个过程不能应用于整个文本。 - Jindřich Mynarz
2
那么\xXY字符是在ISO-8859-1中吗? - Jindřich Mynarz

3

你的文件已经是UTF-8编码文件了。

# saved encoding-sample to /tmp/encoding-sample
import codecs
fp= codecs.open("/tmp/encoding-sample", "r", "utf8")
data= fp.read()

import unicodedata as ud

chars= sorted(set(data))
for char in chars:
    try:
        charname= ud.name(char)
    except ValueError:
        charname= "<unknown>"
    sys.stdout.write("char U%04x %s\n" % (ord(char), charname))

手动填写未知名称:
字符 U000a 换行符
字符 U001e 信息分隔符二
字符 U001f 信息分隔符一


谢谢,你说得对,我提供的简短示例是UTF-8编码的。然而(不幸的是),整个文件中还有其他各种编码(主要是windows-1250)的部分。我通过尝试使用"string".decode()来解决这个问题,针对最常见的编码进行解码,如果一切都失败了,就使用chardet库来猜测编码。 - Jindřich Mynarz

2

这不是ASCII码(ASCII码只能到127;\xaf是175)。你需要先找出正确的编码,解码它,然后重新编码为UTF-8。

你能提供一个实际的字符串样例吗?那么我们可能可以猜到当前的编码。


那个样本对我来说看起来不像是编码文本,更像是一种专有格式。 - Tim Pietzcker
它应该采用MARC格式(http://www.loc.gov/marc/)。当我尝试使用“enca”检测其编码时,我得到的响应是它主要是UTF-8,夹杂着非文本字符。 - Jindřich Mynarz
所以它绝对不是文本格式/编码。这不是你可以通过正确编码解决的问题;你需要一个能够读取这个“数据库”的库。也许像这样的东西。 - Tim Pietzcker
是的,我已经在使用pymarc库来解析文件了。问题是它无法正确解析这些字符(\xaf...)。因此,在将文件传递给解析器之前,我正在尝试修复它。 - Jindřich Mynarz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接