CGI-BBS > CGI > Perl > Perlの改造で半角文字を全角文字したい。


カレッヂ
カレッヂ


質問者 バカボン  投稿日 2004/6/25(金) 04:18:29
以前、この質問にsimさんよりお答えいただきましたが
メールもご返事いただきありがとうございます。
ところでさっそくテストを行ったところ、valueでデータを保存する項目に関しては
文字化けすることなく表示されますが、入力画面で

<TEXTAREA rows="12" cols="10" name="tns">攬集屋ン</TEXTAREA><BR>
というように<TEXTAREA>変数</TEXTAREA>となっている入力画面では文字化けします

 if ($ENV{'REQUEST_METHOD'} eq "POST") {read(STDIN,$query_d,$ENV{'CONTENT_LENGTH'});}
 elsif($ENV{'QUERY_STRING'}){$query_d = "$ENV{'QUERY_STRING'}";}

 @pairs = split(/&/,$query_d);

 foreach(@pairs){
  ($key,$value) = split(/=/);
  $value =~ tr/+/ /;
  $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
  $value =~ s/</&lt;/g;
  &jcode::h2z_sjis(\$value); #ここが半角→全角
  &jcode::convert(\$value,'sjis');#ここがsjisに統一
  $in{"$key"} = "$value";
 }

のように指定しても変換されていないのか?分かりませんが、文字化けを起こしてしまいます
このソースのみで<TEXTAREA>内に入力された半角文字は変換することができるのでしょうか?
<TEXTAREA>内の入力部分だけ文字化けを起こすため、疑問におもったのですが・・・・

ご教授願います

プロバイダ参照:
サーバのOS:UNIXサーバ
パソコンのOS:WinNT系
エディタ:perleditor
FTPソフト:ffftp
サーバ移転:していない
改造:している
CGI習熟度:advanced

質問者 バカボン  [削除]  投稿日 2004/6/25(金) 04:53:25
追伸で、『サカナ屋さん』というように半角カナと全角文字の組み合わせでは、半角カナは文字化けせずに表示されますが
半角カナ単独だと、valueの値でも文字化けを起こしてしまいます。
回答者  [削除]  投稿日 2004/6/25(金) 11:51:23
変換されないのでしたら、
require 'jcode.pl';
は記述してありますか?
jcode.plをアップロードしてありますか?
スクリプトの漢字コードは何ですか?
回答者 sim  [削除]  投稿日 2004/6/25(金) 12:45:16
変数 というのはどのような変数でしょうか?
クエリを受け取ったデータでしょうか?
良く分からなければ文字化けする変数の文字コードを調べてみてください。
同じくjcode.plに含まれるgetcodeで取得できます。

文字化けには文字コードがどのようになっているのかを把握する必要があるかと思います。

1.スクリプトの文字コード
2.入力された文字コード
3.出力する文字コード

これらを全て把握しておけば、文字化けはあまり起きないのではないかな?と思います。

下記はテストに使った記述です。
-----------------------------------------------------------------

#!C:/perl/bin/perl

require 'jcode.pl';

print<<"HTMLTAG";
Content-type: text/html

<form method="GET">
	<input type=text name=text value="サカナ屋さん">
	<textarea name=text2 rows=2 cols=10>サカナ</textarea>
	<input type=submit>
</form>
HTMLTAG

@pairs = split(/&/,$ENV{'QUERY_STRING'});

foreach(@pairs){
	($key,$value) = split(/=/);
	$value =~ tr/+/ /;
	$value =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("H2", $1 )/eg;
	&jcode::h2z_sjis(\$value);
	&jcode::convert(\$value,'sjis');
	$in{"$key"} = "$value";
}

while(($k,$v) = each %in){
	print "文字コード=".&jcode::getcode(\$v)."<br>";
	print "$k=$v<hr>";
}

-------------------------------------------------------------------------------
質問者 バカボン  [削除]  投稿日 2004/6/25(金) 18:31:43
@さん simさん早速レスありがとうございます

私のソースの書き方が悪いのか、やはり症状が改善されません。
そこで、今使ってるソースやjcode.plなどを掲示板に公開するのが
大きすぎるため、下記のURLにアップしてみました。
もし、お手数でなければ実際に、ソースの前後などおかしい部分がありましたら
ご指摘をお願いできないでしょうか?

http://www.tekipaki.jp/~net_idol/sample/
回答者 しあわせのツボ  [削除]  投稿日 2004/6/26(土) 02:21:29
半角カナ「だけ」を入力していませんか?
そうであるなら、技術的にどうしようもありません。

もともと半角カナは、PCの処理能力が低い時代にむりやり日本語を扱わせるために
考え出されたもので、いろいろと技術的問題があり、
「半角カナだけが書かれた文書では文字コードを特定できない」のも
それらのひとつです。
しかも、通常「日本語は漢字とひらがなが適度に混じっている」という前提で
文字コードを判定するので、コード判定を間違える率が非常に高くなります。
また、jcode::h2z_sjisは「入力されたものはシフトJISである」と
決め打ちしている関数なので、SJIS以外で入力されたものは
運が悪いととんでもないことになります。

結局、「半角カナ禁止」にするのが最もいい方法だと思います。
いろいろと細工を施せば、何とか逃げる方法もないではありませんが…。
質問者 バカボン  [削除]  投稿日 2004/6/26(土) 10:06:07
しあわせのツボさま
ご返信ありがとうございます。
おっしゃるように、入力・登録・表示かんして
半角カナ+全角文字 ○
半角カナ ×

といったようになります。
回避する方法があるにはあるとおっしゃっていますが
それをするにはかなりの大幅な変更が必要なのでしょうか?
また、お手数でなければ具体的に変更する点は
どういった部分を変更すればよろしいでしょうか?
入力する際に半角カナを強制的にsjisだと決め打ちさせるというのは
危険なのでしょうか?
回答者 しあわせのツボ  [削除]  投稿日 2004/6/28(月) 16:01:30
jcodeが判定できないなら、判定できるようヒントを与えてやるか、
自動判定にまかせず自前で判定して、そのコードで処理すれば良いと思います。
たとえば、<form>の最初に
<input type="hidden" name="foo" value="知">
(nameは任意、valueは任意の全角文字。全角スペースとかが便利かも)
などと置いてやれば、その値が%92%6dならSJIS、%c3%ceならeuc、
%43%4eが含まれていればJIS、同じく%77%e5ならUTF-8、と確定できますよね。
それをもとに、jcode::h2zにお願いすればいい訳です。

一般的なデコードルーティンだと、jcodeはformの項目ごとにコードを判定していますから、
例のように半角カナ6文字だと、たった6バイトをもとに考えないといけません。
あまりに手がかりが少なすぎますから、それで間違っても文句は言えないでしょう。

返信(回答)する

 


Web裏技