2

辞書からキー (英語) をランダムに出力し、ユーザーが値 (ドイツ語) を入力する必要がある小さな Python ゲームを作成することを計画しています。値が正しければ、「正しい」と出力されて続行します。値が間違っている場合、「wrong」と出力されて壊れます。

これは簡単な作業だと思っていましたが、途中で行き詰まってしまいました。私の問題は、ドイツ語の文字を印刷する方法がわからないことです。次のテキストを含むファイル 'dictionary.txt' があるとします。

cat:Katze
dog:Hund
exercise:Übung
solve:lösen
door:Tür
cheese:Käse

そして、出力がどのように見えるかをテストするためだけに、このコードがあります:

# -*- coding: UTF-8 -*-
words = {} # empty dictionary
with open('dictionary.txt') as my_file:
  for line in my_file.readlines():
    if len(line.strip())>0: # ignoring blank lines
      elem = line.split(':') # split on ":"
      words[elem[0]] = elem[1].strip() # appending elements to dictionary
print words

明らかに、印刷の結果は期待どおりではありません。

    {'cheese': 'K\xc3\xa4se', 'door': 'T\xc3\xbcr',
     'dog': 'Hund', 'cat': 'Katze', 'solve': 'l\xc3\xb6sen',
     'exercise': '\xc3\x9cbung'}

では、エンコーディングをどこに追加し、どのように行うのでしょうか?

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

4

2 に答える 2

5

repr()辞書に含まれているため、結果として出力されたバイト文字列値を見ています。文字列表現は Python 文字列リテラルとして再利用でき、印刷不可および非 ASCII 文字は文字列エスケープ シーケンスを使用して表示されます。コンテナーの値は、repr()デバッグを容易にするために常に で表されます。

したがって、文字列 'K\xc3\xa4se' には、U+00E4 コードポイントの UTF-8 コンボである 16 進値 C3 と A4 を持つ 2 つの非 ASCII バイトが含まれます。

値をオブジェクトにデコードする必要があります。unicode

with open('dictionary.txt') as my_file:
    for line in my_file:   # just loop over the file
        if line.strip(): # ignoring blank lines
            key, value = line.decode('utf8').strip().split(':')
            words[key] = value

またはさらに良いのはcodecs.open()、ファイルを読み取ったときにファイルをデコードするために使用します。

import codecs

with codecs.open('dictionary.txt', 'r', 'utf8') as my_file:
    for line in my_file:
        if line.strip(): # ignoring blank lines
            key, value = line.strip().split(':')
            words[key] = value

repr()結果の辞書を印刷すると、コンテンツの結果が引き続き使用されるため、文字である Unicode ポイント 00E4 のエスケープ コードであるu'cheese': u'K\xe4se'ため、代わりに表示されます。実際の文字を端末に書き込みたい場合は、個々の単語を出力します。\xe4ä

print words['cheese']

しかし、正しいエンコーディングを知っていれば、これらの値をデコードした他のデータと比較し、それらを操作して、使用する必要のあるターゲットコーデックに再度エンコードすることができます。printたとえば、端末にユニコード値を出力するときに、これを自動的に行います。

Unicode と Python について読みたいと思うかもしれません:

于 2013-07-20T11:32:11.453 に答える