- ベストアンサー
機種依存文字の文字コード変換
現在、Shift-JISでCGIを作成しています。言語はPerlです。HTMLファイルから送信された文字をDBに登録するのですが、CGIをShift-JISで作成しているのに、DBがEUCとなっているため、jcode.plを利用して文字コードを変換しています。 しかし、文字が機種依存文字である場合、jcode.plでは文字コード変換ができないようで文字化けを起こした文字をDBに登録しようとしてエラーを起こしてしまいます。 何とか機種依存文字をコード変換したいのですが、可能でしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
Unicode::Japanese はご存知ですか? ”はしごだか”などの環境依存文字が混在する場合Jcodeでは変換できませんので、Unicode::Japaneseを使うと便利です。 http://search.cpan.org/~hio/Unicode-Japanese-0.40/ PurePerlとしても動作するので、サーバへのインストールも不要です。上記アドレスからDL・解凍後、lib内の Japanese.pm をコピーしてきて利用元のソースと同じパスに置く、あるいは任意のパスに置いてuse libするだけで利用可能です。 use Unicode::Japanese; my $x = "変換元文字列"; my $s = Unicode::Japanese->new($x, "sjis"); open(FILE, ">./euc.txt"); print FILE $s->euc; close(FILE); こんな感じ。使い方はJcodeとほぼ同じです。
その他の回答 (4)
- sakusaker7
- ベストアンサー率62% (800/1280)
#3です。 今確認してみましたが、しっかりXSコードの部分がありましたので 単純にコピーするだけではダメでしょうね。 ということで#4の回答にあるJapanse::Unicodeを使ってみては?
お礼
何回も書き込んでいただき、ありがとうございます。XSコードがありましたか。では、ちょっと利用が難しいかもしれませんね。 少しUnicode::Japanese を試してみようと思います。 ありがとうございます。
- sakusaker7
- ベストアンサー率62% (800/1280)
jocde.plではsjis→euc-jpへの変換はある計算式を対象のキャラクタの コードに対して適用することで求めています。 #Encode.pmやJcode.pmは違います このため、いわゆる機種依存文字の中でコード順で前のほうにあるもの、 たとえば丸付き数字やローマ数字などは問題なく変換されます。 しかしながら、はしごだかのようにコード順で最後のほうにあるもの (IBM拡張漢字)に関しては、その計算式を適用したときに正しい値を 求めることができずに変換に失敗します。 #もっとも変換前に弾いちゃってますが ということでその辺修正しない限りは jcode.plでの変換はできません。 で代替案。 NARUSE, Yui / Encode-EUCJPMS - search.cpan.org http://search.cpan.org/~naruse/Encode-EUCJPMS/ このモジュールを使えば、IBM拡張漢字も問題なく変換できると思います。 が、使用しているサーバー環境等の問題でインストールすることができないのなら、 さらに別の手段を考える必要があります。 nkfを使うというのもひとつの手でしょうが、モジュールをインストールできない環境なら 外部プログラムでnkfが使えるようになっているかどうかちょっと疑問。
お礼
ご回答ありがとうございます。こちらのモジュールですが、単にパスの通ったディレクトリに置くだけで動作するタイプのものでしょうか? それとも、きちんとインストールを行わないといけないタイプですか?もしもインストールが必要でしたら、少し難しいかもしれませんね。 とりあえず、モジュールの内容も見ていないので、NKFの方法と同じく、試してみます。 ありがとうございました。
- guci-ok
- ベストアンサー率33% (49/146)
jcode.pl/Jcode.pmは、機種依存文字に(未だ)対応していません。 私はNKFを使う事が多いです。 機種依存文字に対応しているし、メール送信で必要になるBase64エンコーディングなども出来ます。 これひとつでCGIプログラムは大体間に合います。
お礼
ご回答いただき、ありがとうございます。日本語変換はいつもjcode.plを利用しており、NKFは名前は聞いたことがある、程度だったので、思いつきませんでした。 使い方などを少し調べて、試してみます。ありがとうございました。
- sakusaker7
- ベストアンサー率62% (800/1280)
具体的にどんな文字がダメなのかわかりますか? use strict; require 'jcode.pl'; print $jcode::version, "\n"; my $str = "(1)(10)嵜"; my $cvt = jcode::euc($str, 'sjis'); print $cvt, "\n"; my $cvt = jcode::convert(\$str, 'euc'); print $str, "\n"; こんなんで試してみましたが問題なく変換されているようです。 ひょっとしてデータベースの方で蹴っているということはないですか?
補足
ご回答、どうもありがとうございます。私が試そうとしているのは「髙」という文字です。いわゆる「はしごたか」というと思うんですが。 もちろん、この文字でエラーがでた、というだけで、他の機種依存にも対応できなければいけませんが。 #!/usr/bin/perl use CGI; require 'jcode.pl'; $query = new CGI; $moji = $query->param('moji'); &jcode::convert(\$moji, 'euc', 'sjis'); print $query->header(-type => 'text/html; charset=EUC-JP'); print <<EOF; <html> <head> <title>機種依存文字検索</title> </head> <body> EOF print "$moji<br>\n"; print <<EOF; </body> </html> EOF こんな感じで、簡単なテスト用のプログラムを作ってみました。たんに前のページで入力した機種依存文字をjcode.plで変換して表示するだけですが、うまく変換してくれません。ちなみに、この前のページはShift-JIS、このCGIはEUCとしています。 それと、DBでけっているのではないか、ということですが、サーバのエラーろづをみると、DBIでSQL文をprepareした段階でエラーになっているようなので、DBにも入っていないようです。 こんな回答で、何かわかりますか?
お礼
ご回答ありがとうございます。また、こちらからの返事が遅くなってしまい、申し訳ありませんでした。 Unicode::Japaneseですか。これは知りませんでした。まだ、見てもいないのですが、PurePerlということなら、手軽に利用できそうですね。少し試してみます。 ありがとうございました。