0

我正在阅读一个包含来自许多不同国家/地区的 unicode 字符的文本文件。文件中的数据也是 JSON 格式。

我正在使用 CentOS 机器。当我在终端中打开文件时,unicode 字符显示得很好(所以我的终端配置为 unicode)。

当我在 Eclipse 中测试我的代码时,它工作正常。当我在终端中运行我的代码时,它会抛出一个错误:UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 17: ordinal not in range(128)

for line in open("data-01083"):
    try:
        tmp = line
        if tmp == "":
            break
        theData = json.loads(tmp[41:]) 

        for loc in theData["locList"]:
            outLine = tmp[:40] 
            outLine = outLine + delim + theData["names"][0]["name"]
            outLine = outLine + delim + str(theData.get("Flagvalue"))
            outLine = outLine + delim + str(loc.get("myType"))
            flatAdd = ""
            srcAddr = loc.get("Address")
            if srcAddr != None:
                flatAdd = delim + str(srcAddr.get("houseNumber"))
                flatAdd = flatAdd + delim + str(srcAddr.get("streetName"))
                flatAdd = flatAdd + delim + str(srcAddr.get("postalCode"))
                flatAdd = flatAdd + delim + str(srcAddr.get("CountryCode"))
            else:
                 flatAdd = delim + "None" + delim + "None" + delim +"None" + delim +"None" + delim +"None"

            outLine = outLine + FlatAdd

            sys.stdout.write(("%s\n" % (outLine)).encode('utf-8'))
    except:
        sys.stdout.write("Error Processing record\n")

所以一切正常,直到它到达 StreetName,它与 UnicodeDecodeError 一起崩溃,这是非 ascii 字符开始出现的地方。

我可以通过添加 .encode('utf-8') 来修复该实例:

 flatAdd = flatAdd + delim + str(srcAddr.get("streetName").encode('utf-8'))

但随后它在下一行出现 UnicodeDecodeError 崩溃:

outLine = outLine + FlatAdd

一个月来,我一直在纠结这些类型的问题。任何反馈将不胜感激!!

4

2 回答 2

1

Robᵩ ( http://nedbatchelder.com/text/unipain.html ) 的介绍真的帮助我理解了 unicode。强烈推荐给任何有 unicode 问题的人。

我的外卖:

  • 将所有内容转换为 unicode,然后将其摄取到您的应用程序中。
  • 在您的代码中仅使用 unicode 字符串
  • 从应用程序输出数据时指定编码。

对我来说,我正在从标准输入和一个文件读取并输出到标准输出:

对于标准输入:

inData = codecs.getreader('utf-8')(sys.stdin)

对于一个文件:

inData = codecs.open("myFile","r","utf-8")

对于标准输出(在向标准输出写入任何内容之前执行一次):

sys.stdout = codecs.getwriter('utf-8')(sys.stdout)
于 2013-03-28T14:37:18.277 回答
1

这可能会解决您的问题。我说可能是因为编码有时会发生奇怪的事情;)

#!/usr/bin/python
# -*- coding: utf-8 -*-

text_file_utf8 = text_file.encode('utf8')

从这一点开始,您应该摆脱这些消息。如果不是这样,请就您拥有的文件类型和语言提供反馈。也许一些文件头数据。

text_file.decode("ISO-8859-1")也可能是一个解决方案。

如果一切都失败了,看看codecs()这里;http://docs.python.org/2/library/codecs.html

with codecs.open('your_file.extension', 'r', 'utf8') as indexKey:
    pass
    # Your code here
于 2013-03-26T20:11:58.603 回答