Unicodeガイド · 2026年10月20日更新
PythonでUnicodeを扱う
処理中の文字列はstrのまま扱います。保存や通信ではbytesにエンコードし、既知の文字コードでデコードします。以下の例をPython 3で実行してください。
ord()とchr()でコードポイントを調べる
Python 3のstrはUnicode文字列です。ord()は1つのコードポイントを整数にし、chr()は逆の処理をします。見た目が1つの絵文字でも複数のコードポイントを含む場合があります。
text = "Aé♥"
print([f"U+{ord(char):04X}" for char in text])
# ['U+0041', 'U+00E9', 'U+2665']
print(chr(0x2665))
# ♥UTF-8で文字列をエンコード・デコードする
encode()で文字列をバイト列に、decode()でバイト列を文字列に変換します。元データの実際の文字コードを使ってください。不正な入力は標準でエラーになります。
text = "café"
data = text.encode("utf-8")
print(data.hex(" "))
# 63 61 66 c3 a9
print(data.decode("utf-8"))
# café
assert data.decode("utf-8") == textエスケープ表記と文字そのものを区別する
通常のPython文字列リテラルではUnicodeエスケープが解釈されます。raw文字列はバックスラッシュを保持します。表示にエスケープがあっても、保存した文字列にバックスラッシュがあるとは限りません。
heart = "\u2665"
literal = r"\u2665"
print(heart, len(heart))
# ♥ 1
print(literal, len(literal))
# \u2665 6
assert heart == "♥"比較前に同等の文字列を正規化する
合成済み文字と文字+結合記号は同じ見た目になる場合があります。NFCは正準等価な文字列をそろえます。翻訳やアクセントの削除はしません。
import unicodedata
composed = "é"
decomposed = "e\u0301"
print(composed == decomposed)
# False
print(unicodedata.normalize("NFC", decomposed) == composed)
# Trueよくある文字コードの間違いを避ける
- UTF-8ファイルにはencoding="utf-8"を指定し、古い文書の元の文字コードも確認してください。
- errors="ignore"を一般的な修復方法にしないでください。データが黙って消えます。エラーは明示的に処理します。
- len()はstrのコードポイント数を数え、見た目の文字数ではありません。結合記号や絵文字は複数を含みます。
- ASCIIはすべてのUnicodeを符号化できません。置換や翻字をすると内容が変わります。