💪

いまさらはしごだか対応

2023/11/09に公開

これは何の話?

いわゆる「はしごだか(髙)」が文字化けして困るので「高」に置き換えたいという場合があります。(JISコードで印刷コマンド指定する方式のプリンタなど)

C# でShift-JIS扱うときのツールとして整理してみました。

いまどきめったに出番ないですがw

実装コード

https://gist.github.com/panda728/4301d5f82bec7e9619439c07587f4381

参考リンク

https://qiita.com/mindwood/items/3cc4fbf76caa38aa743c

これまで異体字の適切な置換候補リストアップはあきらめていました。
@mindwoodさんの記事にたどり着き、異体字のリストを拝見しました。

自前のプログラムでも置換処理を実装したいので
C#で変換しやすいように組み込んでみたのが上記の実装コードです。
おかげさまで、はしごだか以外の文字にも対応できました。
(元記事のような完全な判定は不要だったので異体字の置換のみ移植させていただきます)

置換対象について

対象の文字は以下の部分です。
他にも必要であれば、以下の部分に追加ください。

    readonly static (char ng, char ok)[] _canNotPrintChars = new (char, char)[] {
        ('髙','高'),('﨑','崎'),('濵','浜'),('賴','頼'),('瀨','瀬'),('德','徳'),('蓜','配'),('昻','昂'),('桒','桑'),('栁','柳'),('犾','犹'),('琪','棋'),
        ('裵','裴'),('魲','鱸'),('羽','羽'),('焏','丞'),('祥','祥'),('曻','昇'),('敎','教'),('澈','徹'),('曺','曹'),('黑','黒'),('塚','塚'),('閒','間'),
        ('彅','薙'),('匤','匡'),('冝','宜'),('埇','甬'),('鮏','鮭'),('伹','但'),('杦','杉'),('罇','樽'),('柀','披'),('﨤','返'),('寬','寛'),('神','神'),
        ('福','福'),('礼','礼'),('贒','賢'),('逸','逸'),('隆','隆'),('靑','青'),('飯','飯'),('飼','飼'),('緖','緒'),('埈','峻')
    };

使用法

呼び出す方法ですが、引数がReadOnlySpan<char>のため文字列にAsSpan()をつけて使います。

    var src = "髙﨑";
    var replaced = src.AsSpan().ToSafeChars();
    Debug.WriteLine(replaced);
    // 高崎

その他機能

おまけでShift-Jis扱うときに頻出の機能も実装していますので参考になれば

method comment
ToWide 全角文字に置換
ToNarrow 半角文字に置換
GetSjisByteCount Shift-JISのbyte数取得
SubstringSjisByteLength Shift-JISのbyte数で切り出し
EncodeSjis byte配列をShift-JIS文字に変換

Discussion