Unicodeサポート—ドキュメントをクリックします

提供:Dev Guides
Click/docs/8.0.x/unicode-support
移動先:案内検索

Unicodeサポート

Clickは、さまざまな環境でUnicodeテキストをサポートするために特別な注意を払う必要があります。

  • Unixのコマンドラインは伝統的にバイトであり、Unicodeではありません。 エンコードのヒントはありますが、これが機能しない場合があります。 最も一般的なものは、異なるロケールのマシンへのSSH接続です。

    設定を誤った環境では、サロゲートエスケープのラウンドトリップがサポートされていないため、さまざまなUnicodeの問題が発生する可能性があります。 これはClick自体では修正されません!

  • 標準の入出力は、デフォルトでテキストモードで開かれます。 クリックは、特定の状況でバイナリモードでストリームを再度開く必要があります。 これを行う標準的な方法がないため、常に機能するとは限りません。 主に、これはコマンドラインアプリケーションをテストするときに問題になる可能性があります。

    これはサポートされていません:

    sys.stdin = io.StringIO('Input here')
    sys.stdout = io.StringIO()

    代わりに、これを行う必要があります。

    input = 'Input here'
    in_stream = io.BytesIO(input.encode('utf-8'))
    sys.stdin = io.TextIOWrapper(in_stream, encoding='utf-8')
    out_stream = io.BytesIO()
    sys.stdout = io.TextIOWrapper(out_stream, encoding='utf-8')

    その場合、ラッパーはそのメソッドを転送しないため、バッファの内容にアクセスする場合は、sys.stdout.getvalue()ではなくout_stream.getvalue()を使用する必要があることに注意してください。

  • sys.stdinsys.stdout、およびsys.stderrは、デフォルトでテキストベースです。 Clickがバイナリストリームを必要とする場合、基になるバイナリストリームを検出しようとします。

  • sys.argvは常にテキストです。 これは、Clickの型への入力値のネイティブ型がバイトではなくUnicodeであることを意味します。

    これは、端末が正しく設定されておらず、Pythonがエンコーディングを認識しない場合に問題を引き起こします。 その場合、Unicode文字列には、サロゲートエスケープとしてエンコードされたエラーバイトが含まれます。

  • ファイルを処理する場合、Clickは常にオペレーティングシステムの報告または推測されたファイルシステムエンコーディングを使用してUnicodeファイルシステムAPIを使用します。 ファイル名はサロゲートでサポートされているため、環境が正しく構成されていなくても、 File タイプでファイルを開くことができるはずです。

代理処理

Clickは、標準ライブラリ内のすべてのUnicode処理を実行し、その動作の影響を受けます。 Unicodeには特別な注意が必要です。 これは、エンコーディングの検出がインタプリタで行われ、Linuxやその他の特定のオペレーティングシステムでは、エンコーディングの処理に問題があるためです。

フラストレーションの最大の原因は、initシステム、展開ツール、またはcronジョブによって呼び出されたClickスクリプトが、Unicodeロケールがエクスポートされない限り機能しないことです。

Clickがそのような環境に遭遇した場合、それ以上の実行が妨げられ、ロケールの設定が強制されます。 これが行われるのは、クリックが呼び出されるとシステムの状態を認識できず、PythonのUnicode処理が開始される前に値を復元できないためです。

このようなエラーが表示された場合:

Traceback (most recent call last):
  ...
RuntimeError: Click will abort further execution because Python was
  configured to use ASCII as encoding for the environment. Consult
  https://click.palletsprojects.com/unicode-support/ for mitigation
  steps.

あなたはPythonがあなたがASCIIデータに制限されていると考える環境を扱っています。 これらの問題の解決策は、コンピューターが実行されているロケールによって異なります。

たとえば、ドイツ語のLinuxマシンを使用している場合は、ロケールをde_DE.utf-8にエクスポートすることで問題を修正できます。

export LC_ALL=de_DE.utf-8
export LANG=de_DE.utf-8

米国のマシンを使用している場合は、en_US.utf-8が最適なエンコーディングです。 一部の新しいLinuxシステムでは、ロケールとしてC.UTF-8を試すこともできます。

export LC_ALL=C.UTF-8
export LANG=C.UTF-8

一部のシステムでは、UTF-8UTF8と記述する必要があり、その逆もあると報告されています。 サポートされているロケールを確認するには、locale -aを呼び出すことができます。

Pythonスクリプトを呼び出す前に、値をエクスポートする必要があります。

Python 3.7以降では、 PEP 538 および PEP 540 のおかげで、多くの場合RuntimeErrorを取得できなくなります。 ]、未構成の環境でのデフォルトの仮定を変更しました。 これは、ロケールが正しく構成されていない可能性があるという一般的な問題を変更するものではありません。