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

如何在python中找到正确的编码?,python,unicode,encoding,Python,Unicode,Encoding,我正在努力去除文本文件中的变音符号。我用工具将pdf转换成文本,而不是自己制作的。我无法理解他们使用哪种编码。文本是用西班牙语书写的,正字法上熟悉西班牙语 我将文本转换为字符串列表。不,我正在尝试执行以下操作: # check whether there is a not-ascii character in the item def is_ascii(word): check = string.ascii_letters + "." if word not

我正在努力去除文本文件中的变音符号。我用工具将pdf转换成文本,而不是自己制作的。我无法理解他们使用哪种编码。文本是用西班牙语书写的,正字法上熟悉西班牙语

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

# 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版本。到目前为止,它还不起作用,我尝试了几种编码,比如拉丁文1、cp1252、iso-8859-1。我得到的是谁能告诉我我做错了什么

如何找到正确的编码

谢谢大家!

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


谢谢你的帮助

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

就像@delnan在评论中说的,我希望你知道编码。如果没有,那么一旦您修复了所使用的函数,猜测就应该变得容易了

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

编辑您的问题以显示您正在使用的Python版本。根据代码猜测版本是不可能的。您使用的是Python3.X还是2.X非常重要。下面的注释假设为Python2.x

您似乎已经确定有UTF-8编码的文本。尝试对文本进行解码('utf8')。注意解码,而不是编码

如果使用UTF-8进行解码不会引起UnicodeDecodeError,并且您的文本不是很短,那么UTF-8几乎可以确定是正确的编码

如果上述操作不起作用,请向我们显示打印报告(文本)的结果

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

在任何情况下,您的第一个函数都不会做您认为它会做的事情;对于长度为2或更多的任何输入字符串,它返回
False
。在编写单元测试功能时,请考虑;它使以后的调试速度大大加快

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

更新以回应OP的评论:

我使用Python2.7。如果我使用text.decode(“utf8”),它会引发以下问题 错误:UnicodeEncodeError:“latin-1”编解码器无法对字符进行编码 u'\u2014'位于位置0:序号不在范围(256)内

这可以通过两种方式实现:

(1) 在像
foo=text.decode('utf8')
这样的单个语句中,
text
已经是一个unicode对象了,因此Python 2.X尝试使用默认编码(拉丁语-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'
是一个“EM破折号”,在
cp1252
中是一个有效字符(但在
拉丁语-1
中不是,正如您从错误消息中看到的)。您使用的是什么版本的操作系统


回答最后一个问题,不,你不能试图用已知世界中的每一个编解码器来解码你的文本。你已经变得有道理了;某种东西(你的代码?)正在以某种方式解码某种东西——
u'\u2014'
的存在就足以证明这一点。只需向我们展示您的代码及其结果。

请参见Ned Batchelder。生活事实4(“你无法推断字节的编码;你必须被告知,否则你必须猜测”)与此直接相关,但似乎你也可以使用其余部分。请注意,使用字符频率和组合统计信息的编码猜测库不太可能像英语一样适用于Nahuatal。不幸的是,大多数猜测编码的工作都集中在文档上,这些文档的文本是世界上少数几种主要语言之一。@user1986412:您能将您的文件用于分析吗?让我如此困惑的是,我将文本拆分为文字,并将其存储在列表中。在这个列表中似乎有utf-8。示例:word存储为:est\\xc3\\xa1n,但当我遍历列表并使用word作为项时,它将显示为:“str:están”,这为什么会让您感到惊讶?在
str
变量中保留UTF-8字符串没有什么错,只要您与过程保持一致