ここでは、文字列がPython3においてどのように使われているかという点についてみていきましょう。
コンピューターは1と0しか認識できない
まず、文字を理解するためには、コンピューターの原理について少し知っておく必要があります。
コンピューターは0と1の二種類しか認識することができません。1と0のどちらかを表しているものをビットといいます。そして、ビットが8つ集まったものが1バイトと呼ばれています。
そうすると、2つの情報(1か0)しか保持できないと思うかもしれませんが、実際には、ビットを組み合わせることによって、多くのデータを扱うことができるようになっています。
例えば、2ビットを使うことによって、00、01、10、11と4種類のデータを作ることができます。
そして、このデータと文字列を関連付けることによって、文字を表示できるようにしているのです。
英語は26種類の文字がありますが、たとえば、aを00に、bを01に、cを10にという形で、一つの文字に対して一種類の数字を割り当てていくのです。
(実際はこのような対応関係ではありません。)
そうすることで、例えばabcという文字列を、コンピューターは00 01 10という形で理解することができるのです。
文字と数字を関連付けたものが文字コード
次に、文字コードについてみていきましょう。
先程の例では、aに00をわり当て、bに01をわり当てました。
ただ、世界にはたくさんのコンピューターメーカーがあり、それぞれの会社が独自にこの関連付けをすることができます。
A社では、aが10かもしれませんし、B社ではaが11かもしれません。
これでは、異なるコンピューター間でコミュニケーションを取ることができなくなってしまいます。
そこで、国際的にいくつかの文字コード(2進数と文字の対応表)が作られることになりました。
ちなみに、日本で良く使われる文字コードはUTF-8です。
Python3では、unicodeが使われている
では、Pythonではどのような文字コードが使われているのでしょうか?
実は、Python3で使われる文字コードはunicodeと呼ばれるもので、これは文字コードではなく、unicode文字列と言われています。
つまり、unicodeというのは、00 01といった形で、コンピューターが理解できるような機械語と一対一の関係ではありません。
イメージとしては、コンピューターが理解することができる機械語(00 01といった文字コード)→Pythonが理解することができるunicode文字列→人間が理解することができるstr型の文字列。
という形で、人が認識できる文字列とコンピューターが理解できる機械語の間に、unicodeという文字列が入っているのです。
実際にunicode文字列を表示してみる。
Pythonにおいては、文字列とunicodeは一対一の関係であり、どちらを使っても正しく表現することができます。
実際の例で、文字列とunicode文字列が入っている文字を見てみましょう。
コードname = "caf\u00e9"
print(name)
\はエスケープシーケンスです。エスケープシーケンスの使い方が分からない方は、エスケープシーケンスという記事を参考にして下さい。
このコードを実行した結果はこのようになります。
アウトプットcafé
このコードは、このように書いても同じです。
コードname = "ca\u0066\u00e9"
つまり、Pythonから見れば、unicodeであっても文字列であっても(それらは一対一の関係なので)理解することができるのです。
英語と日本語をしゃべれる人は、どちらの言葉で話かけられても理解できるのと同じ考え方です。
unicodeに変換する方法
ここで、文字列をunicodeに変換する方法についてお伝えします。
unicodeをエンコード(コンピューターが理解できる言葉に翻訳)するには、encode関数を使います。
実際のコードで確認してみましょう。
コードunicodestring = '\u0066'
utf8encoding = unicodestring.encode('utf-8')
アウトプットb'f'
bはバイト列ということを意味しているので、バイト列に変換されたことが分かります。
Python3での文字列の扱いのまとめ
(1) Python3では、unicode文字列が使われている
(2) unicode文字列は機械が理解できる二進数ではない
Python3での文字列の扱いについて学んだあとは
Pythonのコードの書き方のガイドラインであるPEP8(Pythonで文章を書く時のルール)について学んでみるとよいかもしれません。