如何在python中找到正确的编码?

时间:2013-02-22 19:26:55

标签: python unicode encoding

我正试图摆脱文本文件中的变音符号。我用工具将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。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

如果您已阅读了一些字节并希望将其解释为unicode字符串,那么您必须使用.decode()而不是encode()

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

顺便说一句,即使该单词中只有ASCII字符,为什么不.decode()呢?你到处都有相同的数据类型(unicode),这将使你的程序更简单。

答案 1 :(得分: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的子集。将一些数据作为str对象而另一些作为unicode在Python 2.x中是混乱的,并且不能在Python 3.X中工作

无论如何,你的第一个功能并没有做你认为它做的事情;对于长度为2或更长的任何输入字符串,它返回False。在编写时请考虑单元测试功能;它会在以后更快地调试。

请注意,latin1iso-8859-1编码相同。由于latin1以相同的顺序对Unicode中的前256个代码点进行编码,因此UnicodeDecodeError无法获得text.decode('latin1')。 "没有错误"在这种情况下诊断价值确切为零。

更新以回应OP的评论:

  

我使用的是Python 2.7。如果我使用text.decode(" utf8"),则会引发以下情况   错误:UnicodeEncodeError:' latin-1'编解码器无法对字符进行编码   ü' \ u2014'位置0:序数不在范围内(256)。

这可能有两种方式:

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

(2)可能在两个不同的语句中,首先foo = text.decode('utf8')其中text是以UTF-8编码的str对象,并且此语句不会引发错误,接下来是print foo,你的sys.stdout.encoding是latin-1(???)。

我无法想象为什么你有#34;勾选"我的回答是正确的。没有人知道这个问题是什么!

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

我再问一遍:你能把你的文件用于分析吗?

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

要回答您的上一个问题,不,您不得尝试使用已知Universe中的每个编解码器解码文本。您已经获得了合理的Unicode;某事(你的代码?)以某种方式解码某事 - u'\u2014'的存在就足以证明这一点。只需告诉我们您的代码及其结果。