Pythonでプログラミングを行っていると、文字をコンピュータが理解できる数値として扱いたい場面に遭遇します。
そのような時に欠かせないのが、文字を文字コードに変換するord()関数です。
この記事では、ord()関数の基本的な使い方から、実務で役立つ応用テクニックまで詳しく解説していきます。
Python 3において文字列はすべてUnicodeとして扱われるため、この関数を理解することは文字エンコーディングの基礎を学ぶことにも繋がります。
初心者の方でも理解しやすいように、具体的なコード例を交えながら進めていきましょう。
ord関数とは?文字コードを取得する仕組み
ord()関数は、1文字の文字列を引数に取り、その文字に対応するUnicodeコードポイントを整数として返す組み込み関数です。
コンピュータの内部では、すべての文字は数値として管理されています。
例えば、アルファベットの「A」や日本語の「あ」には、それぞれ固有の番号が割り振られています。
ordという名前は、英語の「ordinal(順序を示す)」という単語に由来しています。
この関数を使用することで、プログラム上で文字の「並び順」や「数値としての正体」を簡単に特定できるようになります。
Python 3では、ASCII文字だけでなく、世界中の文字(Unicode)を同様の操作で取得できる点が大きな特徴です。
ord関数の基本構文
ord()関数の構文は非常にシンプルです。
# ord関数の基本的な構文
ord(c)
引数であるcには、長さが1の文字列を指定する必要があります。
もし空の文字列や、2文字以上の文字列を渡すと、プログラムはエラーを返します。
戻り値は、その文字のUnicodeコードポイントを表す整数となります。
ord関数の具体的な使用例
まずは、最も基本的なアルファベットや数値の文字コードを確認してみましょう。
# アルファベットの文字コードを取得
print(ord('A'))
print(ord('a'))
print(ord('z'))
# 数字の「0」の文字コードを取得
print(ord('0'))
65
97
122
48
結果を見ると、「A」は65、「a」は97であることがわかります。
このように、同じアルファベットでも大文字と小文字では異なるコードが割り当てられています。
次に、日本語の文字コードを取得する例を見てみましょう。
# 日本語の文字コードを取得
print(ord('あ'))
print(ord('漢'))
print(ord('?'))
12354
28450
65311
ひらがなの「あ」は12354という非常に大きな数値になっていることがわかりますね。
これは、Unicodeが膨大な数の文字をサポートするために広い数値範囲を持っているためです。
記号や特殊文字の取得
改行コードやタブなどの制御文字も、文字として扱われるためord()でコードを取得可能です。
# 改行文字とタブ文字
print(ord('\n'))
print(ord('\t'))
10
9
これらは、テキストデータの解析やクリーニングを行う際に役立つ知識です。
chr関数との関係(逆変換の方法)
ord()関数とセットで覚えておくべきなのが、chr()関数です。
chr()関数は、整数(文字コード)を引数に取り、対応する文字を返す役割を持ちます。
つまり、ord()とchr()は互いに逆の操作を行う関係にあります。
# ordで数値化し、chrで文字に戻す
code = ord('B')
char = chr(code)
print(f"コード: {code}")
print(f"復元された文字: {char}")
コード: 66
復元された文字: B
この双方向の変換を利用することで、文字に対する計算処理が可能になります。
ord関数を活用した実践テクニック
ord()関数は、単にコードを調べるだけでなく、さまざまなロジックの実装に活用されます。
1. アルファベットの判定やループ処理
特定の範囲のアルファベットをすべて出力したい場合、文字コードを利用すると効率的です。
# aからzまでのアルファベットをリスト化する
alphabet_list = [chr(i) for i in range(ord('a'), ord('z') + 1)]
print(alphabet_list)
['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…」と入力する手間が省け、ミスも防ぐことができます。
2. シーザー暗号(簡易暗号)の実装
文字コードを一定数ずらすことで、簡単な暗号化処理を行うことができます。
# 文字を3つ後ろにずらす簡易暗号
def encrypt(text, shift):
result = ""
for char in text:
# 文字コードをずらして新しい文字を生成
result += chr(ord(char) + shift)
return result
original = "Python"
encrypted = encrypt(original, 3)
print(f"元の文字列: {original}")
print(f"暗号化後: {encrypted}")
元の文字列: Python
暗号化後: S|wkrq
このように、ord()で数値化して演算を行い、chr()で再び文字に戻す手法は、データ処理の基本です。
3. 全角・半角の判定やバリデーション
特定の文字が特定の範囲(ASCII範囲内かどうかなど)にあるかを調べることで、バリデーションを実装できます。
# 文字がASCII範囲内(半角英数など)か判定
def is_ascii(char):
return ord(char) < 128
print(is_ascii('A'))
print(is_ascii('あ'))
True
False
ユーザーからの入力値に全角文字が含まれていないかチェックする際などに有効です。
注意点:ord関数で発生するエラー
ord()関数を使用する際には、いくつかのルールを守らなければなりません。
最も多いエラーは、引数に2文字以上の文字列を渡してしまうケースです。
# エラーが発生する例
try:
print(ord('AB'))
except TypeError as e:
print(f"エラー内容: {e}")
エラー内容: ord() expected a character, but string of length 2 found
もし文字列全体を数値化したい場合は、forループを使用して1文字ずつ処理するか、encode()メソッドを使用してバイト列に変換する必要があります。
また、空の文字列 '' を渡した場合も同様にエラーとなります。
Unicodeと16進数の表現
ord()関数が返す値は10進数の整数ですが、エンジニアの現場では16進数で文字コードを表現することが一般的です。
Pythonのhex()関数を組み合わせることで、Unicodeの正式な表記(U+XXXX形式)に近い形を確認できます。
# 文字コードを16進数で表示
char = '🐍' # 絵文字
code_dec = ord(char)
code_hex = hex(code_dec)
print(f"絵文字: {char}")
print(f"10進数: {code_dec}")
print(f"16進数: {code_hex}")
絵文字: 🐍
10進数: 128013
16進数: 0x1f40d
最近のプログラミングでは、絵文字などのサロゲートペアが絡む複雑な文字も扱う機会が増えています。
ord()関数は、こうした絵文字も1つのコードポイントとして正しく処理できるため非常に強力です。
よくある質問(FAQ)
Q. ord関数で取得した値はUTF-8ですか?
厳密には、ord()が返すのはUTF-8のバイト値ではなく、Unicodeの「コードポイント」です。
UTF-8はUnicodeをコンピュータで扱うための「符号化方式」の一つであり、コードポイントとは値が異なる場合があります。
Q. 複数の文字をまとめて変換するには?
リスト内包表記を使用するのが最も効率的です。
# 文字列全体をコードのリストにする
codes = [ord(c) for c in "Hello"]
print(codes)
[72, 101, 108, 108, 111]
まとめ
Pythonのord()関数は、文字と数値の架け橋となる重要なツールです。
1文字の文字列をUnicodeコードポイントへ変換するというシンプルな機能ですが、暗号化、バリデーション、データ解析など、その用途は多岐にわたります。
最後に、この記事で学んだポイントを整理しましょう。
ord(c)は1文字のUnicodeコードポイント(整数)を返す。- 逆の操作を行う関数は
chr(i)である。 - 2文字以上の文字列や空文字を渡すと
TypeErrorが発生する。 - アルファベットのリスト生成や、入力値の範囲チェックに活用できる。
- 絵文字などの特殊な文字も正しく扱うことができる。
文字コードの概念を理解することは、トラブルの少ないプログラムを書くための第一歩です。
ぜひ、今回紹介したコード例を実際に動かして、ord()関数の動作を体感してみてください。
