Documentation Python

Pythonのchr()関数は、Unicodeコードポイント(整数)を対応する文字に変換するための組み込み関数です。テキスト処理、暗号化、特殊文字の生成など、幅広い用途で活用できます。

chrとordの比較

関数入力出力
chr()整数(コードポイント)文字chr(65)'A'
ord()文字整数(コードポイント)ord('A')65

基本的な使い方

構文

chr(i)
パラメータ説明
i0 から 1,114,111 (0x10FFFF) までの整数
戻り値対応するUnicode文字(1文字の文字列)

基本例

# ASCII文字
print(chr(65))    # A
print(chr(97))    # a
print(chr(48))    # 0
print(chr(32))    # (スペース)

# 記号
print(chr(33))    # !
print(chr(64))    # @
print(chr(35))    # #

# 日本語(ひらがな)
print(chr(12354))  # あ
print(chr(12356))  # い

# 日本語(漢字)
print(chr(26085))  # 日
print(chr(26412))  # 本

# 絵文字
print(chr(128512))  # 😀
print(chr(128525))  # 😍
print(chr(9829))    # ♥

エラーケース

# 範囲外の値
try:
    chr(1114112)  # 上限超過
except ValueError as e:
    print(e)  # chr() arg not in range(0x110000)

try:
    chr(-1)  # 負の値
except ValueError as e:
    print(e)  # chr() arg not in range(0x110000)

# 整数以外
try:
    chr("65")
except TypeError as e:
    print(e)  # an integer is required

主要なコードポイント範囲

範囲説明
0-31制御文字タブ(9)、改行(10)
32-126ASCII印刷可能文字スペース(32)~チルダ(126)
48-57数字0-9
65-90大文字アルファベットA-Z
97-122小文字アルファベットa-z
12353-12438ひらがなあ-ん
12449-12534カタカナア-ン
19968-40959漢字(CJK統合漢字)日本語の漢字
128512-128591絵文字(笑顔系)😀-😿

chrとordの相互変換

# 文字からコードポイント、コードポイントから文字
char = 'A'
code = ord(char)
back = chr(code)

print(f"文字: {char}")       # 文字: A
print(f"コードポイント: {code}")  # コードポイント: 65
print(f"復元: {back}")       # 復元: A

# 逆変換の確認
assert chr(ord('Z')) == 'Z'
assert ord(chr(12354)) == 12354

# 文字列の各文字を変換
text = "Hello"
code_points = [ord(c) for c in text]
print(code_points)  # [72, 101, 108, 108, 111]

restored = ''.join(chr(cp) for cp in code_points)
print(restored)  # Hello

実践的な使用パターン

アルファベットの生成

# 大文字アルファベット
uppercase = ''.join(chr(i) for i in range(65, 91))
print(uppercase)  # ABCDEFGHIJKLMNOPQRSTUVWXYZ

# 小文字アルファベット
lowercase = ''.join(chr(i) for i in range(97, 123))
print(lowercase)  # abcdefghijklmnopqrstuvwxyz

# stringモジュールと同等
import string
assert uppercase == string.ascii_uppercase
assert lowercase == string.ascii_lowercase

# 数字
digits = ''.join(chr(i) for i in range(48, 58))
print(digits)  # 0123456789

ひらがな・カタカナの生成

# ひらがな(あ〜ん)
hiragana = ''.join(chr(i) for i in range(12354, 12436))
print(hiragana[:20])  # あぃいぅうぇえぉおかがきぎくぐけげこご

# カタカナ(ア〜ン)
katakana = ''.join(chr(i) for i in range(12450, 12532))
print(katakana[:20])  # アィイゥウェエォオカガキギクグケゲコゴ

# ひらがな→カタカナ変換
def to_katakana(hiragana_text: str) -> str:
    """ひらがなをカタカナに変換"""
    result = []
    for char in hiragana_text:
        code = ord(char)
        # ひらがなの範囲内なら96を加算してカタカナに
        if 12353 <= code <= 12438:
            result.append(chr(code + 96))
        else:
            result.append(char)
    return ''.join(result)

print(to_katakana("こんにちは"))  # コンニチハ

シーザー暗号

def caesar_encrypt(text: str, shift: int) -> str:
    """シーザー暗号で暗号化"""
    result = []
    for char in text:
        if char.isalpha():
            # 基準点(大文字なら65、小文字なら97)
            base = ord('A') if char.isupper() else ord('a')
            # シフトして範囲内に収める
            shifted = (ord(char) - base + shift) % 26 + base
            result.append(chr(shifted))
        else:
            result.append(char)
    return ''.join(result)

def caesar_decrypt(text: str, shift: int) -> str:
    """シーザー暗号を復号"""
    return caesar_encrypt(text, -shift)

# 使用例
original = "Hello, World!"
encrypted = caesar_encrypt(original, 3)
decrypted = caesar_decrypt(encrypted, 3)

print(f"原文: {original}")      # 原文: Hello, World!
print(f"暗号化: {encrypted}")   # 暗号化: Khoor, Zruog!
print(f"復号: {decrypted}")     # 復号: Hello, World!

# ROT13(13文字シフト、2回適用で元に戻る)
rot13 = caesar_encrypt("Python", 13)
print(rot13)  # Clguba
print(caesar_encrypt(rot13, 13))  # Python

XOR暗号

def xor_cipher(text: str, key: str) -> str:
    """XOR暗号(暗号化/復号共通)"""
    result = []
    for i, char in enumerate(text):
        key_char = key[i % len(key)]
        # XOR演算してchrで文字に戻す
        xored = ord(char) ^ ord(key_char)
        result.append(chr(xored))
    return ''.join(result)

# 使用例
message = "Secret Message"
key = "KEY"

encrypted = xor_cipher(message, key)
print(f"暗号化: {repr(encrypted)}")

# 同じ処理で復号
decrypted = xor_cipher(encrypted, key)
print(f"復号: {decrypted}")  # Secret Message

ランダム文字列生成

import random

def generate_password(length: int = 16) -> str:
    """安全なパスワードを生成"""
    # 使用する文字の範囲
    chars = (
        [chr(i) for i in range(48, 58)] +   # 0-9
        [chr(i) for i in range(65, 91)] +   # A-Z
        [chr(i) for i in range(97, 123)] +  # a-z
        list("!@#$%^&*")                     # 記号
    )
    return ''.join(random.choice(chars) for _ in range(length))

print(generate_password())  # 例: Kj3@mP9xLqR5#nWz

def generate_random_string(length: int, start: int, end: int) -> str:
    """指定範囲のUnicode文字からランダム文字列を生成"""
    return ''.join(chr(random.randint(start, end)) for _ in range(length))

# ランダムなひらがな
print(generate_random_string(10, 12354, 12435))

ASCIIアートテーブル

def print_ascii_table():
    """印刷可能なASCII文字のテーブルを表示"""
    print("Dec  Hex  Char  |  Dec  Hex  Char  |  Dec  Hex  Char")
    print("-" * 55)

    for i in range(32, 127, 3):
        row = []
        for j in range(3):
            code = i + j
            if code < 127:
                char = chr(code)
                if char == ' ':
                    char = 'SPC'
                row.append(f"{code:3d}  {code:02X}  {char:4s}")
        print("  |  ".join(row))

print_ascii_table()

Unicode文字情報の取得

import unicodedata

def char_info(char: str) -> dict:
    """文字の詳細情報を取得"""
    return {
        "character": char,
        "code_point": ord(char),
        "hex": hex(ord(char)),
        "name": unicodedata.name(char, "Unknown"),
        "category": unicodedata.category(char),
    }

# 使用例
for c in ['A', 'あ', '😀', '♥']:
    info = char_info(c)
    print(f"{info['character']}: {info['name']} (U+{info['code_point']:04X})")

# 出力:
# A: LATIN CAPITAL LETTER A (U+0041)
# あ: HIRAGANA LETTER A (U+3042)
# 😀: GRINNING FACE (U+1F600)
# ♥: BLACK HEART SUIT (U+2665)

エスケープシーケンスの変換

def unescape_unicode(text: str) -> str:
    """\\uXXXX形式をUnicode文字に変換"""
    import re

    def replace(match):
        code = int(match.group(1), 16)
        return chr(code)

    return re.sub(r'\\u([0-9a-fA-F]{4})', replace, text)

# 使用例
escaped = "Hello\\u0020World\\u0021"
print(unescape_unicode(escaped))  # Hello World!

json_escaped = "\\u3053\\u3093\\u306b\\u3061\\u306f"
print(unescape_unicode(json_escaped))  # こんにちは

特殊文字の検索

def find_chars_by_name(keyword: str, start: int = 0, end: int = 0x10000) -> list:
    """Unicode名に特定のキーワードを含む文字を検索"""
    import unicodedata
    results = []

    for i in range(start, end):
        try:
            char = chr(i)
            name = unicodedata.name(char)
            if keyword.upper() in name:
                results.append((char, i, name))
        except ValueError:
            continue

    return results

# 使用例
hearts = find_chars_by_name("HEART", 0, 0x3000)
for char, code, name in hearts[:5]:
    print(f"{char} U+{code:04X} {name}")

# 出力:
# ♡ U+2661 WHITE HEART SUIT
# ♥ U+2665 BLACK HEART SUIT
# ❣ U+2763 HEAVY HEART EXCLAMATION MARK ORNAMENT
# ❤ U+2764 HEAVY BLACK HEART
# ❥ U+2765 ROTATED HEAVY BLACK HEART BULLET

制御文字の操作

# 主要な制御文字
control_chars = {
    0: 'NUL (Null)',
    7: 'BEL (Bell)',
    8: 'BS (Backspace)',
    9: 'TAB (Horizontal Tab)',
    10: 'LF (Line Feed)',
    13: 'CR (Carriage Return)',
    27: 'ESC (Escape)',
}

for code, name in control_chars.items():
    print(f"chr({code}): {name}")

# 改行コードの生成
lf = chr(10)   # Unix改行
cr = chr(13)   # キャリッジリターン
crlf = chr(13) + chr(10)  # Windows改行

text = f"Line1{lf}Line2{lf}Line3"
print(text)
# Line1
# Line2
# Line3

まとめ

用途方法
コードポイント→文字chr(code_point)
文字→コードポイントord(char)
アルファベット生成[chr(i) for i in range(65, 91)]
文字シフトchr(ord(char) + shift)
ひらがな→カタカナchr(ord(hiragana) + 96)
16進数から変換chr(int('3042', 16))

chr()関数は、Unicodeコードポイントと文字を相互に変換するための基本的なツールです。ord()と組み合わせることで、文字列の暗号化、テキスト変換、特殊文字の生成など、様々なテキスト処理が可能になります。

参考文献

円