2

テキストファイルの発音区別符号を削除しようとしています。自分で作成したのではなく、ツールを使用して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

私が取得したいのは、私の文字列のユニコードバージョンです。これまでは機能せず、latin1、cp1252、iso-8859-1などのいくつかのエンコーディングを試しました。私が得たのは、誰かが私が間違ったことを教えてもらえますか?

どうすれば正しいエンコーディングを見つけることができますか?

ありがとうございました!

編集:私はコンバーター(pdf-txt)を開発した人々に手紙を書きました、そして彼らは彼らがすでにユニコードを使っていると言いました。したがって、ジョン・マチンは彼の答えに(1)が正しかった。Eclipseデバッガーでは、リスト自体がユニコードでいくつかの兆候を示していたのに、そうでないものもあったため、私にはわかりませんでした。そして、アイテムを別々に見ると、それらはすべて何らかの方法でデコードされているので、実際にユニコードを見ました。

ご協力ありがとうございました!

4

2 に答える 2

1

いくつかのバイトを読み取って、それらを文字列として解釈したい場合は、ではなく.unicodeを使用する必要があります。.decode()encode()

@delnanがコメントで言ったように、エンコーディングを知っていただければ幸いです。そうでない場合は、使用されている関数を修正すると、当て推量は簡単になります。

ところで、その単語にASCII文字しかない場合でも、それもそうではないのはなぜ.decode()ですか? どこでも同じデータ型 ( unicode) を使用すると、プログラムが簡単になります。

于 2013-02-22T19:34:35.890 に答える
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 のサブセットです。Python 2.x ではいくつかのデータをstrオブジェクトとして残し、他のデータをそのまま残すことunicodeは厄介であり、Python 3.X では機能しません。

いずれにせよ、あなたの最初の関数はあなたが思っていることをしません。False長さが 2 以上の入力文字列に対して返されます。関数を記述するときは、関数の単体テストを検討してください。後でデバッグするのがずっと速くなります。

latin1iso-8859-1は同じエンコーディングであることに注意してください。latin1は最初の 256 コードポイントを Unicode で同じ順序でエンコードするため、 によって発生することは不可能UnicodeDecodeErrorですtext.decode('latin1')。「エラーなし」とは、このケースの診断値が正確にゼロであることです。

OP からのこのコメントに応じて更新します。

Python 2.7 を使用しています。text.decode("utf8") を使用すると、次のエラーが発生します: UnicodeEncodeError: 'latin-1' codec can't encode character u'\u2014' in position 0: ordinal not in range(256).

これは、次の 2 つの方法で発生する可能性があります。

(1) のような単一のステートメントではfoo = text.decode('utf8')text既に Unicode オブジェクトであるため、Python 2.X はデフォルトのエンコーディング (latin-1 ???) を使用してエンコードしようとします。

(2) おそらく 2 つの異なるステートメントで、最初foo = text.decode('utf8')に wheretextstrUTF-8 でエンコードされたオブジェクトであり、このステートメントはエラーを発生させません。その後にprint foo、sys.stdout.encoding is latin-1(???) のようなものが続きます。

なぜあなたが私の答えを正しいと「チェック」したのか想像できません。質問の内容はまだ誰も知りません!

質問を編集して、コード (行print repr(text)の直前に挿入text.decode("utf8")) と実行結果を表示してください。repr() の結果と完全なトレースバックを表示します (エラーの原因となっている行を特定できるようにするため)。

もう一度お尋ねします。あなたのファイルを分析できるようにしていただけますか?

ちなみに、u'\u2014'は「EM DASH」であり、 では有効な文字ですcp1252(ただしlatin-1、エラー メッセージからわかるように、 では有効ではありません)。使用しているオペレーティング システムのバージョンは何ですか?

最後の質問に答えるには、いいえ、既知の宇宙のすべてのコーデックを使用してテキストをデコードしようとしてはいけません。あなたはすでにもっともらしいUnicodeを手に入れています。何か (あなたのコード?) が何らかの方法で何かをデコードしています - の存在 u'\u2014'はその十分な証拠です。コードとその結果を見せてください。

于 2013-02-22T22:54:39.763 に答える