なぜか「ひらがな」を偶数個送るとデコードしません
例
「あ」→「あ」
「ああ」→「縺ゅ≠」
「ああい」→「ああい」
「ああいい」→「縺ゅ≠縺・>」
「ああ質問」→「ああ質問」
「ああアあ」→「ああアあ」
今の所漢字やカナを含めて偶数個では問題無いです。
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で質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Pythonで会員サイトの自動ログイン ID Nameがない 1 2022/12/16 02:09
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- HTML・CSS ただいま勉強始めたての初心者です。フォームを縦並べにしたいです。 2 2022/11/20 17:18
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- PHP $_SESSIONについて教えて下さい。 2 2023/03/02 09:18
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- Visual Basic(VBA) VBA シート上にドロップダウンリストを作り、予め指定値をセットしたいのですが 1 2023/03/25 15:15
- JavaScript 電車の運賃を出すプログラムを作っています。 2 2022/06/22 09:36
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JSONで文字列が長い時
-
メモリをアドレスを直接指定し...
-
デコードできない時があります><
-
【C#】数値の範囲チェックについて
-
Perl/CGIでスロットマシンを作...
-
Application.ScreenUpdating = ...
-
文字の横にプルダウンを表示さ...
-
VB6で、長い時間かかる処理...
-
実行時エラー 3020の対策
-
構造体の各データの表示につい...
-
セレクトメニューで2つの項目...
-
出来ているHTMLに無料CGIをつけ...
-
pythonで演算子を変数に代入す...
-
malformed header from script....
-
formで特定のinputを送信しない...
-
Pythonを用いてCGIを作る勉強を...
-
<SELECT>タグの折り返し
-
どちのほうがすきですか?
-
少数点以下の桁数について
-
セレクトボックスの内容を中央寄せ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JSONで文字列が長い時
-
メモリをアドレスを直接指定し...
-
【C#】数値の範囲チェックについて
-
Perlでアルファベットを数...
-
途中まで出来ているのですが‥(D...
-
フォームで入力した値を表示し...
-
linq で 楽天ウェブサービスのX...
-
リロード後にプルダウンの選択...
-
CGIからメールに書き出しする際...
-
map(STL)でinsertを行いたいで...
-
半角スペースが有効にならない。
-
CGI(Perl)で、Net::FTPを使いたい
-
iteratorの再利用について
-
Visual Basicで作成したプログ...
-
クリックしたら順番に並び替わ...
-
ラズパイで感圧センサーを動か...
-
デコードできない時があります><
-
パターンマッチで変数でマッチ...
-
gpioを使ってSPIをシミュレーシ...
-
Application.ScreenUpdating = ...
おすすめ情報