半角カナを全角カナに変換するには&フォーム送信時の文字コード

[上に] [前に] [次に]
いけちゃん 1998/02/27(金) 10:26:21
たびたびすみません、また質問させてください。
# 排他処理はまだやってないのに.....。

現在、イントラネットみたいなことをしているのですが、
フォームで半角カナを入力されることが多く、ネスケとIEでは相互に
表示されない(ネスケでフォームに入力すると、ネスケしか表示できず、
IEでは化ける。逆も同じ)ので、半角カナは全て全角カナに変換する
ことにしました。

そこで、jcode.pl内の&jcode'z2h_jisを利用して、変換することにしたのですが、
ネスケで入力した分は変換できるものの、IEで入力した分は変換できません。
IEで利用されている半角カナはいったいなんなのでしょう??
&jcode'z2h_sjisや&jcode'z2h_eucも試したのですが、ダメでした。
なお、半角「アイウエオ」をURLエンコードしたものは次の通りでした。
ネスケ:%1B%28I12345%1B%28B
IE   :%0E12345%0F
これをデコードすれば、文字コードがわかりそうですが、
私にはその力がない.....。.申し訳ないですが、よろしくお願いします。

また、フォームに関して、もう一つ基本的なことで質問させてください。
フォーム送信時の文字コードはどのように決まるのでしょうか?
# こんなことも知らずにフォームのページを作っているとは
  自分でも恐ろしいのですが。
私の経験則では、フォームを記入するページの文字コードに適合しているのでは
ないかと思っているのですが。
だから、現在作ってるイントラネットらいくなものもフォームを記入するページが
JISで書いているので、フォームで送信された内容もJISだと思いこんでいるのですが、
これはとってもやばいでしょうか?
ブラウザによって、違う場合もありうるのかな?

どうぞよろしくお願いします。

miyasiro 1998/02/28(土) 05:16:13
jcode.pl をちゃんと読んだ訳ではなく、雰囲気だけで書いているのですが、まず、フォームから受け取った文字列をデコードして $line に格納し、
 &jcode'convert(*line,'sjis');
で、文字コードを Shift-JIS に統一します(ここでは、jcode.pl がうまくShift-JISの半角カナに変換してくれることを期待してます)。それから、
 &jcode'h2z_sjis(*line);
で、全角カナへの変換を行うというのではいかがでしょう(z2h_sjisではない)。

>私の経験則では、フォームを記入するページの文字コードに適合しているのでは
>ないかと思っているのですが。
私の勘では(^^;)、そんなことはないと思うのですが、どのような「経験則」によるものなのでしょうか?

miyasiro 1998/03/01(日) 01:38:27
 やっぱり勘だけでものを言ってはいけませんね(^^;)
 うちの環境(Windows95のNN4.01とIE3.02)でShift-JISとJISとEUCのページのFORMがCGIに渡す文字コードを調べてみたら、いけちゃんさんの「経験則」どおり、FORMのページの文字コードでURL符号化してました。疑って申し訳ありません。(あまりに意外なんで驚いてます)
 それから、文字コードが JIS で IE の場合は、上の方法も使えませんでした。半角カナを7bit化した文字列(アイウエオ→12345)をSO(%0E)とSI(%OF)で囲むのが正しいのかどうかは分かりませんが、とりあえず IE でも全角カナに変換するために、下のような方法ではいかがでしょうか。# for IE の行で、SO(%0E)とSI(%OF)に挟まれた7bitJISの半角カナを8bitJISの半角カナ(Shift-JISも同じ)に変換しています。

&jcode'convert(*line,'sjis');  # Shift-JIS に変換
$line =~ s/\x0e([^\x0f]+)\x0f/&j7k2j8k($1)/ge; # for IE
&jcode'h2z_sjis(*line); # 半角カナ→全角変換

sub j7k2j8k {
local(@s ,$s,$c) = split(//,$_[0]);
$s .= pack("C",unpack("C",$c)+0x80) while $c = shift(@s);
return $s;
}

miyasiro 1998/03/01(日) 02:13:39
またまたオオボケでした(^^;)
いけちゃんさんは、NN なら変換できるって仰ってるんだから、IE で入力したものも NN の形式に変換してやればいい訳ですよね。
ということで、$line の半角カナを全角カナに変換する前に、下記を挿入してみて下さい。
$line =~ s/\x0e/\e(I/g;
$line =~ s/\x0f/\e(B/g;

いけちゃん 1998/03/02(月) 11:11:05
[[解決]]
ありがとうございました!
$line の半角カナを全角カナに変換する前に、
$line =~ s/\x0e/\e(I/g;
$line =~ s/\x0f/\e(B/g;
を挿入したら、うまく変換することができました。

結局、JISコードの半角カナは、NNでは8ビット半角カナとして、IEでは7ビット半角カナとして扱っているため、変換がうまくいかなかったのですね。
よくわかりました。

本当に助かりました。
また、質問すると思いますが、どうぞよろしくお願いします。

[上に] [前に] [次に]