Perl5.6では、新しい文字コード体系の一つであるutf-8符号化方式に対応することになったため、日本語文字も1文字として認識されるようになりました。 しかし、utf-8の実装はPerl5.6.0では「実験的」というレベルにあり、まだ完全対応というわけではありません。それでも、スクリプトの編集や(CGIにおけるブラウザへの)出力等をすべてutf-8で行うことができる環境の人にとっては、その恩恵は大きいといえるでしょう。
一方、従来の文字コード(Shift-JISやEUC等)で書かれているスクリプトの資産は大量にあります。それらを読み書きする際等に透過的にShift-JIS/EUC等 ⇔ utf-8のコード変換を行うことができればよいのですが、Perl自体にはその変換機能はまだ実装されていません。そのため、従来の文字コードを使用したデータを処理する場合は、結局従来と同様にJcode.pm等を使ってスクリプト側でコード変換を行わなざるをえない状況が続いてます。
# 2000/4現在、Jcode.pmのWindows版(Mac版)は処理に時間がかかり、MS-Windows(Mac)での使用にはやや難を感じます。
さて、上記のようにPerl5.6からはutf-8が採用されましたが、 HTMLのヘッダやEメールのヘッダ、CGIのドキュメントなどでは、Shift-JIS、EUC-JP、ISO-2022-JPをよく目にします。この他にも、Unicode、ucs-2なども雑誌等で見かけます。ここでは、これらの文字コードといわれるものについて簡単に解説するとともに、Perlにおいて、どのように取り扱えばよいのかまとめてみます。
●文字コード関連の参考サイト
文字コードの話
http://hp.vector.co.jp/authors/VA001240/article/charcode.html
日本語漢字コードの変換
http://www-cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/CCGI/kanjicod.html
漢字コードとコーディング方法
http://www.d2.dion.ne.jp/~imady/kcode/kcode.html
新JIS漢字規格の原案資料
http://jcs.aa.tufs.ac.jp/jcs/
いっちょかみ@文字コード
http://member.nifty.ne.jp/PaleG/k_char1.htm
小形克宏の「文字の海、ビットの舟」 ―― 文字コードが私たちに問いかけるもの
http://www.watch.impress.co.jp/internet/www/column/ogata/
文字コード問題を考える
http://www.horagai.com/www/moji/moji000.htm
日本語フォントや文字コードについて
http://www.ryukyu.ad.jp/~shin/jdoc/
日本語文書文字セットの指定方法
http://hp.vector.co.jp/authors/VA014833/charset.html
●文字コードとは何なのでしょうか。
ESC(B ASCII ESC(J JIS X 0201-1976 (ASCIIのバックスラッシュが\になったもの) ESC$@ JIS X 0208-1978 ESC$B JIS X 0208-1983ちなみに山本という漢字をそれぞれのコードで表現すると 下記のようになります。
| コード名 | 16進表記 | ASCII表記 |
|---|---|---|
| X0208-1983 | 3b33 4b5c | ; 3 K \ |
| EUC | bbb3 cbdc | |
| シフトJIS | 8e52 967b | |
| ISO-2022-JP | 1b 24 42 3b33 4b5c 1b 2842 | ESC $ B ; 3 K \ ESC ( B |
それぞれのコード表については、
http://saturn.aichi-u.ac.jp/%7Eccsatoru/charset/や
楠 哲士さん作のコード表・perlソース
http://www.cup.com/negi/kanji.html
ご覧下さい。
Unicode関係のドキュメントは、 http://www.unicode.org/にあります。
1.ひらかなをカタカナへ変換
EUCで tr/あ-ん/ア-ン/ とすると、"い" が "ゥ" になってしまったり、 全角アルファベットがかけなかったりします。
シフトJIS(以下SJIS)では、使い物になりません。 また、SJISでは例えばソのコードが0x5c83(\と未使用領域)であるため、
Perl for Win32等ではそのままではコンパイルエラ−となります。
#SJISでは、問題となる文字は他にもいろいろあります。
これに対しては、
(1)漢字を1文字と取り扱うJPerl5を使用する
(2)jcode.pl、nkf等を使用する
(3)EUCについては黒江さん作成のhiragana2katakana関数を使用する
等の対応策があります。
# Usage: $Japanese_EUC_str = hiragana2katakana($Japanese_EUC_str);
sub
hiragana2katakana
{
local($_) = @_;
s/\xa5\xa4/`/g;
s/\xa4([\xa1-\xfe])/\xa5$1/g;
s/`/\xa5\xa4/g;
$_;
}
また、EUC全角かなから全角カナについては
s/い/#/; tr/あ-ん/ア-ン/; s/#/イ/;というようなやり方もありますが、半角を全角にする等には 無理があります。
2.ローマ字をかなに変換する
入手先:
3.その他の問題
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
# 0x21〜0x3f の !"#$%&'()*+,-./0123456789:;<=>? は重複していません。
この重複領域の文字がワルサをすることがあります。例えば、第2バイト に
"@" などが含まれていて "" 内などの文字列として使われていた場合、 perl はこれを配列として展開しようとします。
JIS(ISO-2022-JP)ではもっと困る問題があります。 JIS で「JISです」という文字列は上記ISO-2022-JPで述べたように
また、Jperlにもあるように、2バイト文字は以下のような正規表現等々 いろんなコマンドに影響を及ぼします。
[aAaA]
tr///
CPAN/authors/id/D/DA/DANKOGAI/
Jcode-x.xx.tar.gz
roma2kana.pl がありますが、EUCコードへの変換なので、DOS/NT用perlでは
うまくいかないかもしれません。PCユーザは 歌代和正さん
ftp://ftp.sra.co.jp/pub/lang/perl/sra-scripts/romkan.pl-1.4
漢字コードがSJISの場合、 SJIS の第2バイトは 0x40〜0x7e、0x80〜0xfc
ですから、ASCII と次の文字が重なります。
ESC$B#J#I#S$G$9ESC(B
となり、指示子を含んだものとなります。
#ESCはよく^[で表されるエスケープ文字です。
これに対して「JIS」と言う文字でマッチングしようすると
ESC$B#J#I#SESC(B
となり、マッチングしません。
したがって、一度 重複する部分がないEUCにjcode.pl等で変換してから 処理するのが良策ということになります。
[ぁ-ん]
Perl5では、/あいうえお/ は問題なく使用できますが、[あ-ん]は うまく機能しません。
あれ+
y///
format
chop
split
substr
index
rindex
-B,-T演算子
reverse
等々
変換モジュール/ツール
DAN Kogaidan<kogai@dan.co.jp>さん作で、jcode.plをモジュール化したもの。
新機能として、以下の機能が追加されています。但し、MS-WindowsやMacPerlで使うと少々遅く感じます。
MIME ヘッダー変換機能(完璧なものではないようです)
Unicode に対応(UCS2/UTF8)
詳細は、以下のリンクを参照してください。
【情報源と入手先】
http://openlab.ring.gr.jp/Jcode/index-j.html
【参考】
Perl5.6.0 + Jcode.pmで日本語文字コードをsplitする例:split_utf.txt
歌代和正さん<utashiro@iij.ad.jp>作のコード変換ユーティリティのライブラリ。
半角カナ<->全角カナの変換等も可能。
【入手先】
jcode.plの使用方法はスクリプト内に記述されていますが、すべて英語となっています。
英語に弱い方は、 小塚 敦氏による
「jcode.pl の私的な解説書」を参照されるとよいでしょう。言わずとしれたUNIX定番の変換ツール。
【入手先 】
歌代和正さん<utashiro@iij.ad.jp>作のnkfのperl版。 但し、大量データを取り扱うと遅いらしいので要注意。
ftp://ftp.iij.ad.jp/pub/IIJ/dist/utashiro/perl/pkf-2.0
perl5用漢字変換モジュール。
Perl5.6の登場により、その役目は終えたのかもしれません。
【入手先】
ftp://ftp.intec.co.jp/pub/utils/Kconv-1.1.tar.gz
ご意見、ご要望は、 電子メールでお願い致します。
ホームページへ戻る。