変なフォントが入り込むことの解決はできNo.40564
abe_mashu さん 23/05/17 13:09
 
お世話になります。長年愛用させていただいています。

さて、最近よくあることなのですが、ワードで作成した文章に変なフォントの文字が
混じることがあります。
Microsoft JhengHei(※)というフォントのようです
例えばこんな感じ(見えますかね〜)
 日本語フォント 「表示、文中」
 フォント混合  「表⽰、⽂中」(示と文が※のフォント)
このフォントの文字はちょっと厄介で、ワード(またはPDF)でコピーしたものを秀
丸にテキスト張り付けたときにフォントが変更されないことです
この問題を秀丸で簡単に解決できたらとってもありがたいのですが、可能でしょうか?
エンコードを変えてみるとか、コマンドプロンプトにコピーをしてみたりとか、いろ
いろやってみたのですが、素人に分かる範囲では解決できず、ご相談申し上げる次第
です
秀丸で解決できないとしても何かヒントがあったら教えて頂けないでしょうか
よろしくお願いします

[ ]
RE:40564 変なフォントが入り込むことの解No.40565
abe_mashu さん 23/05/17 13:11
 
> フォント混合  「表⽰、⽂中」(示と文が※のフォント)

こちらは文字化けしてしまっていますね
添付ファイルでお示ししたほうが良い場合にはご連絡いただけると幸いです

[ ]
RE:40565 変なフォントが入り込むことの解No.40566
秀丸担当 さん 23/05/17 13:59
 
文字の見え方が違うとのことで、ここに書き込まれた文字は、ブラウザ上で見えなく
てすみません。
該当の文字のUnicodeから、何であるかはわかります。

フォントというより、同じような形をした別の文字ということになります。
秀丸エディタで使えるフォントは、通常は全体で1つのみです。
[その他]→[ファイルタイプ別の設定]→[フォント]のところで変更できます。
ワードのように選択して、その部分だけフォントを変えるということはできません。
こちらで試した環境によるかもしれないですが、メイリオや游ゴシックでは大丈夫の
ようでした。

MS ゴシックとかだと、MS ゴシックには該当の文字のフォントは無いため、Wind
owsによって自動的に別のフォントで代替されます。

Windowsによって自動的に代替されるものを、細かく指定する方法があります。
[その他]→[ファイルタイプ別の設定]→[フォント]のところで、右側の「追加のフォ
ント」のところをONにして、...から、第2フォントなどのフォントを指定します。
これを例えばメイリオにすると、MS ゴシックに無い文字はメイリオになります。
第3フォントも指定していくと、メイリオに無い文字は第3フォントを使うといった感
じになります。

さらに、追加のフォントのプロパティで、「文字コード範囲を指定」で指定すると、
特定の文字コードの文字だけに適用できたりします。
「指定の文字コード範囲のみ」にして、文字コード範囲は
U+2F42
U+2F70
のようにしておくと、書き込まれた問題の2文字だけにメイリオを適用するといった
ようにできます。

[ ]
RE:40566 変なフォントが入り込むことの解No.40567
abe_mashu さん 23/05/18 11:27
 
早速にありがとうございます
仰る通りで、メイリオや游○○のフォントでは気が付きません
ただUnicodeが異なるということは明らかに別の文字が差し込まれているということ
で気になっています
(今はシステム側で対応できているけれど、将来環境が変わったときに対応できず、
文字化けが文書のあちこちに出現するという不具合を懸念しています)

>秀丸エディタで使えるフォントは、通常は全体で1つのみです。

これをうまく使って「別の文字」を「こちらが意図した文字」に一括変換できないか
なと思ったのですが、さすがにそこまではできないですよね

複数の人間で文書を作り上げていくときに、異なる文字が入り込んでしまっているの
で、全員の環境を統一するしかなさそう(できるかなぁ)

ありがとうございました

[ ]
RE:40567 変なフォントが入り込むことの解No.40568
でるもんたいいじま さん 23/05/18 12:20
 
こんにちは。秀丸愛用者の「でるもんた・いいじま」です。

> ただUnicodeが異なるということは明らかに別の文字が差し込まれていると
> いうことで気になっています
> (今はシステム側で対応できているけれど、将来環境が変わったときに対応できず、
> 文字化けが文書のあちこちに出現するという不具合を懸念しています)
....
> これをうまく使って「別の文字」を「こちらが意図した文字」に一括変換
> できないかなと思ったのですが、さすがにそこまではできないですよね

マクロで一斉に置換してしまう、というのはどうでしょうか。

※そもそもマクロとは、という話はスミマセン、省きます。

まず、
findspecial 0,1;
で、CP932(=Shift_JISのWindows拡張)に入っていない文字が検出できます。

その次は、
replaceallquick @"[\u2F42]", "文", regular;
replaceallquick @"[\u2F70]", "示", regular;
のように置換します。

このへんの U+2Fxx というコード、完成形の漢字ではなく部首を示すコードのようで
すね。

[ ]
RE:40567 変なフォントが入り込むことの解No.40569
こみやんま さん 23/05/18 15:38
 
「今、秀丸で表示しているフォントのグリフに含まれていない文字」は「完全互換性
分解」を試みる。

と人が思考することをそのままプログラミングすれば、ほぼ達成できそうな気がしま
す。

上をそのまま記述すると、
https://github.com/komiyamma/hm_normalize_formkd/blob/main/HmNormalizeFormKD/Program.cs

みたいになり、

https://github.com/komiyamma/hm_normalize_formkd/releases



HmNormalizeFormKD.zip に .mac と .dll が2つありますので、これで動作します。
(★必須:.zipは.dllも含まれていますので、ダウンロードしたら「ブロック解除」o
r「許可する」をしてください)


■動作環境 多分 v8.98以上 (くらい?)

■使い方

文字化け(というかフォント化け)しているファイルを開いて、
HmNormalizeFormKD.macを実行

完全互換性分解したものの、フォントにそれに対応するものがないよって場合は、元
の文字のままですので、完全というわけにはいかないことでしょう。

(「形の微妙な違いを吸収する文字」が表示中のフォントに存在しないなら変換でき
るはずがないので)



[ ]
RE:40569 変なフォントが入り込むことの解No.40570
abe_mashu さん 23/05/19 10:31
 
こみやんま様、でるもんた・いいじま様
ご教示大変ありがとうございます

先の投稿では例示として2つほど挙げたのですが、ひとつづつ修正をかけていく上で
はいいじま様の方法は良いと思いました。ただ、複数の人間でファイルを作り上げて
いくときに生じる現象なので、実は様々な文字が入れ替わってしまいます。
ひとつづつ探すのが結構大変そうですね

こみやんま様の方法ですが、初っ端の完全互換性分解という語で完全に躓きました。
すみません
多分unicodeの正規化
http://nomenclator.la.coocan.jp/unicode/normalization.htm
が参考となる資料と思いましたので、これから勉強させていただきます
もし間違っていたら、あるいはもっとわかりやすい試料がありましたら、教えて頂け
ますか?

ありがとうございます

[ ]
RE:40570 変なフォントが入り込むことの解No.40572
秀丸担当 さん 23/05/19 18:06
 
今回の文字については、部首を表しているもののようで、メイリオや游ゴシックなど
であっても普段は使うのを避けたほうがいい文字だと思います。
MS-IMEであれば画面右下のIMEアイコンも右クリックしてIMEパッドを表示して、U+2F
00付近の康煕部首を見るとどんなものがあるかわかります。
その上にもCJK部首補助というものもあるようです。

[その他]→[ファイルタイプ別の設定]→[デザイン]→[強調表示]で、これらの範囲を
強調して見分ける方法があります。
例えば、強調表示をユーザー定義にして、以下のものを追加します。

文字列は、
[\u2e80-\u2fdf]
正規表現だけON
表示方法は「特に強調表示2」(など目立つもの)

こうしておくと、この範囲の文字が検索しなくても常に目立つようになります。
こういった感じで、使うのを避けたい文字コード範囲を指定しておくと、普段開いて
いるときから、見つけやすくなります。

[ ]
RE:40570 変なフォントが入り込むことの解No.40575
こみやんま さん 23/05/19 20:31
 
>多分unicodeの正規化
>http://nomenclator.la.coocan.jp/unicode/normalization.htm
>が参考となる資料と思いましたので、これから勉強させていただきます
>もし間違っていたら、あるいはもっとわかりやすい試料がありましたら、教えて頂
>けますか?


そちらのような資料であっています。
https://learn.microsoft.com/ja-jp/dotnet/api/system.text.normalizationform?view=net-8.0


このような変換は珍しいものではなく、
普通にプログラミング言語に備わっており、「文字列型」のメソッド
で普通に変換(正規化)実行可能となっています。(20年くらい前から)

先にあげた

 https://github.com/komiyamma/hm_normalize_formkd/blob/main/HmNormalizeFormKD/Program.cs

で言えば、

temp.Normalize(NormalizationForm.FormKD);

で変換は終わっています。
tempはただの文字列型で、

```
string temp = "妙な表示がされてしまう文字が含まれた文章";
temp.Normalize(NormalizationForm.FormKD);
```

これだけで変換は完了するのです。

しかし、これ「だけ」の処理ですと、やたらめったら過剰に変換してしまいます。
「@」などすら「1」へと変換してしまうため、

```
今秀丸エディタで文章を見ている「フォント」で普通に見れている文字であれば、そ
の文字に関しては、変換(正規化)はしなくてもよい
```

という条件を追加して、変換していけばよいのです。

あるいは

```
「MS 明朝」で普通に見れる文字であれば、その文字の変換はしなくてもよい
```

といったようにWindows(日本語設定)なら絶対に入っている思いっきり「フォント名
を名指し」してもよいでしょう。

(先に投稿した内容で、マクロ側からフォント名を指定すればそのように出来る)


このようにすれば、1文字1文字変換を指定するといったことはなく、
「自動」で、かつ、「妥当性が高い」と思われている文字へと変換されます。


あとは「自動変換された」結果だけを見て、秀丸でパッと「元文章」と「変換後の文
章」を比較し、
色が付いた箇所を「目視」で「ハイハイ変換は妥当」とか
「ああー、こういう変換できましたかー」と確認すればよいかと思います。


[ ]