6

次のようなutf-8ヘッダーを持つダミーのPythonモジュールがあります。

# -*- coding: utf-8 -*-
a = "á"
print type(a), a

どちらが印刷されますか:

<type 'str'> á

しかし、utf-8 として宣言された Python モジュール内のすべての文字列リテラルは、自動的に ではなく 型unicodeになると思いましたstr。何か不足していますか、それともこれは正しい動作ですか?

a私が使用するユニコード文字列として取得するために:

a = u"á"

しかし、これは非常に「礼儀正しく」、実用的ではないようです。より良いオプションはありますか?

4

3 に答える 3

6
# -*- coding: utf-8 -*-

文字列リテラルを Unicode にしません。この例を見てみましょう。アラビア語のコメントと文字列を含むファイルがあり、ファイルは utf-8 です。

# هذا تعليق عربي
print type('نص عربي')

SyntaxError実行すると、例外がスローされます。

SyntaxError: Non-ASCII character '\xd9' in file file.py
on line 2, but no encoding declared;
see http://www.python.org/peps/pep-0263.html for details

したがって、これを許可するには、その行を追加して、ファイルが UTF-8 でエンコードされていることをインタープリターに伝える必要があります。

# -*-coding: utf-8 -*-

# هذا تعليق عربي
print type('نص عربي')

今は正常に動作しますが<type 'str'>、文字列を Unicode にしない限り、まだ印刷されます。

# -*-coding: utf-8 -*-

# هذا تعليق عربي
print type(u'نص عربي')
于 2013-11-04T15:35:11.230 に答える
5

いいえ、一番上のコーデックは Python にソース コードの解釈方法を通知するだけで、そのコーデックを使用して Unicode リテラルを解釈します。リテラルのバイト文字列を Unicode 値に変換しません。PEP 263が述べているように:

この PEP は、Python ソース ファイルのエンコーディングを宣言する構文を導入することを提案しています。エンコーディング情報は、指定されたエンコーディングを使用してファイルを解釈するために、Python パーサーによって使用されます。最も注目すべきは、これによりソース コード内の Unicode リテラルの解釈が強化され、Unicode 対応エディターで直接 UTF-8 などを使用して Unicode リテラルを記述できるようになることです。

鉱山を強調します。

コーデック宣言がなければ、Python は非 ASCII 文字を解釈する方法がわかりません:

$ cat /tmp/test.py 
example = '☃'
$ python2.7 /tmp/test.py 
  File "/tmp/test.py", line 1
SyntaxError: Non-ASCII character '\xe2' in file /tmp/test.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

Python が期待どおりに動作した場合、ASCII 以外のバイト値を含むバイト文字列値をリテラルにすることもできません。

端末が UTF-8 値を表示するように設定されている場合、UTF-8 でエンコードされたバイト文字列を出力すると「正しく」見えますが、エンコーディングが一致するという幸運によるものです。

Unicode 値を取得する正しい方法は、Unicode リテラルを使用するか、別の方法で Unicode を生成することです (バイト文字列からのデコード、整数コードポイントの Unicode 文字への変換など)。

unicode_snowman = '\xe2\x98\x83'.decode('utf8')
unicode_snowman = unichr(0x2603)

Python 3 では、名前に ASCII 範囲外の文字と数字を使用できるため、コーデックは変数名の解釈方法にも適用されます。Python 2 の ASCII とは対照的に、Python 3 のデフォルトのコーデックは UTF-8 です。

于 2013-11-04T15:26:48.770 に答える
2

いいえ、これは単なるソース コードのエンコーディングです。http://www.python.org/dev/peps/pep-0263/を参照して ください。

ソース コードのエンコーディングを定義するには、次のように、ファイルの 1 行目または 2 行目にマジック コメントをソース ファイルに配置する必要があります。

      # coding=<encoding name>

or (using formats recognized by popular editors)

      #!/usr/bin/python
      # -*- coding: <encoding name> -*-

or

      #!/usr/bin/python
      # vim: set fileencoding=<encoding name> :

これは、すべてのリテラルをユニコードにするわけではなく、ユニコード リテラルをデコードする方法を示すだけです。

unicodeリテラルをユニコードとして設定するには、関数またはuプレフィックスを使用する必要があります。

注意 Python3 では、すべての文字列が Unicode です。

于 2013-11-04T15:30:21.347 に答える