理解を深めるためにコードを簡略化しました。ここに問題があります:
ケース1:
# -*- coding: utf-8 -*-
text = "چرا کار نمیکنی؟" # also using u"...." results the same
print(text)
出力:
UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-2: character maps to <undefined>
ケース2:
text = "چرا کار نمیکنی؟".encode("utf-8")
print(text)
出力はありません。
ケース 3:
import sys
text = "چرا کار نمیکنی؟".encode("utf-8")
sys.stdout.buffer.write(text)
出力:
چرا کار نمیکنی؟
ケース3はなんとか機能することは知っていますが、print()、write(str())などの関数を使用したいと思います。
Unicodeに関するpython 3のドキュメント here も読みます。
また、stackoverflowで数十のQ&Aを読んでください。
そして ここ はpython 2.Xの問題と答えを説明する長い記事です
簡単な質問は:
python print()function?を使用してペルシア語やアラビア語などの非ASCII文字を印刷する方法
update 1:多くの人から問題がターミナルに関係していることが示唆されているので、私がケースをテストしました:
ケース4:
text = "چرا کار نمیکنی؟" .encode("utf-8")# also using u"...." results the same
print(text)
ターミナル :
python persian_encoding.py > test.txt
test.txt:
b'\xda\x86\xd8\xb1\xd8\xa7 \xda\xa9\xd8\xa7\xd8\xb1 \xd9\x86\xd9\x85\xdb\x8c\xda\xa9\xd9\x86\xdb\x8c\xd8\x9f'
非常に重要な更新:
しばらくしてこの問題を試しましたが、ついにcmd.exeにその仕事をさせる別の回避策を見つけました(ConEmuなどのサードパーティソフトウェアを必要とせずに...):
最初に少し説明:
私たちの主な問題はPythonには関係ありません。これは、Windowsのコマンドプロンプト文字セットの問題です(完全な説明については、Armanの回答を参照してください)。Windowsコマンドプロンプトの文字セットをデフォルトのasciiではなくUTF-8に変更すると、コマンドプロンプトを使用できるようになります。 UTF-8文字(ペルシア語やアラビア語など)と対話するために、このソリューションは文字の適切な表現を保証しません(小さな正方形のように印刷されるため)が、ファイルI/Oを=にしたい場合は良い解決策ですpython UTF-8文字。
手順:
開始する前にpythonコマンドラインから、次のように入力します:
chcp 65001
pythonコードをいつものように実行します。
python testcode.py
ケース1の結果:
?????? ??? ??????
エラーなしで実行されます。
スクリーンショット:
65001をデフォルトの文字セットとして設定する方法の詳細については、 this outを確認してください。
Python 2と3(私はOS Xを使っています)の両方で私のコンピューターで動作するので、コードは正しいです:
~$ python -c 'print "تست"'
تست
~$ python3 -c 'print("تست")'
تست
問題は、Unicode文字を出力できない端末にあります。出力をpython3 my_file.py > test.txt
のようなファイルにリダイレクトして検証し、エディターを使用してファイルを開くことができます。
Windowsを使用している場合、 Console2 または ConEm のようなターミナルを使用できます。これにより、Windowsプロンプトよりも優れたユニコードがレンダリングされます。
Windowsの誤ったコードページ/エンコーディングのために、これらの端末でもエラーが発生する場合があります。それらを修正する小さなpythonパッケージがあります(正しく設定します):
1-インストール thispip install win-unicode-console
2-これをあなたのpythonファイルの一番上に置きます:
try:
# Fix UTF8 output issues on Windows console.
# Does nothing if package is not installed
from win_unicode_console import enable
enable()
except ImportError:
pass
ファイルへのリダイレクト時にエラーが発生した場合は、ioエンコーディングを設定することで修正できます。
Windowsコマンドライン:
SET PYTHONIOENCODING=utf-8
Linux/OS X端末の場合:
export PYTHONIOENCODING=utf-8
u"aaa"
構文を使用する必要はありません。3。文字列リテラルはデフォルトでユニコードです。# -*- coding: utf-8 -*-
など)は必要ありません。出力は基本的に、コードを実行するプラットフォームと端末によって異なります。 2.xまたは3.xのいずれかで実行されているさまざまなWindows端末について、以下のスニペットを調べてみましょう。
# -*- coding: utf-8 -*-
import sys
def case1(text):
print(text)
def case2(text):
print(text.encode("utf-8"))
def case3(text):
sys.stdout.buffer.write(text.encode("utf-8"))
if __name__ == "__main__":
text = "چرا کار نمیکنی؟"
for case in [case1, case2, case3]:
try:
print("Running {0}".format(case.__name__))
case(text)
except Exception as e:
print(e)
print('-'*80)
Python 2.x
Sublime Text 3 3122
Running case1
'charmap' codec can't encode characters in position 0-2: character maps to <undefined>
--------------------------------------------------------------------------------
Running case2
b'\xda\x86\xd8\xb1\xd8\xa7 \xda\xa9\xd8\xa7\xd8\xb1 \xd9\x86\xd9\x85\xdb\x8c\xda\xa9\xd9\x86\xdb\x8c\xd8\x9f'
--------------------------------------------------------------------------------
Running case3
چرا کار نمیکنی؟--------------------------------------------------------------------------------
ConEmu v151205
Running case1
┌åÏ▒Ϻ ┌®ÏºÏ▒ ┘å┘à█î┌®┘å█îσ
--------------------------------------------------------------------------------
Running case2
'ascii' codec can't decode byte 0xda in position 0: ordinal not in range(128)
--------------------------------------------------------------------------------
Running case3
'file' object has no attribute 'buffer'
--------------------------------------------------------------------------------
Windowsコマンドプロンプト
Running case1
┌åÏ▒Ϻ ┌®ÏºÏ▒ ┘å┘à█î┌®┘å█îσ
--------------------------------------------------------------------------------
Running case2
'ascii' codec can't decode byte 0xda in position 0: ordinal not in range(128)
--------------------------------------------------------------------------------
Running case3
'file' object has no attribute 'buffer'
--------------------------------------------------------------------------------
Python 3.x
Sublime Text 3 3122
Running case1
'charmap' codec can't encode characters in position 0-2: character maps to <undefined>
--------------------------------------------------------------------------------
Running case2
b'\xda\x86\xd8\xb1\xd8\xa7 \xda\xa9\xd8\xa7\xd8\xb1 \xd9\x86\xd9\x85\xdb\x8c\xda\xa9\xd9\x86\xdb\x8c\xd8\x9f'
--------------------------------------------------------------------------------
Running case3
چرا کار نمیکنی؟--------------------------------------------------------------------------------
ConEmu v151205
Running case1
'charmap' codec can't encode characters in position 0-2: character maps to <undefined>
--------------------------------------------------------------------------------
Running case2
b'\xda\x86\xd8\xb1\xd8\xa7 \xda\xa9\xd8\xa7\xd8\xb1 \xd9\x86\xd9\x85\xdb\x8c\xda\xa9\xd9\x86\xdb\x8c\xd8\x9f'
--------------------------------------------------------------------------------
Running case3
┌åÏ▒Ϻ ┌®ÏºÏ▒ ┘å┘à█î┌®┘å█îσ--------------------------------------------------------------------------------
Windowsコマンドプロンプト
Running case1
'charmap' codec can't encode characters in position 0-2: character maps to <unde
fined>
--------------------------------------------------------------------------------
Running case2
b'\xda\x86\xd8\xb1\xd8\xa7 \xda\xa9\xd8\xa7\xd8\xb1 \xd9\x86\xd9\x85\xdb\x8c\xda
\xa9\xd9\x86\xdb\x8c\xd8\x9f'
--------------------------------------------------------------------------------
Running case3
┌åÏ▒Ϻ ┌®ÏºÏ▒ ┘å┘à█î┌®┘å█îσ----------------------------------------------------
----------------------------
ご覧のとおり、崇高なtext3ターミナル(case3)を使用するだけで問題ありません。他の端末はペルシャ語をサポートしていませんでした。ここでの要点は、使用している端末とプラットフォームによって異なります。
ソリューション(ConEmu固有)
ConEmuのような最新の端末では、UTF8-Encodingを ここで説明 として操作できるため、試してみましょう。
chcp 65001 & cmd
次に、2.xおよび3.xに対してスクリプトを再度実行します。
Python2.x
Running case1
��را کار نمیکنی؟[Errno 0] Error
--------------------------------------------------------------------------------
Running case2
'ascii' codec can't decode byte 0xda in position 0: ordinal not in range(128)
--------------------------------------------------------------------------------
Running case3
'file' object has no attribute 'buffer'
--------------------------------------------------------------------------------
Python3.x
Running case1
چرا کار نمیکنی؟
--------------------------------------------------------------------------------
Running case2
b'\xda\x86\xd8\xb1\xd8\xa7 \xda\xa9\xd8\xa7\xd8\xb1 \xd9\x86\xd9\x85\xdb\x8c\xda\xa9\xd9\x86\xdb\x8c\xd8\x9f'
--------------------------------------------------------------------------------
Running case3
چرا کار نمیکنی؟--------------------------------------------------------------------------------
ご覧のとおり、出力はpython3 case1(印刷)で成功しています。だから...寓話の教訓...あなたのツールについてもっと知り、あなたのユースケースのためにそれらを適切に設定する方法を学んでください;-)
問題を再現できません。これが私のスクリプトp.py
です。
text = "چرا کار نمیکنی؟"
print(text)
そしてpython3 p.py
の結果:
چرا کار نمیکنی؟
python 3を使用していますか?python2 p.py
を使用:
SyntaxError: Non-ASCII character '\xda' in file p.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
text.encode("utf-8")
- partを実行すると、_b'\xda\x86\xd8\xb1\xd8\xa7 \xda\xa9\xd8\xa7\xd8\xb1 \xd9\x86\xd9\x85\xdb\x8c\xda\xa9\xd9\x86\xdb\x8c\xd8\x9f'
_(私のマシンでは)と表示されます。
[〜#〜] edit [〜#〜]編集できませんでしたが、コメントできません(評判が不十分なため)
python 2.7でも、print(text)
は機能します。生成したばかりの this link hereを確認してください。