目ずらし記事

mezalaのブログ

半角カナ系文字を全角に変換

めずらしきこと。

いや,別に珍しくもなんともないのだが。
各担当職員が自力でHTMLを書いて送ってくる場合,たまに半角カナ(1バイト仮名文字)が多分本人も気づかないうちに使われていることがある。こういうのは修正するのも大した手間ではないが,データベースから出力したリストなどは往々にして特定の項目に半角カナがごっそり使われていて,ちょっとゲンナリしたのでマクロを作ってみた。
いまさら気づいたのだが,製品版のZENHAN.defは細かなワザが使われていて,久々に感心した。「ヴ」に対応するようにしたのものの,なんとなく泥縄になってしまって,結局製品版の部品を流用することに。まぁ,普通のプログラミングでも関数の使い回しは正しい省力なので,よしとしよう。もう少し高速化できそうな気もするが,まぁ実用的だろう。

= KANA2ZEN.def v0.10
#if 0
半角カナ系文字を全角に変換
核は製品版ZENHAN.defの部品を流用し,「ヴ」に対応
対象はファイル全体,半角カナ類を検索しつつ変換するので多少高速化
#endif
 *m
1 ""    ?.
        (vw)??{ &m("VWXが導入されていません.") . }
        (mr==$80)?{ &m(32) . }
        RX[+, ps[=pa, mp[=2, mi[=1,
        k="。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソ$
        タチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゛゜$
        ガギグゲゴザジズゼゾダヂヅデドパピプペポバビブベボヴ",
        &s #M &> &Le(r,wa+126) #^ #< #n ;マーク位置を保存
        #F "[。-゚]+" #m                  ;半角カナを探して
 :l     #c (r)??{ &01 >l }              ;全角を上書きする
        #^ #< #g &> &Le(wa+126,r) #U    ;元の位置に戻る
 :z     mi], mp], ps], RX],
        &d #] .
0:      (3+$)."$[4]"
1:      ; ---- kana han to zen ----
        (cd<'。' || cd>'゚')?. c=cd-$A1, (c<0)?.
        #d
        (cd=='゙')?{ (c>20 && c<46 || c==18)?{ c+=42, (c==60)?c88, #g } }
        (cd=='゚')?{ (c>40 && c<46)?{ c+=37, #g } }
        #s
        p=k+c*2,
        c=p..0, &o(c!!)
        >^
 *
[Variables]
        k       カナ一覧(清音部は日本語ASCIIカナのコード順)
        c       変換用コード差
        p       変換用2バイト
[Buffers]
        pa      as ps
        [4]     マーク位置保存用
[History]
2009/02/17 0.10 初版
[Notes]
濁点・半濁点の有無を逐一チェックしている部分を改善したい

まぁ,ふつうこういうのはSEDを使ってやるんだろうけど。