R.A. Epigonos et al.

[pdf] コピペ時に簡単な漢字の字形がおかしくなる⇒康煕部首をCJK漢字に変換

pdfに康煕部首のコードポイントを持つ文字が含まれていると、文字列のコピーや検索の際に問題となる。コピーの時にはペースト時に字形がおかしくなるし、検索時には入力文字列とは異なると判断されてヒットしなくなる。康煕部首は部首であることを示す場合に使うべき字形であり、同じor似ている字形だからと言って、使っていいものではない。

AIチャット

AIチャットに変換を依頼する場合は以下。

以下のテキストから康煕部首で表される文字をCJK漢字に変換し、変換箇所を赤文字でハイライトしてください。また、変換文字が含まれる単語のリストを作ってください。

python

pythonコードは以下。標準入力を受けて標準出力に変換テーブルと変換結果を出力

import re
import sys
import unicodedata

def get_char_info(char):
    """
    文字のUnicodeコードポイントとUTF-8バイト列(16進数表記)を返します。
    """
    code_point = f"U+{ord(char):04X}"
    utf8_bytes = char.encode('utf-8')
    hex_representation = ' '.join(f'{b:02X}' for b in utf8_bytes)
    return char, code_point, hex_representation

def convert_kangxi_radicals_to_cjk(text):
    """
    テキスト内の康煕部首と見なされる文字を一般的なCJK漢字に変換し、
    変換箇所を赤文字でハイライト表示します。
    変換の詳細(コードポイントとUTF-8バイト列)も表示します。
    """

    conversion_map = {
        '⺃': '乚', '⺅': '亻', '⺉': '刂', '⺋': '㔾', '⺎': '兀',
        '⺏': '尣', '⺐': '尢', '⺒': '巳', '⺓': '幺', '⺔': '彑',
        '⺖': '忄', '⺘': '扌', '⺙': '攵', '⺛': '旡', '⺟': '母',
        '⺠': '民', '⺡': '氵', '⺢': '氺', '⺣': '灬', '⺦': '丬',
        '⺨': '犭', '⺫': '罒', '⺬': '示', '⺭': '礻', '⺱': '罓',
        '⺲': '罒', '⺹': '耂', '⺾': '艹', '⻁': '虎', '⻂': '衤',
        '⻃': '覀', '⻄': '西', '⻍': '辶', '⻏': '阝', '⻑': '長',
        '⻒': '镸', '⻖': '阝', '⻘': '青', '⻟': '飠', '⻤': '鬼',
        '⻨': '麦', '⻩': '黄', '⻫': '斉', '⻭': '歯', '⻯': '竜',
        '⻲': '亀',

        '⼀': '一', '⼁': '丨', '⼂': '丶', '⼃': '丿', '⼄': '乙',
        '⼅': '亅', '⼆': '二', '⼇': '亠', '⼈': '人', '⼉': '儿',
        '⼊': '入', '⼋': '八', '⼌': '冂', '⼍': '冖', '⼎': '冫',
        '⼏': '几', '⼐': '凵', '⼑': '刀', '⼒': '力', '⼓': '勹',
        '⼔': '匕', '⼕': '匚', '⼖': '匸', '⼗': '十', '⼘': '卜',
        '⼙': '卩', '⼚': '厂', '⼛': '厶', '⼜': '又', '⼝': '口',
        '⼞': '囗', '⼟': '土', '⼠': '士', '⼡': '夂', '⼢': '夊',
        '⼣': '夕', '⼤': '大', '⼥': '女', '⼦': '子', '⼧': '宀',
        '⼨': '寸', '⼩': '小', '⼪': '尢', '⼫': '尸', '⼬': '屮',
        '⼭': '山', '⼮': '巛', '⼯': '工', '⼰': '己', '⼱': '巾',
        '⼲': '干', '⼳': '幺', '⼴': '广', '⼵': '廴', '⼶': '廾',
        '⼷': '弋', '⼸': '弓', '⼹': '彐', '⼺': '彡', '⼻': '彳',
        '⼼': '心', '⼽': '戈', '⼾': '戸', '⼿': '手', '⽀': '支',
        '⽁': '攴', '⽂': '文', '⽃': '斗', '⽄': '斤', '⽅': '方',
        '⽆': '无', '⽇': '日', '⽈': '曰', '⽉': '月', '⽊': '木',
        '⽋': '欠', '⽌': '止', '⽍': '歹', '⽎': '殳', '⽏': '毋',
        '⽐': '比', '⽑': '毛', '⽒': '氏', '⽓': '气', '⽔': '水',
        '⽕': '火', '⽖': '爪', '⽗': '父', '⽘': '爻', '⽙': '爿',
        '⽚': '片', '⽛': '牙', '⽜': '牛', '⽝': '犬', '⽞': '玄',
        '⽟': '玉', '⽠': '瓜', '⽡': '瓦', '⽢': '甘', '⽣': '生',
        '⽤': '用', '⽥': '田', '⽦': '疋', '⽧': '疒', '⽨': '癶',
        '⽩': '白', '⽪': '皮', '⽫': '皿', '⽬': '目', '⽭': '矛',
        '⽮': '矢', '⽯': '石', '⽰': '示', '⽱': '禸', '⽲': '禾',
        '⽳': '穴', '⽴': '立', '⽵': '竹', '⽶': '米', '⽷': '糸',
        '⽸': '缶', '⽹': '网', '⽺': '羊', '⽻': '羽', '⽼': '老',
        '⽽': '而', '⽾': '耒', '⽿': '耳', '⾀': '聿', '⾁': '肉',
        '⾂': '臣', '⾃': '自', '⾄': '至', '⾅': '臼', '⾆': '舌',
        '⾇': '舛', '⾈': '舟', '⾉': '艮', '⾊': '色', '⾋': '艸',
        '⾌': '虍', '⾍': '虫', '⾎': '血', '⾏': '行', '⾐': '衣',
        '⾑': '襾', '⾒': '見', '⾓': '角', '⾔': '言', '⾕': '谷',
        '⾖': '豆', '⾗': '豕', '⾘': '豸', '⾙': '貝', '⾚': '赤',
        '⾛': '走', '⾜': '足', '⾝': '身', '⾞': '車', '⾟': '辛',
        '⾠': '辰', '⾡': '辵', '⾢': '邑', '⾣': '酉', '⾤': '釆',
        '⾥': '里', '⾦': '金', '⾧': '長', '⾨': '門', '⾩': '阜',
        '⾪': '隶', '⾫': '隹', '⾬': '雨', '⾭': '靑', '⾮': '非',
        '⾯': '面', '⾰': '革', '⾱': '韋', '⾲': '韭', '⾳': '音',
        '⾴': '頁', '⾵': '風', '⾶': '飛', '⾷': '食', '⾸': '首',
        '⾹': '香', '⾺': '馬', '⾻': '骨', '⾼': '高', '⾽': '髟',
        '⾾': '鬥', '⾿': '鬯', '⿀': '鬲', '⿁': '鬼', '⿂': '魚',
        '⿃': '鳥', '⿄': '鹵', '⿅': '鹿', '⿆': '麥', '⿇': '麻',
        '⿈': '黃', '⿉': '黍', '⿊': '黒', '⿋': '黹', '⿌': '黽',
        '⿍': '鼎', '⿎': '鼓', '⿏': '鼠', '⿐': '鼻', '⿑': '齊',
        '⿒': '齒', '⿓': '龍', '⿔': '龜', '⿕': '龠',
        # 他にも変換が必要な文字があればここに追加
    }

    # sorted_dict = {key: conversion_map[key] for key in sorted(conversion_map)}
    # print(sorted_dict)
    # conversion_map = sorted_dict

    conversion_details = []
    for char, converted_char in conversion_map.items():
        original_char, original_cp, original_utf8 = get_char_info(char)
        converted_cp, converted_utf8 = get_char_info(converted_char)[1:] # 文字は元の変数から取得

        conversion_details.append(
            f"元の文字: '{original_char}' (コードポイント: {original_cp}, UTF-8: {original_utf8}) "
            f"-> 変換後: '{converted_char}' (コードポイント: {converted_cp}, UTF-8: {converted_utf8})"
        )

    converted_text = ""
    for char in text:
        if char in conversion_map:
            original_char, original_cp, original_utf8 = get_char_info(char)
            converted_char = conversion_map[char]
            
            # ハイライト用に色付け (ANSIエスケープシーケンス)
            converted_text += f"\033[91m{converted_char}\033[0m" # 赤色に変換
        else:
            converted_text += char
    
    return converted_text, conversion_details

if __name__ == "__main__":
    print("変換したいテキストを入力してください。入力後、Ctrl+D (macOS/Linux) または Ctrl+Z (Windows) を押してEnterを押してください。")
    
    input_lines = sys.stdin.readlines()
    text_to_convert = "".join(input_lines)

    converted_highlighted_text, details = convert_kangxi_radicals_to_cjk(text_to_convert)

    if details:
        print("\n--- 変換の詳細 ---")
        for detail in details:
            print(detail)
    else:
        print("\n--- 変換された文字はありませんでした ---")

    print("\n--- 変換後のテキスト (赤文字でハイライト) ---")
    print(converted_highlighted_text)

リファレンス

  1. 康煕部首 - Wikipedia
  2. 見た目の変わらない文字化け―康煕部首とメイリオ
  3. 康煕部首→CJK漢字コンバータ
  4. PDFをコピペするとなぜ“文字化け”が起きてしまうのか 変換テーブル“ToUnicode CMap”が原因だった | ログミーBusiness
  5. PythonでCJK部首/康熙部首を置換 - メモ

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2007-08-03T15:40:14+09:00
  2. Modified: 2007-08-03T15:40:14+09:00
  3. Generated: 2025-10-27T23:09:16+09:00