ここから質問投稿すると、最大4000ポイント当たる!!!! >>

これまで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";
}
}

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q「ご連絡いたします」は敬語として正しい?

連絡するのは、自分なのだから、「ご」を付けるのは
おかしいのではないか、と思うのですが。
「ご連絡いたします。」「ご報告します。」
ていうのは正しい敬語なのでしょうか?

Aベストアンサー

「お(ご)~する(いたす)」は、自分側の動作をへりくだる謙譲語です。
「ご連絡致します」も「ご報告致します」も、正しいです。

文法上は参考URLをご覧ください。

参考URL:http://www.nihongokyoshi.co.jp/manbou_data/a5524170.html

Qポートの80と443

こちらのサービス(https://secure.logmein.com/)を利用すると、インターネットを見られるサーバーのポートの80と443が空いていればルータやファイアウォールに特段の設定なく外部からサーバーを操作できるそうですが、逆にサーバーのポートの80や443を空けることには何か危険性があるのでしょうか。

Aベストアンサー

ポート80は一般的なHTTP、ポート443はHTTPSです。
この2つのポートがあいていなければインターネット接続(WEBブラウジング)は出来ません。
ですから、ほとんどのファイアウォールでこのポートは開いています。(インターネット接続を制限している社内LANでは当然閉じていますが)

ちなみに、よく使うポートとしてはFTPで20、21、SMTP(送信メール)で25、受信メールPOP3で110あたりです。セキュリティポリシー上、この辺は制限される事も多いですが、HTTP 80、HTTPS(暗号化用)443は通常閉じません。


危険性?
WEBプロトコルを使ってFTP的なファイル転送(WebDAV)やVPN等も出来るようになっています。当然そこにはある種の危険はつきものですが、WEBブラウジングに伴う危険と大きく変わりません。ウィルス等に感染していればこの2つのポートだけでも相当危険でしょうね。

参考まで。

Q文字列から、特定の文字を削除したい

アンケートで入力された値を受け取り、メールで送信しているのですが、受け取った値から、特定の文字列を削除することは可能でしょうか?

例えば電話番号の入力の場合、
03-xxxx-xxxx →03xxxxxxxx
077-xxx-xxxx →077xxxxxxx
のように、-(ハイフン)が入力されていたら、-を削除した文字列に置換してメール送信したいのです。
入力する時に、3つのテキストエリアに分けるのは諸事情でできないので、特定の文字を削除する関数か処理方法がありましたら、教えていただきたいです。
よろしくお願いします。

Aベストアンサー

str_replace
http://itbtech.itboost.co.jp/man/php_man/function.str-replace.html

<?php
$orig_telno = "03-xxxx-xxxx";

$telno = str_replace("-", "", $orig_telno);
echo $telno;

03xxxxxxxx

“PHP 文字列” あたりをキーワードに検索すれば
そんなに難しいものでもないような。

Qシグナル 6(SIGABRT)とは?

最近0bjective-Cの勉強を始めた超初心者です。Cについても入門書をサラッと読み通した程度の理解力です。

解説本に載っていたソースコードをXcodeで「ビルドして実行」したら、「ZeroLink: unknown symbol '_objc_getClass'
Volume はシグナル 6(SIGABRT)により終了しました。」と表示されました。

シグナル 6(SIGABRT)とは、何を意味するのでしょうか?

宜しくお願いします。

Aベストアンサー

Objective-Cについては素人ですが...

> シグナル 6(SIGABRT)とは、何を意味するのでしょうか?

SIGABRTというのは、シグナルの一種で、通常abort関数を呼び出した場合にraise(SIGABRT)の実行によって発生します。
要するに、何か不正な処理を行ったか、処理すべきエラー等を処理しなかったために異常終了したということです。

QUTF-8のPerlから、UTF-8、EUC、Shift-jisの3つのエンコードテキストを生成

UTF-8で作ったPerl内で、UTF-8にエンコードしたい部分とは別に、
EUCやShift-jisにエンコードして、
UTF-8以外の仕様になっている検索エンジンなどの検索結果に、
テキストリンクを飛ばしたいのですが、行き詰まりました。
いい方法はありますでしょうか。

Aベストアンサー

use utf8;
use Encode;
use URI::Escape;

my $utf8String = 'テスト';

my $urf8BytesEsc = uri_escape(encode('utf8', $utf8String));
my $eucBytesEsc = uri_escape(encode('euc-jp', $utf8String));
my $sjisBytesEsc = uri_escape(encode('shiftjis', $utf8String));

print 'http://www.google.co.jp/search?hl=ja&q=' . $urf8BytesEsc ,"\n";
print 'http://dictionary.goo.ne.jp/search.php?MT=' . $eucBytesEsc , "\n";
print 'http://example.com/search.cgi?sjis=' . $sjisBytesEsc , "\n";

use utf8;
use Encode;
use URI::Escape;

my $utf8String = 'テスト';

my $urf8BytesEsc = uri_escape(encode('utf8', $utf8String));
my $eucBytesEsc = uri_escape(encode('euc-jp', $utf8String));
my $sjisBytesEsc = uri_escape(encode('shiftjis', $utf8String));

print 'http://www.google.co.jp/search?hl=ja&q=' . $urf8BytesEsc ,"\n";
print 'http://dictionary.goo.ne.jp/search.php?MT=' . $eucBytesEsc , "\n";
print 'http://example.com/search.cgi?sjis=' . $sjisBytesEsc...続きを読む


人気Q&Aランキング