【问题标题】:Encoding error using Python使用 Python 编码错误
【发布时间】:2013-01-26 22:03:39
【问题描述】:

我写了一段代码来连接imap,然后解析body信息并插入数据库。但是我在口音方面遇到了一些问题。

从电子邮件标题中我得到了以下信息:

内容类型:文本/html; charset=ISO-8859-1

但是,我不确定我是否可以相信这些信息......

这封电子邮件是用葡萄牙语写的,所以我们有很多带有口音的单词。例如,我从电子邮件源代码中提取以下短语(使用我的浏览器):

“...安装电子产品...”

所以,我连接到 imap 并获取了一些电子邮件:

... 典型值,数据 = M.fetch(num, '(RFC822)') ...

当我打印内容时,我得到以下单词:

print data[0][1]
instala+º+úo de eletr+¦nicos

我尝试使用.decode('utf-8'),但没有成功。

instalação de eletrônicos

我怎样才能使它成为人类可读的?我的数据库是 utf-8 格式。

【问题讨论】:

  • print(type(data[0][1])); print(repr(data[0][1])) 打印什么?
  • @WinstonEwert - Python 2.7
  • @MartijnPieters - 输入: 和 "print(repr(" 以下列格式返回重音符号:fun\xc3\xa7\xc3\xa3o(抱歉,这是另一个重音词)
  • 不,这正是我想看到的。那是 UTF8 中的 função.decode('utf8') 应该可以工作,也许您需要向我们展示更多代码?
  • @MartijnPieters,我试过: print repr(data[0][1]).decode('utf8') 但仍然显示“fun\xc3\xa7\xc3\xa3o”(你是对的关于解码词“功能”)

标签: python encoding character-encoding non-ascii-characters


【解决方案1】:

感谢 Martijn Pieters。我们发现电子邮件有两种不同的编码。我不得不分开这部分并单独对待。

【讨论】:

    【解决方案2】:

    指定源代码编码对我有用。这是下面我的示例代码顶部的代码。这应该在你的 python 文件的顶部定义。

    #!/usr/bin/python
    # -*- coding: iso-8859-15 -*-
    
    value = """...instalação de eletrônicos...""".decode("iso-8859-15")
    print value
    # prints: ...instalação de eletrônicos...
    
    import unicodedata
    value = unicodedata.normalize('NFKD', value).encode('ascii','ignore')
    print value
    # prints: ...instalacao de eletronicos...
    

    现在您也可以毫无例外地执行 str(value)。

    见:http://docs.python.org/2/library/unicodedata.html

    这似乎保留了所有重音:

    #!/usr/bin/python
    # -*- coding: iso-8859-15 -*-
    import unicodedata
    value = """...instalação de eletrônicos...""".decode("iso-8859-15")
    value = unicodedata.normalize('NFKC', value).encode('utf-8')
    print value
    print str(value)
    
    # prints (without exceptions/errors):
    # ...instalação de eletrônicos...
    # ...instalação de eletrônicos...
    

    编辑:

    请注意,对于上一个版本,即使结果看起来相同,它也不会返回等于 True。例如:

    #!/usr/bin/python
    # -*- coding: iso-8859-15 -*-
    import unicodedata
    inValue = """...instalação de eletrônicos...""".decode("iso-8859-15")
    normalizedValue = unicodedata.normalize('NFKC', inValue).encode('utf-8')
    
    try:
        print inValue == normalizedValue
    except UnicodeWarning:
        pass
    # False
    

    EDIT2:

    这会返回相同的结果:

    normalizedValue = unicode("""...instalação de eletrônicos...""".decode("iso-8859-15")).encode('utf-8')
    print normalizedValue 
    print str(normalizedValue )
    
    # prints (without exceptions/errors):
    # ...instalação de eletrônicos...
    # ...instalação de eletrônicos...
    

    虽然我不确定这对于 utf-8 编码的数据库是否真的有效。应该不会吧?

    【讨论】:

      【解决方案3】:

      标头说它正在使用“ISO-8859-1”字符集。所以你需要用那个编码解码字符串。

      试试这个:

      data[0][1].decode('iso-8859-1')
      

      【讨论】:

      • 这不会导致 OP 看到双字节。让我们看看我对数据类型和代表的要求给了我们什么,好吗?
      • 返回以下错误:UnicodeEncodeError: 'charmap' codec can't encode character u'\x83' in position 20: character maps to
      猜你喜欢
      • 1970-01-01
      • 2015-02-04
      • 2019-01-18
      • 2011-03-14
      • 2014-10-22
      • 2016-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多