どうやら、私はPython2.7でそれを行うことができます:
value = '國華'
Pythonは、文字列リテラルの文字をバイト文字列にエンコードするためにエンコーディングを使用しているようです。そのエンコーディングは何ですか?それは、で定義されてsys.getdefaultencoding()
いるエンコーディング、ソースファイルのエンコーディング、または他の何かですか?
ありがとう
どうやら、私はPython2.7でそれを行うことができます:
value = '國華'
Pythonは、文字列リテラルの文字をバイト文字列にエンコードするためにエンコーディングを使用しているようです。そのエンコーディングは何ですか?それは、で定義されてsys.getdefaultencoding()
いるエンコーディング、ソースファイルのエンコーディング、または他の何かですか?
ありがとう
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が表示されます2。UnicodeEncodeError
間違った文字を表示するのではなく、端末がその文字をサポートしていない場合はをスローします。
最後の注意: Python 2.X は、別段の宣言がない限り、デフォルトで 'ascii' エンコーディングを使用し、エンコーディングがサポートしている場合、バイト文字列で非 ASCII 文字を許可します。Python 3.X のデフォルトは 'utf8' エンコーディングであり (そのエンコーディングで保存するか、別の方法で宣言してください)、バイト文字列に非 ASCII 文字を使用することはできません。
1端末フォントが文字をサポートしている場合。
2端末エンコーディングが文字をサポートしている場合。
value = b'國華'
意味がありません( Python 2.xで暗示されています)-文字を含むバイト文字b
列が必要なのはなぜですか?Pythonは、端末/エディターが使用するエンコードに関係なく、バイトを単純に再現します。必要なのは文字列です。
value = u'國華'
ソースコードファイル(インタラクティブシェルではなく)では、ファイルの先頭に次の行を追加して、エンコードを宣言することを忘れないでください。
# -*- coding: utf-8 -*-