重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

現在、Shift-JISでCGIを作成しています。言語はPerlです。HTMLファイルから送信された文字をDBに登録するのですが、CGIをShift-JISで作成しているのに、DBがEUCとなっているため、jcode.plを利用して文字コードを変換しています。
しかし、文字が機種依存文字である場合、jcode.plでは文字コード変換ができないようで文字化けを起こした文字をDBに登録しようとしてエラーを起こしてしまいます。
何とか機種依存文字をコード変換したいのですが、可能でしょうか?

A 回答 (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とほぼ同じです。

参考URL:http://search.cpan.org/~hio/Unicode-Japanese-0.40/
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。また、こちらからの返事が遅くなってしまい、申し訳ありませんでした。

Unicode::Japaneseですか。これは知りませんでした。まだ、見てもいないのですが、PurePerlということなら、手軽に利用できそうですね。少し試してみます。

ありがとうございました。

お礼日時:2007/06/01 13:03

#3です。


今確認してみましたが、しっかりXSコードの部分がありましたので
単純にコピーするだけではダメでしょうね。

ということで#4の回答にあるJapanse::Unicodeを使ってみては?
    • good
    • 0
この回答へのお礼

何回も書き込んでいただき、ありがとうございます。XSコードがありましたか。では、ちょっと利用が難しいかもしれませんね。

少しUnicode::Japanese を試してみようと思います。

ありがとうございます。

お礼日時:2007/06/01 13:05

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が使えるようになっているかどうかちょっと疑問。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。こちらのモジュールですが、単にパスの通ったディレクトリに置くだけで動作するタイプのものでしょうか?

それとも、きちんとインストールを行わないといけないタイプですか?もしもインストールが必要でしたら、少し難しいかもしれませんね。

とりあえず、モジュールの内容も見ていないので、NKFの方法と同じく、試してみます。

ありがとうございました。

お礼日時:2007/06/01 09:28

jcode.pl/Jcode.pmは、機種依存文字に(未だ)対応していません。



私はNKFを使う事が多いです。
機種依存文字に対応しているし、メール送信で必要になるBase64エンコーディングなども出来ます。
これひとつでCGIプログラムは大体間に合います。
    • good
    • 0
この回答へのお礼

ご回答いただき、ありがとうございます。日本語変換はいつもjcode.plを利用しており、NKFは名前は聞いたことがある、程度だったので、思いつきませんでした。

使い方などを少し調べて、試してみます。ありがとうございました。

お礼日時:2007/06/01 09:21

具体的にどんな文字がダメなのかわかりますか?



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にも入っていないようです。

こんな回答で、何かわかりますか?

補足日時:2007/05/31 23:07
    • good
    • 0

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