Pythonはさみ文字(9986-✂)を使用するスクリプトに取り組んでいます。コードをMacに移植しようとしていますが、このエラーが発生しています。
IDLE(Python 3.2.5-OS X 10.4.11 iBook G4 PPC)から実行するとシザー文字は問題なく表示され、Ubuntu 13.10ではコードは完全に動作しますが、端末でこれを実行しようとするとこのエラー/トレースバック:
_Traceback (most recent call last):
File "snippets-convert.py", line 352, in <module>
main()
File "snippets-convert.py", line 41, in main
menu()
File "snippets-convert.py", line 47, in menu
print ("|\t ",snipper.decode(),"PySnipt'd",snipper.decode(),"\t|")
UnicodeEncodeError: 'ascii' codec can't encode character '\u2702' in position 0: ordinal not in range(128)
_
そして、私に問題を与えているコード:
print ("|\t ",chr(9986),"PySnipt'd",chr(9986),"\t|")
これは、端末にその文字を表示する機能がないことを通知しませんか?私はこれが古いシステムであることを知っていますが、現在使用しなければならない唯一のシステムです。 OSの年齢がプログラムに干渉している可能性はありますか?
私はこれらの質問を読みました:
nicodeEncodeError: 'ascii'コーデックは、位置0で文字u '\ xef'をエンコードできません:範囲(128)にない序数 -別の文字
"UnicodeEncodeError: 'ascii' codec ca n't encoding character" -2.6を使用しているため、適用されるかどうかわからない
nicodeEncodeError: 'ascii'コーデックは文字をエンコードできませんか? -私の問題に対するもっともらしい解決策であると思われる、.encode('UTF-8')
、エラーは表示されません。ただし、必要な文字ではなく文字コードが表示され、.decode()
は同じエラーを表示します。私がこれを正しくやっているかどうかはわかりません。
nicodeEncodeError: 'ascii'コーデックは0-6の位置に文字をエンコードできません:範囲(128)にない序数 -これが当てはまるかどうかわからない、彼はGUIを使用して入力を取得し、すべてギリシャ語で。
このエラーの原因は何ですか?それは、システム/ OSの時代、Pythonのバージョン、またはプログラミングエラーですか?
[〜#〜] edit [〜#〜]:このエラーは、この重複する問題で後で発生します(そのまま追加すると思っただけです)同じプログラム内で同じエラーです):
_Traceback (most recent call last):
File "snippets-convert.py", line 353, in <module>
main()
File "snippets-convert.py", line 41, in main
menu()
File "snippets-convert.py", line 75, in menu
main()
File "snippets-convert.py", line 41, in main
menu()
File "snippets-convert.py", line 62, in menu
search()
File "snippets-convert.py", line 229, in search
print_results(search_returned) # Print the results for the user
File "snippets-convert.py", line 287, in print_results
getPath(toRead) # Get the path for the snippet
File "snippets-convert.py", line 324, in getPath
snipXMLParse(path)
File "snippets-convert.py", line 344, in snipXMLParse
print (chr(164),child.text)
UnicodeEncodeError: 'ascii' codec can't encode character '\xa4' in position 0: ordinal not in range(128)
_
編集:
私は端末の文字設定に行きましたが、実際にはその文字をサポートしています(このスクリーンショットでわかるように:
端末に挿入すると、_\342\234\202
_が出力され、押すと Enter これを取得:_-bash: ✂: command not found
_
[〜#〜] edit [〜#〜]@ J.Fとしてコマンドを実行しました。セバスチャンは尋ねた:
_python3 test-io-encoding.py
_:
_PYTHONIOENCODING: None
locale(False): US-ASCII
device(stdout): US-ASCII
stdout.encoding: US-ASCII
device(stderr): US-ASCII
stderr.encoding: US-ASCII
device(stdin): US-ASCII
stdin.encoding: US-ASCII
locale(False): US-ASCII
locale(True): US-ASCII
_
_python3 -S test-io-encoding.py
_:
_PYTHONIOENCODING: None
locale(False): US-ASCII
device(stdout): US-ASCII
stdout.encoding: US-ASCII
device(stderr): US-ASCII
stderr.encoding: US-ASCII
device(stdin): US-ASCII
stdin.encoding: US-ASCII
locale(False): US-ASCII
locale(True): US-ASCII
_
[〜#〜] edit [〜#〜]@PauloBuが提供する「ハッカー的」ソリューションを試してみました。
ご覧のとおり、これにより1つ(はい!)はさみが発生しましたが、新しいエラーが発生しています。トレースバック/エラー:
_+-=============================-+
✂Traceback (most recent call last):
File "snippets-convert.py", line 357, in <module>
main()
File "snippets-convert.py", line 44, in main
menu()
File "snippets-convert.py", line 52, in menu
print("|\t "+sys.stdout.buffer.write(chr(9986).encode('UTF-8'))+" PySnipt'd "+ sys.stdout.buffer.write(chr(9986).encode('UTF-8'))+" \t|")
TypeError: Can't convert 'int' object to str implicitly
_
[〜#〜] edit [〜#〜]@PauloBuの修正結果を追加:
_+-=============================-+
|
✂ PySnipt'd
✂ |
+-=============================-+
_
[〜#〜] edit [〜#〜]:
そして彼の修正のための彼の修正:
_+-=============================-+
✂✂| PySnipt'd |
+-=============================-+
_
_test_io_encoding.py
_ 出力は、locale
設定を変更する必要があることを示しています(例:_LANG=en_US.UTF-8
_を設定します)。
最初のエラーは、すでにUnicodeである文字列をデコードしようとしていることが原因である可能性があります。 Python 2は、デフォルトの文字エンコーディング(_'ascii'
_)を使用してエンコードしようとしますbeforeを使用してデコードします(おそらく)異なる文字エンコーディングエラーはencode
ステップで発生します:
_>>> u"\u2702".decode() # Python 2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2702' in position 0: ordinal not in range(128)
_
Python 3.の代わりにPython 2を使用してスクリプトを実行しているようです。3。
_>>> "\u2702".decode() # Python 3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'decode'
_
それ以外の場合は異なるエラー。
.decode()
呼び出しをドロップするだけです:
_print("|\t {0} PySnipt'd {0} \t|".format(snipper))
_
2番目の問題は、Unicode文字列をパイプに出力するためです。
_$ python3 -c'print("\u2702")'
✂
$ python3 -c'print("\u2702")' | cat
Traceback (most recent call last):
File "<string>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character '\u2702' in position 0: ordinal not in range(128)
_
目的に適したPYTHONIOENCODING
環境変数を設定します。
_$ PYTHONIOENCODING=utf-8 python3 -c'print("\u2702")' | cat
✂
_
端末はこれを表示しています:_
| b'\xe2\x9c\x82' PySnipt'd b'\xe2\x9c\x82' |
_
snipper
がbytes
オブジェクトである場合、snipper.decode()
呼び出しを残します。
_$ python3 -c"print(b'\xe2\x9c\x82'.decode())"
✂
$ python3 -c"print(b'\xe2\x9c\x82'.decode())" | cat
Traceback (most recent call last):
File "<string>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character '\u2702' in position 0: ordinal not in range(128)
_
修正は同じです:
_$ PYTHONIOENCODING=utf-8 python3 -c"print(b'\xe2\x9c\x82'.decode())" | cat
✂
_
私のロケールはde_AT.UTF-8に設定されていますが、/etc/profile
が欠落していました。
export LANG=de_AT.UTF-8
export LANGUAGE=de_AT.UTF-8
export LC_ALL=de_AT.UTF-8
ログアウト/ログインし、問題を解決する必要があります
すべてのロケールが正しく設定されているかどうかを確認するには、ターミナルにlocale
と入力します
出力は次のようになります。
LANG=de_AT.UTF-8
LANGUAGE=de_AT.UTF-8
LC_CTYPE="de_AT.UTF-8"
LC_NUMERIC="de_AT.UTF-8"
LC_TIME="de_AT.UTF-8"
LC_COLLATE="de_AT.UTF-8"
LC_MONETARY="de_AT.UTF-8"
LC_MESSAGES="de_AT.UTF-8"
LC_PAPER="de_AT.UTF-8"
LC_NAME="de_AT.UTF-8"
LC_ADDRESS="de_AT.UTF-8"
LC_TELEPHONE="de_AT.UTF-8"
LC_MEASUREMENT="de_AT.UTF-8"
LC_IDENTIFICATION="de_AT.UTF-8"
LC_ALL=de_AT.UTF-8