プロが教えるわが家の防犯対策術!

iモードの絵文字をフォームから送信された時の処理をperlでしています。
具体的にはフォーム内容をデコードする前に、文章に絵文字が含まれているか16進数の状態でチェックします。含まれていれば、それらを10進数表記に変え、データとして保存しています。
ここまでは上手くいったのですが、問題が発生しました。
iモードからはShift_JISでデータが送信されてきますが、このデータの中に2バイト目の文字コードが絵文字の1バイト目の文字コードと同じであり、かつその次の文字の1バイト目が絵文字の2バイト目と同じだった場合に間違ってその文字を絵文字として処理してしまいます。
つまりある2文字の2バイト目と1バイト目が偶然絵文字と同じ文字コードだった場合に絵文字として取り扱ってしまうのです。(例:滲滲)
これを防ぐ方法が解る方がいらっしゃればご回答下さいm(_ _)m

※perlメモの「ただしくパターンマッチさせる」をShift_JISに変えてやってみましたが、うまくいきませんでした。。。

A 回答 (1件)

単なるパターンマッチでは上手く行かないので私は以下のようなスクリプトを書きました。

参考にして下さい。

sub han2zen{

local($input_string) = @_;
$temp_string = '';#空の文字変数を用意
$temp_position = 0;
$sjis_flag = 0;

$zenkana_table = '。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゛゜';
&jcode'convert(*zenkana_table,"sjis");

while($temp_position < length($input_string)){
$temp_figure = substr($input_string,$temp_position,1);

#sjisの上位バイト
if ($sjis_flag == 1){
$temp_string = $temp_string.$temp_figure;
$sjis_flag = 0;
}elsif (ord($temp_figure) >=129 && ord($temp_figure) <= 159 || ord($temp_figure) >=224 && ord($temp_figure) <= 239){
$sjis_flag = 1;
$temp_string = $temp_string.$temp_figure;
}elsif (ord($temp_figure) >=248 && ord($temp_figure) <= 249){
$temp_position++;
$sjis_code = ord($temp_figure)*256+ord(substr($input_string,$temp_position,1));
#$temp_string = $temp_string."&#$sjis_code;".chr(59);
$temp_string = $temp_string."&#$sjis_code\x3b";
}elsif (ord($temp_figure) >=161 && ord($temp_figure) <= 223){
$temp_string = $temp_string.substr($zenkana_table,(ord($temp_figure)-161)*2,2);
}else{
$temp_string = $temp_string.$temp_figure;
}
$temp_position++;
}
$temp_string;
}
    • good
    • 0
この回答へのお礼

返事が遅くなってしまってスイマセン!
とても参考になりました。ありがとうございました。

お礼日時:2001/11/22 15:26

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