dポイントプレゼントキャンペーン実施中!

なぜか「ひらがな」を偶数個送るとデコードしません

「あ」→「あ」
「ああ」→「縺ゅ≠」
「ああい」→「ああい」
「ああいい」→「縺ゅ≠縺・>」

「ああ質問」→「ああ質問」
「ああアあ」→「ああアあ」
今の所漢字やカナを含めて偶数個では問題無いです。

use lib './lib';
use Jcode;
read(STDIN, $POST, $ENV{'CONTENT_LENGTH'});
@_post = split (/&/,$POST);
foreach $tmp (@_post)
{
($name,$value) = split (/=/,$tmp);
$value=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
Jcode::convert($value,"sjis");
$box{$name} = $value;
}
デコード処理はこんな感じです。
JcodeはJcode-2.07を使ってます。

独自で色々調べたのですが解決策が見つからず大変困っております。
宜しくお願いします。

A 回答 (1件)

コード判定に失敗しています。



自動判定は
・特定のコーディングにだけ出てくるバイトパターンがあったら、そのコーディングに確定
・特定のコーディングには存在しないバイトパターンがあったら、そのコーディングを候補から除外
というのが基本的な方法です。精度を上げるために、統計を取る等もあります。

このため、文字数が多い程精度があがります。少ないと誤判定するケースが増えます。

手許にあるperl + Encode::Guessで試すと
UTF-8でのあ「ああ」は 「shift_jis or utf-8 」となります。shift_jisかUTF-8か判断ができなかった、という意味です。
これは、shift_jisと誤判定される可能性があることです。

そうすると、
UTF-8「ああ」
→sjisと誤判定
→Jcode::convert($value,"sjis","sjis");と動作
→sjisからsjisなので変換されない = UTF-8「ああ」のまま
→これをsjisとして出力した結果「縺ゅ≠」
となり、現象と一致します。


対策は
・文字列をもっと長いものにして、誤判定を防ぐ。複数単語の処理だったら、単語ごとではなく、全部を一気に変換してから単語に分割する
・入力が決まっているなら、 Jcode::convert($value,"sjis","utf8");などと変換元を明示する
・判定用の文字列を別途用意して、 入力のコーディングを確定しておく。例えば、判定用に「あ」を使って「%E3%81%82」だったらUTF-8。あとは↑と同様
等です
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!