Unicode文字列とは正確には何ですか?
通常の文字列とUnicode文字列の違いは何ですか?
Utf-8とは何ですか?
Python今すぐに学習しようとしていますが、この流行語を聞き続けています。以下のコードは何をしますか?
i18n文字列(Unicode)
> ustring = u'A unicode \u018e string \xf1'
> ustring
u'A unicode \u018e string \xf1'
## (ustring from above contains a unicode string)
> s = ustring.encode('utf-8')
> s
'A unicode \xc6\x8e string \xc3\xb1' ## bytes of utf-8 encoding
> t = unicode(s, 'utf-8') ## Convert bytes back to a unicode string
> t == ustring ## It's the same as the original, yay!
True
ファイルUnicode
import codecs
f = codecs.open('foo.txt', 'rU', 'utf-8')
for line in f:
# here line is a *unicode* string
この答えはPython 2.でPython 3、str
はUnicode文字列です。
Pythonのstr
タイプは、8ビット文字のコレクションです。英語のアルファベットはこれらの8ビット文字を使用して表現できますが、±、♠、Ω、ℑなどの記号は表現できません。
nicodeは、幅広い文字を扱うための標準です。各シンボルにはコードポイント(数値)があり、これらのコードポイントはさまざまなエンコードを使用してエンコード(バイトシーケンスに変換)できます。
TF-8はそのようなエンコーディングの1つです。低コードポイントは単一バイトを使用してエンコードされ、高コードポイントはバイトのシーケンスとしてエンコードされます。
Pythonのunicode
タイプは、コードポイントのコレクションです。行_ustring = u'A unicode \u018e string \xf1'
_は、20文字のUnicode文字列を作成します。
Pythonインタープリターがustring
の値を表示すると、標準の印刷可能範囲にないため、2つの文字(Ǝおよびñ)をエスケープします。
s = unistring.encode('utf-8')
行は、UTF-8を使用してUnicode文字列をエンコードします。これにより、各コードポイントが適切なバイトまたはバイトのシーケンスに変換されます。結果はバイトのコレクションであり、str
として返されます。 s
のサイズは22バイトです。これは、2つの文字のコードポイントが高く、1バイトではなく2バイトのシーケンスとしてエンコードされるためです。
Pythonインタープリターがs
の値を表示すると、印刷可能な範囲にない4バイトをエスケープします(_\xc6
_、_\x8e
_、_\xc3
_、および_\xb1
_)。s
はstr
ではなくunicode
型であるため、2つのバイトのペアは以前のように単一の文字として扱われません。
行t = unicode(s, 'utf-8')
はencode()
の反対を行います。 s
のバイトを調べ、バイトシーケンスを解析することにより、元のコードポイントを再構築します。結果はUnicode文字列です。
codecs.open()
の呼び出しは、エンコーディングとして_utf-8
_を指定します。これは、ファイルの内容(バイトのコレクション)をUnicode文字列として解釈するようにPython UTF-8を使用してエンコードされています。