web-dev-qa-db-ja.com

Unicode文字列とは何ですか?

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
25

この答えは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_)。sstrではなくunicode型であるため、2つのバイトのペアは以前のように単一の文字として扱われません。

t = unicode(s, 'utf-8')encode()の反対を行います。 sのバイトを調べ、バイトシーケンスを解析することにより、元のコードポイントを再構築します。結果はUnicode文字列です。

codecs.open()の呼び出しは、エンコーディングとして_utf-8_を指定します。これは、ファイルの内容(バイトのコレクション)をUnicode文字列として解釈するようにPython UTF-8を使用してエンコードされています。

44
tom