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

私は 1 か月間、この種の問題に悩まされてきました。どんなフィードバックでも大歓迎です!!

4

2 に答える 2

1

Robᵩ ( http://nedbatchelder.com/text/unipain.html ) からのプレゼンテーションは、Unicode を理解するのに本当に役立ちました。ユニコードの問題を抱えている人には強くお勧めします。

私の持ち帰り:

  • アプリに取り込むときに、すべてをユニコードに変換します。
  • コードでは Unicode 文字列のみを使用してください
  • アプリからデータを出力するときにエンコードを指定します。

私にとっては、標準入力とファイルから読み取り、標準出力に出力していました。

標準入力の場合:

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

ファイルの場合:

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

stdout の場合 (stdout に何かを書き込む前にこれを 1 回実行します):

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 に答える