PDFの表などをAdobe Acrobat Proの「書式設定を維持してコピー」でコピーし、これをExcelやメモ帳、秀丸などに貼り付ける。
ExcelやWordでは表示上、違いが分からないが、テキストエディタ(メモ帳や秀丸)に貼り付けると、例えば「自己」という文字がちょっと形がつぶれたフォントで表示されることがある。たとえば、「自己」は「⾃⼰」となっている。
全ての漢字でこれが生じるわけではない。下記はそういう現象が起きている文字の例。
⾃ 自
⼰ 己
⼤ 大
⽣ 生
⽅ 方
⽂ 文
⼒ 力
⾝ 身
左側がつぶれた表示がされる文字、右側が正しい(自分が意図した)文字。
この、つぶれた側をExcelのセルにコピーして、code関数でcodeを見てみる。Windowsなのでcode関数は「ANSI文字セット」でのコード番号を返すはず。
すると、上の「⾃、⼰、⼤、⽣、⽅、⽂、⼒、⾝」の全てで、同じコード番号、63を返してくる。63は「?」のはずだが。
ちなみに右側「自、己、大、生、方、文、力、身」では、「15403、14410、16999、16440、19069、19000、20047、16200」を返す。
そもそも、つぶれた表記の文字が何なのか分からないのだが、
?どうして、code(⾃) も code(⼰) も同じ63という値を返すのだろう?
?コード番号が63("?"の番号)と同じ解釈がされるのに、Excelはどうして両者を異なる表示にできているのだろう?
全然分からない。
ところで、Acrobat Proで「書式設定を維持してコピー」を使わないで単に文字列をコピーすると、このつぶれたフォントで表示される文字にはならない。正しい文字としてコピーされる。
この「書式設定を維持してコピー」を利用して、例えばExcelに貼り付けてファイルを作ると、そのファイルには“変なコード番号の文字”が混ざってしまうことになる。ソフトウェア側で受け止めてくれてユーザには違いを見せないようにしてくれているのだが、ちょっと気持ち悪い。
「文字コード表 | UIC」 https://uic.jp/charset/ を利用して、Windows版Excelの code関数が返す文字コード番号が何の文字コード表に基づいているのかを見てみると、「日本語 (JIS 1 バイト カタカナ可)」の「CP50221」か「ISO-2022-JP」だろうと分かる(私はWindows10がプリインストールされたままの設定で使っていてOfficeの設定もいじっていない)。
残念ながら文字コードの知識が全然ないのでここから先が分からない。
とりあえず、つぶれて表示される文字を「正しい」文字に置換するマクロを秀丸で作って処理しようと思う。ただ、秀丸でこの「つぶれて表示される文字」を残したマクロファイルを作るには、ファイル保存の「エンコードの種類」で「Unicode(UTF-8)」、「BOMを付ける」をチェックしておく必要がある。
つぶれて表示される文字の見つけ方だが、PDFからコピーしたテキストを、秀丸なら「エンコードの種類」を「Shift-JIS」で、メモ帳なら「文字コード」を「ANSI」でファイル保存させてみる。つぶれて表示される文字が含まれていればエラーメッセージが表示される。秀丸ならファイル保存をキャンセルすると、そのエラー原因の文字にカーソルが飛ぶので便利。メモ帳なら保存を強制続行するとエラー原因の文字が「?」に変換されるので「?」を検索して元の文字を探せばよい。
サンプル
//PDFからテキストコピーしたときにつぶれたフォントで表示される文字を修正する秀丸マクロ //PDFコピーでつぶれて表示される文字と変換する文字のリスト $wrong[0] = "⾃"; $correct[0] = "自"; $wrong[1] = "⼰"; $correct[1] = "己"; $wrong[2] = "⼤"; $correct[2] = "大"; $wrong[3] = "⽣"; $correct[3] = "生"; $wrong[4] = "⽅"; $correct[4] = "方"; $wrong[5] = "⽂"; $correct[5] = "文"; $wrong[6] = "⼒"; $correct[6] = "力"; $wrong[7] = "⾝"; $correct[7] = "身"; //本処理 #i = 0; $str = ""; while( #i <= 7 ) { #j = 0; replaceall $wrong[#i], $correct[#i]; if( result ) $str = $str + ", " + $wrong[#i]; #i = #i + 1; } if( $str == "") $str = "ありませんでした。"; message "変換した文字:" + $str; endmacro;