7

どうやら、私はPython2.7でそれを行うことができます:

value = '國華'

Pythonは、文字列リテラルの文字をバイト文字列にエンコードするためにエンコーディングを使用しているようです。そのエンコーディングは何ですか?それは、で定義されてsys.getdefaultencoding()いるエンコーディング、ソースファイルのエンコーディング、または他の何かですか?

ありがとう

4

2 に答える 2

7

getdefaultencodingソースファイルや端末のエンコーディングとは関係ありません。これは、バイト文字列を暗黙的に Unicode 文字列に変換するために使用されるエンコーディングであり、Python 2.X では常に 'ascii' (Python 3.X では 'utf8') である必要があります。

Python 2.X では、エンコーディングが宣言されていないスクリプト内のコード行でエラーが発生します。

SyntaxError: Non-ASCII character '\x87' in file ...

実際の非 ASCII 文字は異なる場合がありますが、エンコード宣言がないと機能しません。Python 2.X で非 ASCII 文字を使用するには、エンコーディング宣言が必要です。エンコーディング宣言は、ソース ファイルのエンコーディングと一致する必要があります。例えば:

# coding: utf8
value = '國華'

cp936 として保存すると、次のように生成されます。

SyntaxError: 'utf8' codec can't decode byte 0x87 in position 9: invalid start byte

エンコーディングが正しい場合、バイト文字列のバイトは文字通りソース ファイルにあるものであるため、文字のエンコードされたバイトが含まれます。Python が Unicode 文字列を解析するとき、バイトは宣言されたソース エンコーディングを使用して Unicode にデコードされます。cp936 コンソールで UTF-8 バイト文字列と Unicode 文字列を出力するときの違いに注意してください。

# coding: utf8
value = '國華'
print value,repr(value)
value = u'國華'
print value,repr(value)

出力:

鍦嬭彲 '\xe5\x9c\x8b\xe8\x8f\xaf'
國華 u'\u570b\u83ef'

バイト文字列には 2 つの文字の 3 バイト UTF-8 エンコーディングが含まれていますが、cp936 端末ではバイト シーケンスが認識されないため、正しく表示されません。Unicode は正しく出力され、文字列にはソース ファイルの UTF-8 バイトからデコードされた Unicode コード ポイントが含まれます。

端末に一致するエンコーディングを宣言して使用するときの違いに注意してください。

# coding: cp936
value = '國華'
print value,repr(value)
value = u'國華'
print value,repr(value)

出力:

國華 '\x87\xf8\xc8A'
國華 u'\u570b\u83ef'

バイト文字列の内容は、2 つの文字の 2 バイト cp936 エンコーディング ('\x41' に相当する 'A') になり、端末が cp936 バイト シーケンスを理解するため、正しく表示されます。Unicode 文字列には、前の例と同じ 2 文字の Unicode コード ポイントが含まれています。これは、ソース バイト シーケンスが宣言されたソース エンコーディングを使用して Unicode にデコードされたためです。

スクリプトに正しいソース エンコーディング宣言があり、テキストに Unicode 文字列を使用している場合、端末のエンコーディングに関係なく、正しい文字1が表示されます2UnicodeEncodeError間違った文字を表示するのではなく、端末がその文字をサポートしていない場合はをスローします。

最後の注意: Python 2.X は、別段の宣言がない限り、デフォルトで 'ascii' エンコーディングを使用し、エンコーディングがサポートしている場合、バイト文字列で非 ASCII 文字を許可します。Python 3.X のデフォルトは 'utf8' エンコーディングであり (そのエンコーディングで保存するか、別の方法で宣言してください)、バイト文字列に非 ASCII 文字を使用することはできません。

1端末フォントが文字をサポートしている場合。
2端末エンコーディングが文字をサポートしている場合。

于 2012-08-17T04:16:32.773 に答える
0
value = b'國華'

意味がありません( Python 2.xで暗示されています)-文字を含むバイト文字b列が必要なのはなぜですか?Pythonは、端末/エディターが使用するエンコードに関係なく、バイトを単純に再現します。必要なのは文字列です。

value = u'國華'

ソースコードファイル(インタラクティブシェルではなく)では、ファイルの先頭に次の行を追加して、エンコードを宣言することを忘れないでください。

# -*- coding: utf-8 -*-
于 2012-08-16T18:35:01.610 に答える