2013-02-22 45 views
2

我试图摆脱我的文本文件中的变音符号。我用一种工具将PDF转换为文本,而不是由我自己制作。我无法理解他们使用哪种编码。正文写在Nahuatl,与西班牙文正确熟悉。如何在python中找到正确的编码?

我将文本转换为字符串列表。不,我试图做到以下几点:

# 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了。所以约翰·马金在他的回答中对(1)是正确的。 正如我在一些评论中写道的,这在我看来并不清楚,因为在Eclipse调试器中,列表本身在unicodes中显示了一些符号,而其他的不是。如果我单独查看这些项目,他们都以某种方式解码,所以我实际上看到了unicode。

谢谢你的帮助!

+2

请参阅Ned Batchelder的[Pragmatic Unicode,或者,如何阻止疼痛?](http://nedbatchelder.com/text/unipain.html)。生活的事实#4(“你不能推断字节的编码;你必须被告知,或你必须猜测”)是直接相关的,但它似乎也可以使用其余的。 – delnan 2013-02-22 19:30:32

+0

请注意,使用关于字符频率和组合的统计信息的编码猜测库对于Nahuatl来说不可能像对英文那样起作用。不幸的是,大部分猜测编码的努力都集中在那些文本是少数主要世界语言之一的文档上。 – BrenBarn 2013-02-22 19:35:39

+0

@ user1986412:你可以让你的文件可用于分析吗? – 2013-02-22 23:36:16

回答

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个编码点,因此不可能得到text.decode('latin1')引起的UnicodeDecodeError。 “没有错误”是这种情况下诊断值完全为零。

响应从OP此评论更新

I use Python 2.7. If I use text.decode("utf8") it raises the following error: 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')其中text是UTF-8编码的str对象,这个说法不会引发错误,然后像print foo和你sys.stdout.encoding是latin-1(???)。

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

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

我再问一次:你能否让你的文件可用于分析?

顺便说一句,u'\u2014'是一个“破折号”,是一个有效的字符在cp1252(但不是在latin-1,因为你已经从错误消息中看到的)。你使用什么操作系统的版本?

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

+0

不,不幸的是我还没有想出编码。我使用Python 2.7。如果我使用文字。解码(“utf8”)它会引发以下错误: UnicodeEncodeError:'latin-1'编解码器无法编码字符u'\ u2014'在位置0:序号不在范围(256)中。 好的,所以它似乎不是utf8 - 我必须不随机检查每个可能的编码吗?喜欢在这个列表中找到:http://docs.python.org/2/library/codecs.html – Rattlesnake 2013-02-24 19:32:13

1

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

像@delnan在评论中说的,我希望你知道编码。如果不是这样,一旦修复了所使用的功能,猜测应该变得简单。

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

+0

让我感到困惑的是我用文字分割文本并将它们存储在列表中。并且在这个列表中似乎是utf-8。例如:单词存储为:est \\ xc3 \\ xa1n 但是,当我遍历列表并使用单词作为条目时,它将显示如下:“str:están” – Rattlesnake 2013-02-22 19:40:04

+0

为什么这会让您感到惊讶?只要符合处理它的要求,在'str'变量中保存UTF-8字符串没有什么问题。不过,使用内置的“unicode”类型可以使处理更加轻松。 – Kos 2013-02-22 20:16:13

相关问题