WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:perlで半角カナが文字化け

0:[投稿] ポチ [MAIL] [URL] [2004/11/26 00:28 ][環境:IE6、WindowsXP SP2 わからない]

JAVAスクリプトでクッキーを書き込んでperlで読み込むと
半角カナがSJISに変換出来ません。
<例>コ → %uFF7A
全角の場合はUnicodeデコーダ「simaguni.pl」を使わせてもらって変換できているのですが、IE6限定で良いので半角を変換する方法をご教授してもらえませんか?


1:[回答] AC1号 [2004/11/27 09:37 ]

いわゆる半角カナは、Unicodeに含まれていて、確実に変換できるはずなので、それができないのは、作者の不勉強でしょう。作者に要望でもしておきましょう。

それだけではなんなので、自力で変換するためのヒントを書いておきます。
Unicode(ucs2)において、半角カナは0xFF61〜0xFF9Fの範囲に収録されています。
一方、Shift_JISにおいては、0xA1〜0xDFの範囲に半角カナがあります。
並び順は同じなので、ucs2からShift_JISに変換するには、0xFEC0を引けばよいことになります。(例: 0xFF7A(ucs2のコ)-0xFEC0=0xBA(Shift_JISのコ))

なお、Unicodeのコード表は
http://www.unicode.org/charts/
にあります。


2:[質問] ポチ [MAIL] [2004/11/27 21:03 ]

AC1号さん、ヒントありがとうございます。
情けないのですが自力で変換する技量がないので
http://www.aglabo.com/agl/proevo/perl/install/jcode-user.htmlを見てレンタルサーバにjocde.pmを入れみたら
半角カナは変換できるようになりました。
でも、@が†と文字化けしてしまうんです。
文字化けさせない方法を教えてもらえませんか?

#!/usr/bin/perl
use lib "lib";
use Jcode;

# クッキーの読み込み
foreach (split(/;/, $ENV{'HTTP_COOKIE'})) {
    ($name, $value) = split(/=/);
    $name =~ s/\s//g;
  $value =~ tr/+/ /;
  $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
  $value =~ s/%u([0-9A-Fa-f][0-9A-Fa-f])([0-9A-Fa-f][0-9A-Fa-f])/&Jcode::convert(pack("CC",hex($1),hex($2)),'utf8','ucs2')/ge;
  &Jcode::convert( \$value, "sjis");
    $cookie{$name} = $value;
}



3:[回答] AC1号 [2004/11/30 00:28 ]

>でも、・が†と文字化けしてしまうんです。
・の部分は○数字(1)でしょうか?
厳密に言えば、丸数字はUnicodeには含まれていますが、Shift_JISには含まれません。したがって、変換のしようがないのでJcode.pmは仕方なく†に変換しているのです。

変換後、HTMLとして出力するつもりであれば、Shift_JISに変換する前に実体参照に変換して出力すれば、最も環境依存の少ない形となるでしょう。
丸数字(1)の場合、0x2460なので、①に変換するか、あるいは10進数に変換して①とします。(1)〜(20)まで0x2460〜0x2473まで並んでいるので、
s/%u(246[0-9A-F])/&x$1;/g;
s/%u(247[0-3])/&x$1;/g;

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World