【Python】Unicodeコードポイントと文字を相互変換する方法【入門第49回】

162, 2019-09-09

目次

Unciodeコードポイントと文字を相互変換する

こんにちは、narupoです。

今回はUnicodeコードポイントと文字を相互に変換する方法を解説します。
Unicodeコードポイントってなに? と思った方もご安心ください。この記事で解説します。

文字からUnicodeコードポイントを得たい場合はord関数を使います。

Unicodeコードポイントから文字を得たい場合はchr関数を使います。

この記事では具体的には↓を見ていきます。

  • Unicodeコードポイントとは?

  • ord関数で文字のUnicodeコードポイントを得る

  • chr関数でUnicodeコードポイントから文字を得る

  • アルファベットの一覧を得る

Unicodeコードポイントとは?

パソコンでは文字はどのように表現されているのでしょうか?
パソコンは基本的には01の2進数しか理解できません。
よってパソコンは文字も数値として理解しています。

たとえば皆さんがエディタで文字を打ち込むと、そこには文字が表示されていますが、パソコンはそれを数値として扱っています。
よって、パソコンが皆さんに文字を表示するには、皆さんに表示する文字と数値との対応を持っていなければいけません。

この文字と数値との対応を取るために、パソコンは2つの対応を使います。
その2つが以下です。

  • 符号化文字集合

  • 文字符号化方式

文字符号化集合とは、文字とコードポイントと呼ばれる数値との対応表です。
そして文字符号化方式とはそのコードポイントと実際の数値の列との対応表です。
なぜ2つの対応表を使うのかはちゃんとした理由があるのですが、ここでは解説しません。

符号化文字集合にはいろいろ種類があって、その中で一般的に使われているのがUnicodeと呼ばれるものです。
つまり、Unicodeコードポイントというのは、このUnicodeのコードポイントということですね。

例えばUnicodeでは、ひらがなの「」は12354(16進数で3042)というコードポイントが割り当てられています。

文字符号化方式にも色々種類があり、有名なのはShift-JISUTF-8EUC-JPなどです。
最近のプログラミングで一般的によく使われるのはUTF-8です。

例えばひらがなの「」という文字列をecnodeメソッドを使ってUTF-8のバイト列にすると、

print('あ'.encode('utf-8'))

↓のようなバイト列が得られます。

b'\xe3\x81\x82'

以上から、ひらがの「」は↓のように対応が取られていることがわかります。

* 文字: あ
* 文字符号化集合: Unicode
- コードポイント: 12354
* 文字符号化方式: UTF-8
- バイト列: \xe3\x81\x82

」という文字からはUnicodeを参照した場合12354というコードポイントが得られ、12354というコードポイントをUTF-8で表現すると\xe3\x81\x82というバイト列が得られるということですね。

ord関数で文字のUnicodeコードポイントを得る

文字のUnicodeコードポイントを得るにはord関数を使います。
ord関数の第1引数に文字を渡します。

print(ord('あ'))

↑のコードの実行結果は↓のようになります。

12354

↑の結果から、「」という文字は12354というUnicodeコードポイントが割り当てられていることがわかります。

chr関数でUnicodeコードポイントから文字を得る

Unicodeコードポイントから文字を得るにはchr関数を使います。
chr関数の第1引数にUnicodeコードポイントを渡します。

print(chr(12354))

↑のコードの実行結果は↓のようになります。

アルファベットの一覧を得る

ord関数やchr関数を使うことで簡単にアルファベットの一覧を作ることができます。
たとえば↓のようにです。

alphas = ''
for i in range(ord('A'), ord('Z')+1):
    alphas += chr(i)

print(alphas)

↑のコードの実行結果は↓のようになります。

ABCDEFGHIJKLMNOPQRSTUVWXYZ

↑のコードの理屈ですが、UnicodeではアルファベットのAからZは連続したコードポイントで対応付けられています。

そのため↑のようにfor文でアルファベットのA ~ Zまで回すことで、A ~ Zまでのアルファベットを作ることができるのです。
小文字のa ~ zも得たい場合は↓のようにします。

alphas = ''
for i in range(ord('A'), ord('Z')+1):
    alphas += chr(i)

alphas += '\n'
for i in range(ord('a'), ord('z')+1):
    alphas += chr(i)

print(alphas)

↑のコードの実行結果は↓のようになります。

ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz

↑のコードで注意したいのは、Zaの間はアルファベットのコードポイントが連続していないということです。
そのためfor文を2つ回しています。

もっとも、大文字のアルファベットの列と一緒に小文字のアルファベットの列を得たい場合は↓のようにした方が簡単でしょう。

alphas = ''
for i in range(ord('A'), ord('Z')+1):
    alphas += chr(i)

alphas += '\n' + aplhas.lower()

print(alphas)

↑のコードの実行結果は先ほどと同じになります。

おわりに

ord関数やchr関数はUnicodeコードポイントと文字を相互変換できる関数です。
知っておくとCUIなどのアプリを作るときに役立つかもしれません。
また、Unicodeと触れ合うのにちょうどいい関数です。
文字コードへの理解を深めたい場合はこれらの関数を使ってみましょう。

以上、次回に続きます。

また見てね

スポンサーリンク

スポンサーリンク

スポンサーリンク

スポンサーリンク