Pythonのord()・chr()関数の基本と応用例|文字コード変換のすべて

Python

Pythonでプログラミングをしていると、「文字を数値として扱いたい」「数値を特定の文字に変換したい」と感じる場面はありませんか?

例えば、文字を1つずつずらして簡易的な暗号を作成したり、アルファベットを順番に処理したりする場合です。

この記事では、そんな願いを叶えるPythonの組み込み関数 ord()chr() について、初心者の方にも分かりやすく解説します。

この記事を読めば、以下のことができるようになります。

  • ord() を使って文字を数値に変換する方法がわかる
  • chr() を使って数値を文字に変換する方法がわかる
  • ord()chr() を組み合わせた実践的な使い方がわかる

文字コードの知識は、テキスト処理の幅を大きく広げてくれます。ぜひこの機会にマスターしましょう!

はじめに:文字と数字の不思議な関係

コンピュータの内部では、すべての文字がユニークな数値として管理されています。この「文字と数値を対応させたルール」のことを文字コードと呼びます。

現在、世界中のほとんどの言語の文字を収録している Unicode という文字コードが広く使われています。

Pythonの ord()chr() は、このUnicodeのルールに基づいて、文字と数値を相互に変換してくれる便利な関数なのです。

ord()関数とは? – 文字を数値(Unicodeコードポイント)に変換する

ord()関数は、1文字の文字列を引数として受け取り、その文字に対応するUnicodeコードポイント(数値)を返す関数です。

ord は “ordinal”(順序、序数)の略で、文字の順番(番号)を返す、と覚えると分かりやすいでしょう。

ord()関数の基本的な使い方

ord()の使い方は非常にシンプルです。関数に変換したい文字を渡すだけです。

# アルファベット'A'を数値に変換
num_a = ord('A')
print(f"'A'のUnicodeコードポイントは: {num_a}")

# 小文字の'a'を数値に変換
num_b = ord('a')
print(f"'a'のUnicodeコードポイントは: {num_b}")

# 記号'!'を数値に変換
num_c = ord('!')
print(f"'!'のUnicodeコードポイントは: {num_c}")

実行結果:

'A'のUnicodeコードポイントは: 65
'a'のUnicodeコードポイントは: 97
'!'のUnicodeコードポイントは: 33

このように、アルファベットの大文字・小文字や記号が、それぞれ異なる数値に変換されていることがわかります。

ord()で日本語(マルチバイト文字)を変換するとどうなる?

ord()関数は、アルファベットだけでなく、日本語のようなマルチバイト文字にも問題なく対応しています。

# ひらがな「あ」を数値に変換
num_jp = ord('あ')
print(f"'あ'のUnicodeコードポイントは: {num_jp}")

# 漢字「猫」を数値に変換
num_kanji = ord('猫')
print(f"'猫'のUnicodeコードポイントは: {num_kanji}")

実行結果:

'あ'のUnicodeコードポイントは: 12354
'猫'のUnicodeコードポイントは: 29483

日本語の文字も、それぞれユニークな番号を持っていることが確認できますね。

よくあるエラー:ord()に複数文字を渡した場合

ord()関数は、必ず1文字の文字列でなければなりません。もし2文字以上の文字列を渡すと TypeError が発生します。

# 2文字の文字列を渡してみる
try:
    ord('AB')
except TypeError as e:
    print(e)

実行結果:

ord() expected a character, but string of length 2 found

エラーメッセージは「ord()は1文字を期待していましたが、長さ2の文字列が見つかりました」という意味です。このエラーが出た場合は、ord()に渡している文字列が1文字になっているかを確認しましょう。

chr()関数とは? – 数値(Unicodeコードポイント)を文字に変換する

chr()関数は、ord()とは全く逆の働きをします。Unicodeコードポイント(数値)を引数として受け取り、それに対応する文字を返す関数です。

chr は “character”(文字)の略です。数値を文字に変換する、と覚えましょう。

chr()関数の基本的な使い方

使い方は ord() と同じくシンプルです。文字に変換したい数値を関数に渡します。

# 数値 65 を文字に変換
char_a = chr(65)
print(f"65に対応する文字は: '{char_a}'")

# 数値 97 を文字に変換
char_b = chr(97)
print(f"97に対応する文字は: '{char_b}'")

# 数値 12354 を文字に変換
char_jp = chr(12354)
print(f"12354に対応する文字は: '{char_jp}'")

実行結果:

65に対応する文字は: 'A'
97に対応する文字は: 'a'
12354に対応する文字は: 'あ'

先ほどの ord() の例と見比べると、数値と文字がぴったり対応していることがわかります。

ord()とchr()は表裏一体の逆の関係

ここまで見てきたように、ord()chr()は互いに逆の操作を行う関数です。

つまり、ある文字を ord() で数値に変換し、その結果をすぐに chr() で文字に戻すと、元の文字と一致します。

original_char = 'X'

# 文字 -> 数値
code_point = ord(original_char)
print(f"'{original_char}' -> {code_point}")

# 数値 -> 文字
restored_char = chr(code_point)
print(f"{code_point} -> '{restored_char}'")

# 元の文字と一致するか確認
print(f"元の文字と一致する?: {original_char == restored_char}")

実行結果:

'X' -> 88
88 -> 'X'
元の文字と一致する?: True

この「元に戻せる」という性質が、プログラミングで非常に役立ちます。

よくあるエラー:範囲外の数値を渡した場合

chr()に渡せる数値には範囲があります。現在のUnicodeの有効な範囲(0 から 1,114,111)外の数値を渡すと ValueError が発生します。

# 有効範囲外の数値を渡してみる
try:
    chr(1114112) # 範囲外の数値
except ValueError as e:
    print(e)

実行結果:

chr() arg not in range(0x110000)

このエラーが出た場合は、chr()に渡している数値がUnicodeの有効範囲内にあるかを確認してください。

ord()とchr()の便利な応用例

ord()chr()の基本がわかったところで、これらを組み合わせた実践的な応用例を2つ見ていきましょう。

応用例1:シーザー暗号(簡易的な暗号化)を実装してみる

シーザー暗号は、各文字をアルファベット上で一定数だけずらして作成する、古典的な暗号です。例えば「3文字ずらす」場合、「A」は「D」に、「B」は「E」になります。

これを ord()chr() を使って実装してみましょう。

# ずらす文字数
SHIFT = 3
# 暗号化したいメッセージ
message = "HELLO PYTHON"
# 暗号化されたメッセージを格納する変数
encrypted_message = ""

for char in message:
    # アルファベットの場合のみ処理
    if 'A' <= char <= 'Z':
        # 1. 文字を数値に変換
        num = ord(char)
        # 2. 数値をずらす
        num += SHIFT
        # 3. 'Z'を超えた場合の処理('A'に戻る)
        if num > ord('Z'):
            num -= 26 # アルファベットは26文字
        # 4. 数値を文字に戻して追加
        encrypted_message += chr(num)
    else:
        # アルファベット以外はそのまま追加
        encrypted_message += char

print(f"元のメッセージ: {message}")
print(f"暗号化されたメッセージ: {encrypted_message}")

実行結果:

元のメッセージ: HELLO PYTHON
暗号化されたメッセージ: KHOOR SBWKRQ

このように、文字を一度数値に変換し、計算を行ってから再び文字に戻すことで、簡単に暗号化処理が実装できました。

応用例2:’a’から’z’までのアルファベットをループで生成する

forループを使って、’a’から’z’までのアルファベットを順番に出力したい場合、ord()chr()が非常に役立ちます。

range()関数と組み合わせることで、スマートに実装できます。

print("--- 'a'から'z'までのアルファベット一覧 ---")

# 'a'のコードポイントから'z'のコードポイントまでループ
start = ord('a')
end = ord('z')

for num in range(start, end + 1):
    # 数値を文字に変換して出力
    print(chr(num), end=" ") # end=" "で改行せずスペース区切りにする

print("\n") # 最後に改行

実行結果:

--- 'a'から'z'までのアルファベット一覧 ---
a b c d e f g h i j k l m n o p q r s t u v w x y z

['a', 'b', 'c', ...] のようなリストを事前に用意しなくても、必要な範囲の文字を動的に生成できて便利です。

まとめ

今回は、Pythonの ord()chr() 関数について、基本的な使い方から応用例までを解説しました。

  • ord(): 文字数値(Unicodeコードポイント)に変換する
  • chr(): 数値(Unicodeコードポイント)を文字に変換する
  • この2つは互いに逆の働きをする関係
  • 組み合わせることで、文字を数値として計算・操作できる

これらの関数を使いこなせると、テキストデータの処理やアルゴリズムの実装など、プログラミングの表現力が一段とアップします。ぜひ、ご自身のコードでも活用してみてください。

コメント

タイトルとURLをコピーしました