ミケネコ研究所 / 文字コードの部屋 / jcode.plの私的な解説書

jcode.pl の私的な解説書

日本語コード変換ライブラリ「jcode.pl」についての解説

Last modified: 2001/01/27. jcode.pl ver2.13 対応版


目次


1 章 はじめに

1.1 jcode.plとは?

jcode.pl は、歌代 和正 <utashiro@iij.ad.jp> 氏によって作成されている、日本語コード変換を行うための Perl ライブラリです。JIS, EUC, シフトJIS 間の相互変換が行えるようになっていて、文字コードの自動認識にも対応しています。

jcode.pl には Perl4 以上が必要です。また、jperl 上では jperl5.004_01-970710 以上から動作します。コンパイル時にスレッド機能を有効にしたPerl 5.005 では、jcode.pl-v2.11 以上から動作します。

jcode.pl の著作権表示

jcode.pl: Perl library for Japanese character code conversion

Copyright (c) 1995-1999 Kazumasa Utashiro <utashiro@iij.ad.jp>
Internet Initiative Japan Inc.
3-13 Kanda Nishiki-cho, Chiyoda-ku, Tokyo 101-0054, Japan

Copyright (c) 1992,1993,1994 Kazumasa Utashiro
Software Research Associates, Inc.

Use and redistribution for ANY PURPOSE are granted as long as all
copyright notices are retained.  Redistribution with modification
is allowed provided that you make your modified version obviously
distinguishable from the original one.  THIS SOFTWARE IS PROVIDED
BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES ARE
DISCLAIMED.

Original version was developed under the name of srekcah@sra.co.jp
February 1992 and it was called kconv.pl at the beginning.  This
address was a pen name for group of individuals and it is no longer
valid.

1.2 jcode.pl の入手方法

jcode.pl の最新版は、 ftp://ftp.iij.ad.jp/pub/IIJ/dist/utashiro/perl/ から入手できます。

1.3 jcode.pl の使い方

スクリプト中で、require 文を実行し、jcode.pl をロードするだけです。何も難しいことはありません。

コード不定のテキストファイルを、Shift_JIS コードに変換して、保存する例です。

#!/usr/local/bin/perl

# jcode.pl をロード
require "./jcode.pl";

# 文書ファイルをオープン
open (FILEIN, "./document.txt") or die;
@line = <FILEIN>;
close (FILEIN);

# Shift_JIS コードに変換
foreach $line (@line){
  &jcode::convert(\$line, "sjis");
}

# 保存
open (FILEOUT, ">./document-sjis.txt") or die;
print FILEOUT @line;
close (FILEOUT);

# 終了
exit;

1.4 この文書についての情報

この文書は、jcode.pl に関する解説を ミケネコ研究所 が HTML 化しているものです。この文書は、あくまで私的な解説に過ぎず、決して歌代 和正氏が jcode.pl の解説書として保証するものではありません。内容にはできるだけ正確を期するつもりですが、事実誤認などありましたら、lab@mikeneko.ne.jp までお知らせ下さい。

jcode.pl の作者の歌代氏からは、1998 年 2 月 17 日に、Web 公開について問題ないとのコメントをいただきました。

この文書は、2000 年 9 月 29 日にリリースされた jcode.pl ver 2.13 をもとに作成しました。

この文書は、あなたの責任において利用してください。利用によって生じるあらゆる損害の責任は、利用者自身にあるものとします。


2 章 関数リファレンス

このリファレンスの読み方

関数名 -- 関数の説明

文法

一部の関数については、perl4 と perl5 での両方の書法を示しました。perl5 のリファレンスの方が、perl4 の型グロブ形式よりも高速です。

解説

引数の説明や、返り値等の説明です。jcode.pl のドキュメントをベースに多少文章を補っています。

getcode -- 文字コードを調べる

文法

getcode(\$line)

解説

この関数は、$line の文字コード名を、"jis", "sjis", "euc" のいずれかで返します。$line 中にバイナリキャラクタを見つければ、"binary" を返します。いずれでも無い場合は、未定義値 undef が返ります。

この関数をリストコンテキストで使うと、2つの要素を含むリストを返します。第 1 要素は、$line 中で、予想されている文字コードに一致したバイト数です。第 2 要素は、$line の文字コード名です。

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

$line = 'あいABCうえお';         # $line は EUC コードとする。

$code = &jcode::getcode(\$line);   # $code には、"euc" が得られる。
@code = &jcode::getcode(\$line);   # @code には、(10, "euc") が得られる。

# 上と等価な、Perl4 書法
$code = &jcode'getcode(*line);
@code = &jcode'getcode(*line);

convert -- 任意の文字コードに変換する

文法

convert(\$line, $ocode [, $icode [, $option]])

解説

$line を、$ocode に与えられた文字コードに変換します。

第 2 引数 $ocode には、変換したい文字コードを "jis", "sjis", "euc" のどれかで与えます。コード変換したくないときは、"noconv" を使います。

第 3 引数 $icode は、$line の文字コードに関するオプションです。あらかじめ $line の文字コードを "jis", "sjis", "euc" のどれかで jcode.pl に教えることによって、コード判別をスキップします。$icode が省略された場合には、内部で getcode() を自動的に呼び出し $line の文字コードを判断します。(ただし半角カナは、判断の対象から除外されます。getcode() 参照。) しかし $line の文字コードがわかっているのなら xxx2yyy() のほうが、より効率が高いです。

第 4 引数 $option は、半角カナに関するオプションです。"z" を与えると、$line 中に含まれる半角カナは全角カナに変換されます。"h" を与えると、全角カナは半角カナに変換されます。

convert() は、スカラーコンテキストで評価されたときは、$line のコード名を返し、リストコンテキストで評価されたときは、変換サブルーチンへのポインタ名と、$line のコード名を、2要素のリストで返します。

日本語は、半角カナ(JIS X 0201-1976)、JIS 漢字 (X0208)、補助漢字 (X0212-1990)、ASCII 文字がサポートされています。補助漢字は シフトJIS では定義されていないので、シフトJIS への変換の際に補助漢字は「〓」に置換されます。


&jcode::convert(\$line, "euc");           # 文字コードの不明な $line を、
                                          EUCコードに変換する。
&jcode::convert(\$line, "euc", "", "z");  # 上と同じだが、$line 中の半角カナ→
                                          全角カナへの変換が行われる。
&jcode::convert(\$line, "euc", "sjis");   # シフトJIS である事が既知の $line を、EUC
                                          コードに変換する。&jcode::sjis2euc と等価。

# 上の3行と等価な Perl4 書法
&jcode'convert(*line, "euc"); 
&jcode'convert(*line, "euc", "", "z"); 
&jcode'convert(*line, "euc", "sjis");  

xxx2yyy -- 文字コード xxx から 文字コード yyy に変換する

文法

xxx2yyy(\$line [, $option])

解説

文字コードが xxx である $line を、文字コード yyy に変換します。xxx と yyy は "jis", "euc", "sjis" の任意の組み合わせで 9 通りです。

第 2 引数 $option は、半角カナに関するオプションです。"z" を与えると、$line 中に含まれる半角カナは全角カナに変換されます。"h" を与えると、全角カナは半角カナに変換されます。

xxx2yyy()は、コード変換できた文字数の*近似*値を、スカラーで返します。何も変換されなければ、0を返します。

$line = 'あいABCうえお';             # EUCコードとする。
$value = &jcode::euc2sjis(\$line);   # $line は、Shift_JISに変換され、
                                     $value には、"5" が得られる。

to, jis, euc, sjis -- コード変換後の文字列を返す

文法

to($ocode, $line [, $icode [, $option]])
jis($line [, $icode [, $option]])
euc($line [, $icode [, $option]])
sjis($line [, $icode [, $option]])

解説

$line を受け取り、好みのコードに変換した文字列をスカラーで返します。これらの関数は、 call/return-by-value インターフェースとして簡単に使えます。例えば s///e 演算子中で用いることができます。

関数 to() は $ocode は、変換先の文字コード名を与え、任意の文字コードへ変換できます。関数 jis()euc()sjis() は、その名称への文字コードへ変換します。

$icode は、$line の文字コードがあらかじめわかっている場合に与えます。

$option は、半角カナに関するオプションです。"z" を与えると、$line 中に含まれる半角カナは全角カナに変換されます。"h" を与えると、全角カナは半角カナに変換されます。

ただ $line の中身を変換したいだけなら、convert() を使いましょう。本当に返り値が必要なときだけ、この関数を使いましょう。

$line = 'あいABCうえお';           # $line は EUC コードとする。
print &jcode::sjis($line);          # 表示は シフトJISで。

jis_inout -- エスケープシーケンスのセット

文法

jis_inout($b2, $b1)

解説

jis_inout() は、JIS コードで用いるエスケープシーケンスを変更し、変更後の値を返します。第 1 引数 $b2 には、2バイト文字へのエスケープシーケンスを、第 2 引数 $b1 には、1バイト文字へのエスケープシーケンスを指定します。

jcode.pl はデフォルトでは、$b2 には JIS X 0208-1983(新JIS83) の開始を示す "1Bh 24h 42h" の 3 バイトが、$b1 には ASCII 文字の開始を示す "1Bh 28h 42h" の 3 バイトがそれぞれ指示された状態となっています。通常、変更する必要は無いでしょうが、jis_inout() はこれを任意に変更できます。

引数が 1 バイトであれば接頭語が省略されているものとして、$b2 の場合 "1Bh 24h" が、$b1 の場合 "1Bh 28h" が自動的に補われます。

この関数は、変更後のエスケープシーケンスのリスト ($b2, $b1) を返します。

# JIS C 6226-1978(旧JIS) と JIS X0201-1976 ローマ字 に変更する
&jcode::jis_inout("\x1B\x24\x40", "\x1B\x28\x4A");

get_inout -- JIS 文字列から、エスケープシーケンスを得る

文法

get_inout($string)

解説

$string から、現在セットされているエスケープシーケンスのバイト列を探して、見つかればそのエスケープシーケンスを返し、見つからなければ undef が返ります。

返す値の形式は、jis_inout() と同様に、($b2, $b1) の形式です。

cache, nocache, flush -- キャッシュの制御

文法

cache
nocache
flush

解説

jcode.pl は一度文字コードされた演算はハッシュにキャッシュされ、再び同じ文字が見つかった際に高速に変換できるように設計されています。

nocache() を呼び出すと、以後キャッシングを行いません。これを戻すには、cache() を呼び出します。flush() を呼び出すと、キャッシュをフラッシュします。

cache() および nocache() は、キャッシュを直前の状態に戻します。

h2z_xxx -- 半角カナを、全角カナに変換

文法

h2z_jis(\$line)
h2z_sjis(\$line)
h2z_euc(\$line)

解説

あらかじめ文字コードがわかっている $line 中に含まれる半角カナを、全角カナに変換します。

半角カナが含まれた文字列から文字コードを識別することは困難なので、文字コードの自動認識はサポートされていません。

z2h_xxx -- 全角カナを、半角カナに変換

文法

z2h_jis(\$line)
z2h_sjis(\$line)
z2h_euc(\$line)

解説

h2z_xxx() の逆で、あらかじめ文字コードがわかっている $line 中の全角カナを、半角カナに変換します。

h2z_xxx() と同様、文字コードの自動認識はサポートされていません。

tr, trans -- perl の tr/// 演算子のエミュレーション

文法

tr(\$line, $from, $to [, $option])

trans($line, $from, $to [, $option])

解説

perl の tr/// 演算子をエミュレートします。通常の perl の正規表現では実現不可能な、tr/あ-お/ア-オ/ のような範囲指定が可能です。オプションは d のみがサポートされています。

tr() は、$line を 1 文字ずつスキャンし、$from で示された文字範囲に含まれる文字すべてを、$to の対応する文字に変換します。

$option に "d" を与えると、$from にマッチしなかった文字は削除されます。(perl の tr///d 演算子 と同じ)

trans() は $line を受け取り、置換後の文字をスカラーで返しますが、$line には影響を与えません (call/return-by-value)。

$line = 'TEL03−9999−9999';            # 全角文字
&jcode::tr(\$line, '0-9A-Za-z−', '0-9A-Za-z-'); # 半角に置換する例
print $line;                                         # "TEL03-9999-9999" と表示
注意

init -- 変数の初期化

文法

init

解説

jcode.pl パッケージ内の変数を初期化します。

require "jcode.pl" 時には、init() が自動的に呼び出されますので、あらためて init() を実行する必要はありません。jcode.pl のルーティンを別のスクリプトに埋めこむ際には init() を一度呼び出す必要があります。


3 章 補足

半角カナについて
この文書中で、JIS X 0201 カタカナのことを「半角カナ」と記しています。
文字コードの俗名について
この文書中で、「JIS」は、ISO-2022-JP を指し、「EUC」は euc-jp を指しています。

4 章 この文書の改版履歴

2001/01/27.
全体的な追記。tr() に関する記述の修正。jcode.pl の使い方を追記。
2000/10/10.
jcode.pl ver2.13 がリリース。バグ修正のみで本ページに修正はない。
2000/04/08.
Perl5 主体の記述。tr/// に関する記述の修正。
2000/02/06.
jcode.pl ver2.11 用に修正。
1999/03/30.
jcode.pl ver2.10 用に修正。
1998/02/20.
jcode.pl ver2.6 用の解説を作成。

文字コードの部屋 http://mikeneko.creator.club.ne.jp/~lab/kcode/
お問い合わせ <lab@mikeneko.ne.jp>