私は現在、いくつかの中国語の文字をPinynに変換するコマンドを使用しています。これを行うには、bashの文字列をUnicodeで安全にし、結果を別の変数に入力する必要があります。次のコマンドをうまく実行できます。
chinese="你好"
to-pinyin.py $chinese
期待どおりに出力は印刷されますが、出力が変数に存在したいので、次のようにしました。
chinese="你好"
pinyin=$(to-pinyin.py $chinese)
Pythonは次のように失敗します。
Traceback (most recent call last):
File "/~/to-pinyin.py", line 31, in <module>
print pinyin.get(hanzi, delimiter=" ").capitalize()
UnicodeEncodeError: 'ascii' codec can't encode character u'\u01d0' in position 1: ordinal not in range(128)
バックティックでも同じことが起こります。出力をファイルに書き込んでそこから変換し、文字列を変数にロードすると問題が解決するようです。回避策を避けるためにこの問題を解決するにはどうすればよいですか?
編集する:
ここで、各リクエストはロケールの出力です。
$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
使用されたソリューション
答えと助けてくれてありがとう。この他の答え.encode('utf-8')
Pythonスクリプトで印刷文字列の末尾に追加されました。
Python3に切り替えることができればと思いますが、そこにはデフォルトのピンインパッケージがなく、Python3でタスクをすばやく完了できる良いピンインパッケージをインストールできないようです。しばらく試してみましたが、python3が私がインストールしたパッケージのインポートを拒否し続けたので、私はpython2にパッケージをインストールしましたが、すぐに機能しました。
答え1
これは問題です。Python 2print
、そしてPython 3の一貫したUnicode処理をサポートする根拠。
これでファイルにリダイレクトすると、なぜ問題が発生するのですか?このためです
print()
python2では特別に扱われます。そして、Pythonの他のファイルに似たオブジェクトは常に次のように変換されます。ASCIIコード特に設定しない限り、以下を使用してください。print()
端末への出力は、出力が端末に送信される前に、ユーザーのロケール設定を使用して変換されます。いつprint()
端末に出力しないでください(例:ファイルにリダイレクト)。print()
ファイルがどのロケールを使用しているのかわからないと判断し、次に変換しようとしました。ASCIIコード代わりに。