電気ウナギ的○○

About Home

Perl で UTF-8→Shift JIS 変換不可文字チェック API を作る

shinoda (2017年7月12日 08:16)
UTF-8 で入出力している Web システムがあるんだけど、最終的に Winodows PC ベースのシステムにデータ持ち込んで印刷してるんで、Shift_JIS(てか、CP932だな)に変換できない文字は入力エラーにしてほしいという要望が。

元々、UTF-8 の 3バイト文字で 0xE28480 から 0xE38FBE までの文字(例外あり)は入力制限してたんだけど、もう少し厳密に・・・という話。

予算的に自前の変換表作ってというのは厳しいので、なんか良いものがないかなあと探してたんだけど、Perl の Encode::from_to メソッドが使えそう。

これ、Encode モジュールのメソッドで、

Encode::from_to( $text, "UTF8", "Shift_JIS");

と書けば、変数 $text の内容を UTF-8 から Shift JIS に変換してくれるんだけど、ここにオプション XMLCREF をつけると、変換できなかった文字(UTF-8 に有って、Shift JIS に無い文字)を数値文字参照コードで出力してくれる。

例えば「ハシラダカ」と呼ばれる「髙」の文字は Shift JIS には無いので、「髙林」を

Encode::from_to( $text, "UTF8", "Shift_JIS", Encode::XMLCREF );

という具合に変換してやれば、

髙林

という結果が $text にセットされる。髙 が数値文字参照コードね。
ちなみに、Windows 拡張版の Shift JIS(Windows-31j)であれば「ハシラダカ」も文字セットに含まれているので、

Encode::from_to( $text, "UTF8", "CP932", Encode::XMLCREF );

であれば、そのまま「髙林」が結果に返ってくる。
もちろん、Windows-31j に含まれていない文字は数値文字参照コードで返ってくる。

もう、これでいいんじゃね?(笑)

変換後の文字を↓こんな風にチェックして、'OK'、'NG' を返してやる API を作れば、多言語で作成した Web システムからも呼べるしね。

if ($text =~ /\&\#[^\;]+\;/) {
    return('NG');
}
return('OK');

いやあ、Perl 良いわあ。
セキュリティとか考えても、実際、こういう枯れた技術を使うのは '吉' なんだけど、ま、チーム開発のやりやすさとか、メーカーからの公式サポートとか、他にも理由があって Java とか VB.NET とかになっちゃうんだろうけど。

電気ウナギ的○○

電気ウナギ的○○

About Back

コメント(0)

電気ウナギ的○○

電気ウナギ的○○

About Back

トラックバック(0)

トラックバックURL: https://blog.netandfield.com/mt/mt-tb.cgi/4479

電気ウナギ的○○

About This Site

電気ウナギ的○○
岩国在住。広島で働く超零細IT企業社長のいわゆる社長日記。
何か、酒と食い物のことばかり書いているようで・・・お察しのとおり、肥満体です:-)


2011/06/24
iPhone用サイト公開

Create with jQuery, jQTouch.


CLOSE