これまで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";
}
}
No.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 …
twinkleluz様、丁寧なご返答ありがとうございます。
色々と分からないことが多かったので、しばらく教えていただいたことについて調べてみたのですが、 http://lists.sourceforge.jp/mailman/archives/tcl …を見て、ようやく理解しました。
EUC-JPに固執するより、UTF-8で処理するよう検討してみた方が良いのかもしれませんね。
有用な情報感謝いたします。
ありがとうございました。
No.1
- 回答日時:
Perl 5.8 で、プログラムそのものは euc-jp で書いてあって標準入力と標準出力を utf8 にしたいのであればこれを最初の方で指定するだけでいいと思いますよ。
use encoding 'euc-jp', STDIN => 'utf8', STDOUT => 'utf8';
use Encode; や encode(), decode() による変換は不要です。
注: 「~」などの変換についてはこれでいいかどうか分かりません。
noboru2000様、ご返答ありがとうございます。
ご指摘いただいた方法で試してみたのですが、全ての文字が「????」などと表示されてしまいました。
「use encoding」についてもう少し勉強してみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- JavaScript HTMLでJavaScriptを使ってパスワードの強化判定のプログラムを作成しています。 一通り作っ 2 2022/10/19 01:41
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
URLエンコードされたデータを戻...
-
MIMEでエンコードされたMailのS...
-
標準入力からのutf-8→euc-jpで...
-
pythonエラー
-
perlの日本語文字コードはどう...
-
CSVファイルの中で、「 , 」カ...
-
エクセルで数値を全角文字(カ...
-
英数字のみ全角から半角に変換
-
VBA 文字に半角が含まれて...
-
エクセルにMicrosoft Barcode C...
-
Excel VBAでPDFファイルをMicro...
-
VBA EXCEL あるセルの中の一...
-
CString から LPCTSTRの型に変換
-
Accessでのグループ化で全角・...
-
パス区切りの文字について
-
マクロを使ってフォルダー内に...
-
GoogleAppsScript文字列置換の...
-
正規表現の否定先読みで、複数...
-
「何とかで始まり、何とかで終...
-
IEからEdgeへの移行に伴うIMEの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
pythonエラー
-
BASP21によるbase64のデコード...
-
Perl:ファイル名だけ文字化けする
-
「繝・せ繝・」となる文字化け
-
MIMEでエンコードされたMailのS...
-
jcode.pmでconvertできない
-
1つのサイトで文字コードが混在...
-
Encode.pmで文字コードの判別
-
メール(iso-2022-jp-2)のデコ...
-
URLエンコードされたデータを戻...
-
jisコードで16進数の『3c』か...
-
perlの日本語文字コードはどう...
-
CGIでメールを送る際に文字...
-
CASLIIの数値データ入出力
-
文字コードについて
-
CSVファイルの中で、「 , 」カ...
-
英数字のみ全角から半角に変換
-
エクセルで数値を全角文字(カ...
-
EXCELからCSVにすると余計なカ...
-
住宅にカナを入力する際に丁目...
おすすめ情報