UTF-8 で入出力している Web システムがあるんだけど、最終的に Winodows PC ベースのシステムにデータ持ち込んで印刷してるんで、Shift_JIS(てか、CP932だな)に変換できない文字は入力エラーにしてほしいという要望が。
元々、UTF-8 の 3バイト文字で 0xE28480 から 0xE38FBE までの文字(例外あり)は入力制限してたんだけど、もう少し厳密に・・・という話。
予算的に自前の変換表作ってというのは厳しいので、なんか良いものがないかなあと探してたんだけど、Perl の Encode::from_to メソッドが使えそう。
これ、Encode モジュールのメソッドで、
と書けば、変数 $text の内容を UTF-8 から Shift JIS に変換してくれるんだけど、ここにオプション XMLCREF をつけると、変換できなかった文字(UTF-8 に有って、Shift JIS に無い文字)を数値文字参照コードで出力してくれる。
例えば「ハシラダカ」と呼ばれる「髙」の文字は Shift JIS には無いので、「髙林」を
という具合に変換してやれば、
という結果が $text にセットされる。髙 が数値文字参照コードね。
ちなみに、Windows 拡張版の Shift JIS(Windows-31j)であれば「ハシラダカ」も文字セットに含まれているので、
であれば、そのまま「髙林」が結果に返ってくる。
もちろん、Windows-31j に含まれていない文字は数値文字参照コードで返ってくる。
もう、これでいいんじゃね?(笑)
変換後の文字を↓こんな風にチェックして、'OK'、'NG' を返してやる API を作れば、多言語で作成した Web システムからも呼べるしね。
元々、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 とかになっちゃうんだろうけど。