![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
なぜか「ひらがな」を偶数個送るとデコードしません
例
「あ」→「あ」
「ああ」→「縺ゅ≠」
「ああい」→「ああい」
「ああいい」→「縺ゅ≠縺・>」
「ああ質問」→「ああ質問」
「ああアあ」→「ああアあ」
今の所漢字やカナを含めて偶数個では問題無いです。
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件)
- 最新から表示
- 回答順に表示
No.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。あとは↑と同様
等です
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JSONで文字列が長い時
-
メモリをアドレスを直接指定し...
-
【VB2005】メソッドに渡したデ...
-
Application.ScreenUpdating = ...
-
「*:*」って何を意味するのでし...
-
構造体の変数の値を、動的に取...
-
セレクトメニューで2つの項目...
-
UWSC SLCTBOXもしくはSELECTに...
-
pythonで演算子を変数に代入す...
-
【至急!!!】python言語で本を見...
-
c言語 16進数の2進数への変換
-
linuxにおけるCの自作ヘッダフ...
-
FindFirst を複数条件で検索
-
2つのpythonがあって、一方で...
-
Pythonの配列を入力する方法に...
-
int(input("○○"))の使い方
-
ACCESS テキストボックスを隙...
-
formで特定のinputを送信しない...
-
セレクトボックスから別窓にジ...
-
C言語のflagの使い方が分かりま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JSONで文字列が長い時
-
メモリをアドレスを直接指定し...
-
linq で 楽天ウェブサービスのX...
-
CGI(Perl)で、Net::FTPを使いたい
-
map(STL)でinsertを行いたいで...
-
【C#】数値の範囲チェックについて
-
途中まで出来ているのですが‥(D...
-
フォームで入力した値を表示し...
-
リロード後にプルダウンの選択...
-
ラズパイで感圧センサーを動か...
-
VB2010 のユーザコントロールの...
-
アンケートフォームのvalueの値...
-
formのvalueについて
-
cout, 小数点以下2桁を表示す...
-
Application.ScreenUpdating = ...
-
formで特定のinputを送信しない...
-
16進の10進変換について
-
文字の横にプルダウンを表示さ...
-
python3について。
-
<SELECT>タグの折り返し
おすすめ情報