web-dev-qa-db-ja.com

Python 3ペルシア語/アラビア語文字のprint()関数

理解を深めるためにコードを簡略化しました。ここに問題があります:

ケース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の結果:

?????? ??? ??????

エラーなしで実行されます。

スクリーンショット:

enter image description here

65001をデフォルトの文字セットとして設定する方法の詳細については、 this outを確認してください。

12
Soorena

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

いくつかのポイント

  • python 3.でu"aaa"構文を使用する必要はありません。3。文字列リテラルはデフォルトでユニコードです。
  • python 3では、ファイルのデフォルトのコーディングはUTF8なので、コーディング宣言コメント(# -*- coding: utf-8 -*-など)は必要ありません。
6

出力は基本的に、コードを実行するプラットフォームと端末によって異なります。 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(印刷)で成功しています。だから...寓話の教訓...あなたのツールについてもっと知り、あなたのユースケースのためにそれらを適切に設定する方法を学んでください;-)

4
BPL

問題を再現できません。これが私のスクリプト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
1
aluriak

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を確認してください。

0
Maettel