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

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 とかになっちゃうんだろうけど。

トラックバック(0)

このブログ記事を参照しているブログ一覧: Perl で UTF-8→Shift JIS 変換不可文字チェック API を作る

このブログ記事に対するトラックバックURL: https://blog.netandfield.com/mt/mt-tb.cgi/4479

コメントする

このブログ記事について

このページは、shinodaが2017年7月12日 08:16に書いたブログ記事です。

ひとつ前のブログ記事は「よもや、サンラーザーサイ麺がこれほど辛かろうとは(^^;」です。

次のブログ記事は「なっちゃんの生ビールが飲めたからそれでいいのだ」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら