
关于有时从其他文件格式生成PDF时部分汉字会被转变为同形的康熙部首的问题
前段时间在使用Calibre将日语EPUB转换为PDF时,发现很多常用字无法被全文搜索,冲浪一圈方知是因为这些字被错误地转换为了康熙部首等区的同形字,并且这一问题存在至少6年了。
对于HTML、DOCX等格式,使用“打印”中的另存为PDF、Microsoft print to PDF、Adobe PDF等选项生成PDF时也会出现类似的情况。
这一情况只出现在PDF中,转换前的文件是正常的。
示例
用“另存为PDF”打印了aozora上的任意一篇文章[1],并从PDF中复制了对应段落

⼀⾏は駿さんの⼗⼆を最少として、⼆⼗歳に近い伊藤の丈さん、その弟の秀さ ひとし たか ん、藤野の準さん、戸塚の巍さんと私の⼆つ違ひの兄とで、皆⼗五、六歳の年 恰好、おいさんを合せて⼋⼈の⼀⾏であつた。⼋⽉の或る⽇のことだつたと思 ふが、暁の三時に家を出るといふことで、私達は早く起きて⺟の⼼尽しの朝飯を ⻝つて出かけた。その時⺟は⽗の命で⼩鯛の⽩味噌汁を作つてくれた。その旨 かつた味が今に忘れられない。精進を宗とするお⼭⾏の⾨出にこんな⽣臭を⻝は せたことを考へると、⽗には神信⼼の念は乏しかつたと⾒える。服装は霜ふりの ⽊綿の制服で、⽩い脚絆は⺟の⼿製であつたらしい。浴⾐に股引といふいでたち のものもあつた。
测试了Edge打印中文网页,也有一样的问题:

中⽇韩越统⼀表意⽂字(1993年国际标准化... - 百度百科
中⽇韩越统⼀表意⽂字(CJKV Unified Ideographs),旧称中⽇韩统⼀表意⽂
字,也称“统⼀汉字”(Unihan),由国际标准化组织(ISO) 与统⼀码联盟(Uni
code Consortium) 联合制定的字符编码标准,建设⽬的是把分别来⾃中⽂、
⽇⽂、韩⽂、越⽂中本义相同、形状⼀样或稍异的表
其中,⼀ (U+2F00)、⾏ (U+2F8F)、⼗ (U+2F17)、⼆ (U+2F06)、⼋ (U+2F0B)、⼈ (U+2F08)、⽉ (U+2F49)、⽇ (U+2F47)、⼼ (U+2F3C)、⽗ (U+2F57)、⼩ (U+2F29)、⼭ (U+2F2D)、⾨ (U+2FA8)、⽣ (U+2F63)、⽩ (U+2F69)、⼿ (U+2F3F)、⾒ (U+2F92)、⽊ (U+2F4A)、⾐ (U+2F90)、⽂ (U+2F42)、⽬ (U+2F6C)、⾃ (U+2F93)在康熙部首区(Kangxi Radicals);⺟ (U+2E9F)、⻟ (U+2EDD)在中日韩部首补充区(CJK Radicals Supplement)。
这导致无法通过以普通输入方式输入的一(U+4E00)、行(U+884C)等搜索这些字符——不过edge浏览器的页内搜索经过了字符匹配,使用edge打开这类PDF时可以通用搜索;对于Word,使用“导出→创建为PDF”的结果也是基本正常的(这里有一个测试)。于是,直到近来才发现这一问题……
原理
康熙部首区字符:统一码214康熙部首与汉字对照表
中日韩部首补充区字符:[中日韩汉字部首补充]区段所有字符 U+2E80-U+2EFF | Unicode符号库 ✏️
原理见以下,大概是由于部首区排在中日韩越统一表意文字前面,于是一些字体的cmap错误地选择了字形相同的字中编号较小的那个:
导出的pdf字符编码错误 · Issue #52 · BingyanStudio/LapisCV
PDFをコピペするとなぜ“文字化け”が起きてしまうのか 変換テーブル“ToUnicode CMap”が原因だった
目前的解决方案
①导出时不要使用包含康熙部首区的字体,如思源系列、Meiryo UI、YU Mincho等;使用不包含康熙部首区的字体,如MS明朝、MS Gothic等
②对于EPUB转PDF,某些网页在线转换似乎是正常的;也可以先将EPUB转为HTML/HTMLZ,再使用weasyprint等从HTML生成PDF,从而可以正常选择字体
③手机端(至少部分)浏览器从HTML打印PDF可能也无此问题