トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS   ログイン


Perl | EUCJP.pm | UTF2.pm | jacode.pl | Char.pm | SjisTk | DBD-mysqlPPrawSjis

404 Flag Not Found

     最新モジュールとソースコードフィルタで楽々日本語Perlプログラミング

Sjisソフトウェアは日本語情報処理のための Perl プログラムです(JPerlのような使い心地を目指しています)。 JA.pm(日本語ドキュメント) English Version

インストール方法

以下のファイルを @INC に含まれるディレクトリ、例えば C:\Perl\site\lib にコピーするとインストール完了です。

使い方

スクリプト先頭に以下の記述をします。そうするとスクリプトをシフトJISで記述でき、正規表現をはじめとしてPerlの動作もシフトJISによる日本語文字列に対応するようになります。

use Sjis;
print "こんにちはSjisソフトウェア\n";

Sjisソフトウェアの概要

※1 ここでいう文字、文字列は利用者およびperl処理系にとってのそれであって、perlインタプリタにとってはバイト列に見えています。モダンPerl用語での文字列ではありません。以降に出現する「文字」「文字列」も同様とします。

データはバイト列として扱うこともでき、文字列として扱うこともできます。
バイト列であるか文字列であるかは、UTF8フラグが決めることではなく、私たち
人間が決めることです。なぜならセマンティックスを扱うためには心が必要だか
らです。心を持たないコンピュータはシンタックスしか処理することができま
せん。

そもそもコンピュータ自体は文字を扱えず、個々の文字に割当てた数字を扱う
ことしかできません。「文字を扱っている」のは、コンピュータではなく、
人間です。それは最もプリミティブな文字コードである ASCII でさえそうです。
日本語情報処理の場合(例えばシフトJISで対応する場合など)は、1.数値の桁
を増やす、2.数値の桁数が可変となることに対応する、だけなのでこの基本的
な原理が変るわけではありません。

文字を扱うのは、昔も2013年もひとなので「文字列」という用語はインタプリタ
のためではなく、人間のためにあった方がよいと考えます。だからこのソフト
ウェアは「文字列」という用語を私たちのために取り戻します。

つまり、私たちが文字列だと思っているものが文字列です。

Perlはグルー言語(glue language)のひとつであり、異質なものを結びつけるのを得意
としています。しかしながら、UTF8フラグを使用すると外部文字列と内部文字列の区別
ができ、その結びつけをアプリケーションプログラマが行うことになってしまいます
(ツールの仕事がいつの間にかあなたの仕事に!?)。

Perlで行う処理の大部分はテキスト処理なので、JPerlのように使う人が楽にテキスト
処理を行えるようにし、全体的な印象をよくしようというのがこのソフトウェアの
試みです。

Sjisソフトウェアの詳細

このソフトウェアは JPerl on the Modern Perl です。perl を JPerl のようにすることが
でき、日本語をモダンに処理します。ここでいうモダンは、これまでの方法と互換性があっ
て、使うひとに負担をかけない、ということを意味しています。
(例えば、数値のように見える外部データをインタプリタに扱わせるとき、インタプリタ
のためにあなたがデコードしてあげる必要はあったでしょうか?)

その一方で、実装方法は?というとモダンPerlではなくてスタンダードPerlです。使うひと
にやさしい反面、このソフトウェアを実装・保守する方法は前近代的、そして標準的です。
橋は両岸にかからなければ、その役目を果たせないからです。近代的なスクリプトは前近
代的なインタプリタ上で実行することができません。

シフトJISをそのまま処理し、かつ値が [\x80-\xFF] のオクテットは Latin-1 を表すことが
ないため、もはやUTF8フラグは使用しません。

シフトJISは第2オクテットに 

            @ [ ¥ ] ^ ‘ { | } 

など、ダブルクォート文字列や正規表現で特別な役割を果たす 1 オクテット文字と同じ値が
使われています。それに加えてPerlの q qq qx qw m s tr y qr は任意の文字をデリミタに
できるため、クォートしたい文字の第2オクテットがデリミタの値と同じになることがありま
す。このソフトウェアはそれらのオクテットの直前に chr(0x5c) を入れることでエスケー
プし、本来使用したかった2オクテット文字をバイト指向の perl 上で使用できるようにしま
す。なお、インターネット上には「直後」と書かれた資料もありますが、正しくは「直前」で
す。そうでなければエスケープすることができません。 

このエスケープ処理によって文字コードが UTF-8 に変換されることはありません。従来同様、
バイト列はすなわちオクテット列であり、かつ文字列でもあるため、オクテット列として
操作するのか文字列として操作するのかは、必要がない限りperl処理系に指示せずにすみ
ます。

外部コードはそのままの値で内部コードになります。もとい、内部コードとして設計され
たシフトJISを内部コードとして使用することができます。

もとよりマッピングテーブルがない仕組みなので、システムに固有な外字コードを扱う場合
でもマッピングテーブルを追加作成する必要がありません。

ファイル名、ディレクトリ名をシフトJISで取り扱っている環境においてはそれらをファイル
の内容と同様に扱うことができます。これはファイルの中に記述したファイル名をそのまま
perl の組込み関数や演算子に渡せることを意味しています。DOS/Windows 風の OS の場合
はパスの区切り文字として \ が使われているため、それらをうまく扱うためのルーチン も
ランタイムルーチンである Esjis.pm に含まれています。

このソフトウェアが提供する環境では、文字列の長さや文字列中の文字の位置を表すときは
これまで通り 1 オクテットを 1 と数えます。それにより、今までのスクリプトとこれからの
スクリプトは互換性が保たれ、新旧互いにコードを貼りつけあい、実装を継承することに
よって機能を継承することができます。

文字単位で数える関数は Sjis::* という名前で用意されています。例えば文字数を調べる
関数は Sjis::length です。これは言ってみれば関数名のエスケープです。 

このソフトウェアはperl5.00503で書かれているため、現在jperlを利用している人でも気軽に
試すことができます。もし思っていたものと違った場合でも Sjis.pm と Esjis.pm を削除
すればアンインストール完了です。

またPurePerl?なのでXSを利用できない状況でもこのソフトウェアを利用することができます。
XSを使っていないおかげで、バイナリ互換問題に煩わされることがなく、perlインタプリタ
を perl5.8, perl5.10, perl5.12, perl5.14, perl5.16, perl5.18, 64ビット版
へと移行するのも容易です。

いままでに蓄積されたデータ、スクリプト、ノウハウを今後も利用できるようにし、シンプ
ルな日本語情報処理モデルを提供することがこのソフトウェアの目標です。  

このソフトウェアが使われる領域

長さの単位が文字よりもバイトのほうがよい理由

参考情報

掲示板




TODO/DONEリスト

ina (2012-02-10 (金) 23:20:37)
・m??, ?? のサポート
・バイト指向の正規表現を実現する /b 修飾子のサポート

ina (2012-03-31 (土) 20:08:00)
・\F と fc() のサポート
Perl 5.16 new features
perl5160delta
perl-5.16 ビギナーズセッション(5分?) akiym
・2012-05-25にバージョン0.81としてリリースしました

ina (2012-06-20 (水))
・Sjis 0.81 が Strawberry Perl 5.16.0 および ActivePerl 5.16.0 にて全テストパスしました。
・正規表現中の文字列クラス m/[here]/ 内に変数が記述できるようにする。

ina (2012-07-29 (日))
・Sjis 0.82 リリースしました。

ina (2012-08-14 (火))
・Sjis 0.82 が Strawberry Perl 5.16.1.1 のテストにて PASS しました。

ina (2012-09-13 (木))
・!~ と s/// を組合せて記述した場合のバグに現在対処中で、テストを進めています。

ina (2012-09-29 (土))
・Sjis 0.83 をリリースしました。

ina (2012-10-24 (水))
・${^WIN32_SLOPPY_STAT} に対応していない件をドキュメントに書く。
・起動時のコマンドラインパラメータをエスケープ後のスクリプト実行時に引き継ぐ部分の見直し中。
・ドキュメントの見直し中。

ina (2012-10-30 (火))
・ニーズが分からず実装も面倒なので、正規表現のクロイスタ(?s)(?i)をサポートせずにいます。
 (?s) は /s 修飾子と .(ドット) と \N で記述できます。
 (?i) は \F ~ \E で工夫して記述する必要があります。

ina (2012-11-29 (木))
・-Duseithreads にてコンパイルされた perl 5.17.x では m?? が正しく動作しません。[perl #115080] m?? doesn't only once match on -Duseithreads
http://www.nntp.perl.org/group/perl.perl5.porters/2012/09/msg193258.html
perl 5.18 までに解決されるといいのですが。
https://rt.perl.org:443/rt3//Public/Bug/Display.html?id=115080
解決されました。

ina (2012-12-12 (水))
・Win32s 環境では動作しませんでした。
・Microsoft Windows 95 で動作確認しました(command.com に対応する箇所、一箇所の変更が必要です)。
・Microsoft Windows NT 4.0 で動作確認しました。

ina (2012-12-23 (日))
・Sjis::getc を作成しました。

ina (2013-01-27 (日))
・Sjis::getc(BAREWORD) のバグを修正しました。

ina (2013-03-22 (金))
・perl 5.14.4 での動作確認しました。
・perl 5.16.3 での動作確認しました。
・Win32モジュールがなくともEsjis::chdirが動作するようにしました。

ina (2013-05-01 (水))
・正規表現で32,767オクテット以上の文字列を扱えるように改良し、ver.0.88をリリースしました。

ina (2013-05-12 (日))
・ver.0.88 での改良は Perl5.10.0 では利用できないようなので、対象をPerl5.10.1以降に変更して、再度 ver.0.89 としてリリースしました。
・Perl 5.18.0-RC1 で全テストがPASSしました。
・Perl 5.18.0-RC2 で全テストがPASSしました。
・Perl 5.18.0-RC3 で全テストがPASSしました。
・Perl 5.18.0-RC4 で全テストがPASSしました。

ina (2013-05-19 (日))
・Perl 5.18.0 で全テストがPASSしました。

ina (2013-06-03 (月))
・Sjis::substr() の lvalue 対応版を作成し、リリース準備完了。

ina (2013-06-08 (土))
・ver.0.90をリリースしました。
・Perl 5.19.0 で全テストがPASSしました。
・ver.0.89での改良をsplit()関数にも適用中です。
・リリース準備中です。