# 範囲外の値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-126
ASCII印刷可能文字
スペース(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}") # 文字: Aprint(f"コードポイント: {code}") # コードポイント: 65print(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 stringassert uppercase == string.ascii_uppercaseassert 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("こんにちは")) # コンニチハ
import randomdef 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#nWzdef 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 unicodedatadef 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 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