こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

perl jcode::convert 半角>全角

perlでjcode::convertで
半角を全角に変換すると
正しく変換される時とされない時があります。

例えば、
sample1.plとsample2.plの
my $message = 'の次の「ハンカク」の4文字は半角の文字です。
(注)ここにアップロードすると全角で表示されてしまいます。
  この4文字を半角にして確認してください。
sample1.plではこの4文字が全角に変換されるのですが
sample2.plではこの4文字は半角のままです。
なぜ全角に変換されないのでしょうか。
(Windows7, ActivePerl v5.16.3)

---sample1.pl------------
require "jcode.pl";
my $message = 'ハンカク文字は使えるかな?';
jcode::convert(\$message,"sjis","", "z");
print "$message\n";
---------------

---sample2.pl------------
require "jcode.pl";
my $message = 'ハンカク文字';
jcode::convert(\$message,"sjis","", "z");
print "$message\n";
---------------

なお、どちらも以下のようなメッセージが表示されています。
これは何を意味しているのでしょうか。

defined(%hash) is deprecated at C:/Perl64/site/lib/jcode.pl line 684.
(Maybe you should just omit the defined()?)
defined(%hash) is deprecated at C:/Perl64/site/lib/jcode.pl line 693.
(Maybe you should just omit the defined()?)

投稿日時 - 2017-04-17 15:23:51

QNo.9318572

困ってます

質問者が選んだベストアンサー

http://mikeneko.creator.club.ne.jp/~lab/kcode/jcode.html

上記の URL の jcode.pl の解説では次のような記述があります。

「文字列が半角カナを含んでいる時、文字コードが EUC であるか シフトJIS であるかの判断は非常に困難で、時には誤った結果を返すことがあります。従って、半角カナは、文字コードの自動認識の判断対象からはずされます。文字列に半角カナを含むときの時の、文字コードの自動認識は、保証されません。」

以上の解説から、半角から全角への変換には元の文字コードを指定することが肝要です。

jcode::convert(\$message,"sjis","euc","z");
jcode::h2z_sjis(\$message); # 文字コードを変換しない場合

なお、メッセージは、jcode.pl が古い機能を使っているために出力されるものです。該当行から、defined を消去すればメッセージは出なくなります。

684: &init_z2h_euc unless defined %z2h_euc;
693: &init_z2h_sjis unless defined %z2h_sjis;

投稿日時 - 2017-04-18 07:59:25

お礼

jcode::convert(\$message,"sjis","euc","z");
で確認すると、perlの内部ではEUCのはずなので
これでいいように思いますが
なぜか「保狂文字」と表示されます。

jcode::convert(\$message,"sjis","sjis","z");
とすると、正しく「ハンカク文字」と表示されました。

jcode::h2z_sjis(\$message);
でも、正しく表示されました。

jcode.plの方も、684と693をコメントアウトすると
メッセージは出なくなりました。

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

投稿日時 - 2017-04-21 15:59:38

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

> jcode::convert(\$message,"sjis","euc","z");
> なぜか「保狂文字」と表示されます。

後の2つの文から、$message に格納されていたのは sjis で間違いないものと思います。sjis での「ハンカク文字」の文字コードは、次のようになります。

CA DD B6 B8 95 B6 8E 9A

元の文字コードを間違って euc と指定した場合、[CA DD] は euc で [保] の文字コード、[B6 B8] は euc で [狂] の文字コードで、この2文字は sjis に変換されます。

次の [95 B6] の1バイト目の 95 はそもそも euc で未使用のコードのため、変換できずにそのまま残ったと思われます。最後の [8E 9A] の1バイト目の 8E は半角カナの1バイト目ですが、9A が半角カナの2バイト目の範囲 A1~DF に含まれないため、これも変換しないままになります。

投稿日時 - 2017-04-22 18:53:52

お礼

このように追っていくのですね。
調べ方のヒントが示されていて
とても参考になりました。
ありがとうございました。

投稿日時 - 2017-04-24 16:50:11