アプリ版:「スタンプのみでお礼する」機能のリリースについて

これまでeuc-jpで作られていたHTMLフォームページをutf-8に変更したところ、フォームメールCGIの文字列処理で「~」「-」「 」(半角スペース)など一部の文字が文字化けするようになってしまいました。
Jcode.pm → Encodeに変更してみても症状は変わりませんでした。
Encodeは初めて使うのですが、過去ログを見てもよく分かりません・・・
どうぞお力添えをお願いします。


(1)下記のperlの記述方法で間違っている箇所はありますか?

(2)正しく出力できる方法がありましたら、教えてください。

(3)http://oshiete1.goo.ne.jp/kotaeru.php3?q=1540626 で話されている、右側の折れ曲がった「~」はどうやって入力するのでしょうか?

(3)perl側もutf-8で記述すれば、文字化けなど発生せずに処理出来るものなのでしょうか?


↓perl5.8 文字コードeuc-jp
#!/usr/bin/perl

use Encode;####

if ($ENV{'CONTENT_TYPE'} =~ /application\/x-www-form-urlencoded/i) {

binmode(STDIN);
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
@data_s = split(/&/,$buffer);
foreach $buffer (@data_s) {
($key,$value) = split(/=/,$buffer);
$value =~ tr/+/ /;
$value =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C",hex($1))/eg;
$value = encode("euc-jp", $value);####
print "$key = $value\n";
}
}

A 回答 (2件)

まず、Encodeモジュールのencodeメソッドとdecodeメソッドは単純に文字コードの変換を行うものではありません。


詳細は参考URLを見てください。簡単に言うと、特定の文字コードの文字列とPerl内部のUTF-8コードとの相互変換をするためのメソッドです。

Encodeモジュールを使って文字コードの変換をするときは、from_toメソッドで、

Encode::from_to($value,"utf-8","euc-jp");

とするのが正しいです。

------------------------------------------------
これを踏まえて。

「~」「-」「 」が正しく変換されない理由は、Encodeによるものではないと思われます。
上記文字はベンダ依存文字で、元のコードからUTF-8にどうマッピングするかは文字コードを変換するプログラムの実装次第です。
たとえば、Windowsのブラウザ(shift-jis)からUTF-8に変換し、そのUTF-8を別のシステムでEUC-JPに再度変換するとコードポイントが異なるため文字化けが発生する可能性があります。

Perlでも内部で扱う文字変数を入出力すべてUTF-8で扱うようにすれば文字化けは起こらなくなります。
が、それでも後で別の文字コードに変換しようとすると文字化けする可能性があります。(変換プログラム次第)
どうしてもEUC-JPを使いたい場合、自ら変換表を書くのが一番確実かも?と思います。

決定的な解決策は示せませんが、ご参考までに。

参考URL:http://www.pure.ne.jp/~learner/program/Perl_unic …
    • good
    • 0
この回答へのお礼

twinkleluz様、丁寧なご返答ありがとうございます。

色々と分からないことが多かったので、しばらく教えていただいたことについて調べてみたのですが、 http://lists.sourceforge.jp/mailman/archives/tcl …を見て、ようやく理解しました。

EUC-JPに固執するより、UTF-8で処理するよう検討してみた方が良いのかもしれませんね。

有用な情報感謝いたします。
ありがとうございました。

お礼日時:2006/01/11 02:14

Perl 5.8 で、プログラムそのものは euc-jp で書いてあって標準入力と標準出力を utf8 にしたいのであればこれを最初の方で指定するだけでいいと思いますよ。



use encoding 'euc-jp', STDIN => 'utf8', STDOUT => 'utf8';

use Encode; や encode(), decode() による変換は不要です。

注: 「~」などの変換についてはこれでいいかどうか分かりません。
    • good
    • 1
この回答へのお礼

noboru2000様、ご返答ありがとうございます。
ご指摘いただいた方法で試してみたのですが、全ての文字が「????」などと表示されてしまいました。
「use encoding」についてもう少し勉強してみます。

お礼日時:2006/01/10 14:36

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