日本語と英語が混ざっている状態で大文字を小文字に置換すると化けます
フォームから、内容を入力してもらって、&jcode3::convert(*aaa,'sjis');
して、
$aaa =~ s/[A-Z]/\L$&/g;
print $aaa;
したところ(ソースはこんな感じだった気がする)、
見事日本語の漢字が文字化けしました。
で、
jcode::convert(*aaa,'euc');
でやるとうまくいきます。
でもSJISでやりたいのですが、どうしたらいいでしょうか。
回答(1)
1.

全角文字(2byte)の中の1byteが[A-Z]に該当して、
変換されてしまいます。
対処方法は以下の2通りが考えられます。
・urldecodeする前に小文字に変換する。
・eucにconvertした状態で小文字に変換してから、
再度sjisにconvertする。
(※第3水準や絵文字記号等sjisにしかない文字がロストする)
コメント(8)
文字化けとは関係ないですが、大文字を小文字にするなら、
$aaa = ~tr/A-Z/a-z/;の方がいいと思います。1文字マッチで、マッチ情報全体を参照して大文字に、というのは大げさすぎますw
ご質問の記述からすると、Perlは5系で、jcode.plでしょうか?これらのバージョンと入力された文字コード+できれば化けた文字列を書いて頂いた方がいいかもしれません。
Perlの場合、環境にもよりますが、他にJcode.pm/Encode.pmなど変換の選択肢はあります。
#ブラウザで出力を確認していると思いますが、ブラウザがeucになってる(HTMLで文字コードを指定していない)とか、ないですよね?
>>#1
いや~、Perlも始めたばっかりでよくわからないんです・・・
ただ、結構あいまいに書いても動くので・・・
Perlは、5.何番かです。
jcode.plを使っています。
化けた文字は「天気」です。
ブラウザのエンコードは絶対におかしくありません。
で、送信したのは、「SJIS」、
Perlのコードも「SJIS」で作ってあります。
なるほど、問題点が見えましたw
>>#2
あのですね・・・SJISで送信したものをSJISで出力するのに、変換する必要がなぜあるのでしょう?
ブラウザ側で送信する前に小文字に変換;
document.form1.name1.value=document.form1.name1.value.toUpperCase();
すれば、それでいい話だと思いますが。。。
Perl内でどうしてもやるなら、ひみつさんの回答1の方法か、単純に
$aaa=uc($aaa);でいい気がします。uc(UpperCase)は今のPerlならたぶん大丈夫です。
他の正規表現を使うような処理をするのなら、eucにした方が無難です。スクリプト自身もeucにすべきです。utf8にするという選択肢はアリだと思いますが。
Perlのバージョンは、まさか、今更4系はないと思いますので、6系がまだ普及していないことを考えると、5系なのはわかっているのですが、5.8を境に微妙に違うので聞いてみましたが、たぶん、そういう問題ではなかったようです。
CGIとして動かすスクリプトの文字コードは、
動かす環境の文字コードに合わせるべきです。
ほとんどのLinux/Unix系OSではEUCが使われており、
このような環境であればEUCで記述されるべきです。
環境構築時にUTF8を選択していればUTF8にするべきです。
ただし、一部のftpソフトが文字コード変換機能を
持つことも考慮してよいとおもいます。
ShiftJISの天気は16進数表示で
93 56 8B 43の4バイトになりますが、
56はV、43はCのASCIIコードに該当するため、
ShiftJISのままでは置換できません。
>>#3
の記述ミスりました。大文字にしてしまいました><
document.form1.name1.value=document.form1.name1.value.toLowerCase();
で、
$aaa=lc($aaa);
の間違いです。失礼しました。
今後のことを考えるなら、
#フォームデータを受け取る
#受け取ったものを全てeucに変換
#・・・目的の処理
#SJISに変換して出力
の手順で書く癖をつけた方がいいかもしれません。
第3水準以上の文字が多発するフォームや、
携帯のような絵文字に対応する必要のあるケースでは、
EUC変換することによって文字が化けたり消失したりするので
気をつけてください。
そうか!JavaScriptという手があったか!!
でも、ブラウザによってはできないかもしれない・・・
eucでやることにしました。




