2

我正在尝试摆脱文本文件中的变音符号。我使用不是我自己制作的工具将 pdf 转换为文本。我无法理解他们使用哪种编码。文本是用Nahuatl写的,正字法上熟悉西班牙语。

我将文本转换为字符串列表。不,我正在尝试执行以下操作:

# check whether there is a not-ascii character in the item
def is_ascii(word):
    check = string.ascii_letters + "."
    if word not in check:
        return False
    return True

# if there is a not ascii-character encode the string 
def to_ascii(word):
    if is_ascii(word) == False:
        newWord = word.encode("utf8")
        return newWord
    return word

我想要得到的是我的字符串的 unicode 版本。到目前为止它不起作用,我尝试了几种编码,如 latin1、cp1252、iso-8859-1。我得到的是谁能告诉我我做错了什么?

我怎样才能找到正确的编码?

谢谢!

编辑:我写信给开发转换器(pdf-txt)的人,他们说他们已经在使用 unicode。所以 John Machin 在他的回答中是正确的 (1)。正如我在一些我不清楚的评论中所写的那样,因为在 Eclipse 调试器中,列表本身在 unicode 中显示了一些标志,而其他则没有。如果我分别查看这些项目,它们都以某种方式被解码,所以我实际上看到了 unicode。

感谢您的帮助!

4

2 回答 2

1

如果您已经读取了一些字节并想将它们解释为unicode字符串,那么您必须使用.decode()而不是encode().

就像@delnan 在评论中所说,我希望你知道编码。如果没有,一旦你修复了所使用的功能,猜测应该很容易。

顺便说一句,即使那个单词中只有 ASCII 字符,为什么也不.decode()呢?您将在unicode任何地方都有相同的数据类型 ( ),这将使您的程序更简单。

于 2013-02-22T19:34:35.890 回答
1

编辑您的问题以显示您正在使用的 Python 版本。无法从您的代码中猜测版本。无论您使用的是 Python 3.X 还是 2.X,都非常重要。以下评论假设 Python 2.x。

您似乎已经确定您拥有 UTF-8 编码的文本。试试the_text.decode('utf8')。注意解码,而不是编码。

如果使用 UTF-8 解码没有提高UnicodeDecodeError并且您的文本不是很短,那么非常接近确定 UTF-8 是正确的编码。

如果上述方法不起作用,请向我们展示print repr(the_text).

请注意,尝试检查文件是否以 ASCII 编码会适得其反——ASCII 是 UTF-8 的子集。在 Python 2.x 中将一些数据保留为str对象,而unicode将其他数据保留为混乱,并且在 Python 3.X 中不起作用

无论如何,您的第一个功能并没有按照您的想法执行;它返回False长度为 2 或更大的任何输入字符串。请在编写单元测试函数时考虑它们;它使以后的调试速度更快。

注意latin1iso-8859-1是相同的编码。由于latin1以相同的顺序对 Unicode 中的前 256 个代码点进行编码,因此不可能UnicodeDecodeError得到text.decode('latin1'). “无错误”是这种情况下的诊断值正好为零。

更新以响应 OP 的此评论:

我使用 Python 2.7。如果我使用 text.decode("utf8") 它会引发以下错误:UnicodeEncodeError: 'latin-1' codec can't encode character u'\u2014' in position 0: ordinal not in range(256).

这可以通过两种方式发生:

(1) 在单个语句中,如foo = text.decode('utf8'),已经text一个 unicode 对象,因此 Python 2.X 尝试使用默认编码 (latin-1 ???) 对其进行编码。

(2) 可能在两个不同的语句中,首先foo = text.decode('utf8')wheretext是一个str以 UTF-8 编码的对象,并且该语句不会引发错误,然后是类似的print foo内容,并且您的 sys.stdout.encoding 是latin-1(???)。

我无法想象你为什么“勾选”我的答案是正确的。还没有人知道问题是什么!

编辑您的问题以显示您的代码(print repr(text)在该行之前插入text.decode("utf8"))以及运行它的结果。显示 repr() 结果和完整的回溯(以便我们可以确定是哪一行导致了错误)。

我再问一次:你能把你的文件提供给分析吗?

顺便说一句,u'\u2014'是一个“EM DASH”并且是一个有效的字符cp1252(但不是 in latin-1,正如您从错误消息中看到的那样)。您使用的是什么版本的操作系统?

并且要回答您的最后一个问题,不,您不得尝试使用已知宇宙中的每个编解码器来解码您的文本。您已经获得了合理的 Unicode;某些东西(你的代码?)正在以某种方式解码某些东西——存在 u'\u2014'就足以证明这一点。只需向我们展示您的代码及其结果。

于 2013-02-22T22:54:39.763 回答