RXJIS 0.96 (1999-12-2)

RXJIS 0.96 1999-12-21 矢野崇 ニフティサーブ: MXB02474 Internet: tyano@tk.airnet.ne.jp or tyano@jp.ibm.co.jp RXJISは、OS/2のREXXから呼ぶユーティリティー関数群です。PCコード(=シフト JISコード)の文字列とJIS7ビット文字列間の相互変換、MIMEフォーマットの文 字列のエンコードとデコード、EUCコードとPCコードの文字列の相互変換を行い ます。また、C/C++から呼ぶためのインターフェースもあります。使い方のサン プルとしてPostRoadMailerで日本語を扱うためのUser Exit: MIMESEND.CMD MIMERECV.CMD を付けます。 このままの形での再配布は自由ですが、中身を改変したものの再配布は禁止で す。また、EPM(拡張エディタ)で使う簡易テキストフォーマッタFMTTEXT3.ERXも サンプルとして付けました。 参考文献: RFC822 RFC1468 RFC1554 RFC1557 RFC2045 RFC2046 RFC2047 RFC2048 RFC2049 OS/2ワープ日本語版ご使用の手引き(オンラインマニュアル) 日本語情報処理 (Ken Kunde) 変更履歴: 1999-12-21: 修正 RxJisTraceの出力のプリフィックスを簡略化した。 サイズを減らした。 最新のツールキットでコンパイルできるようインクルードするヘッダを変更し た。 1998-9-26: 0.95 機能拡張&修正 RxJisToAscii関数で全角のスペースが半角のスペースに変換されない問題を修 正した。 RxJisToUpper/RxJisKanjiAlias関数で扱う文字をJIS漢字字典に基づいて拡張し た。 1998-5-76: 0.94 修正 PCコード旧JISからJIS、JISからPCコード旧JISへの変換が正しくない問題を修正 した。 RxJisSyslog関数を追加した。 1997-9-12: 0.93 機能拡張&修正 RxJisTrace関数を追加した。 バージョン番号が間違っていたのを修正した。 1997-9-5: 0.92 機能拡張&仕様変更&修正 RxJisToUpper/JisToUpperで旧字体/古字体/誤字体/俗字体などを本字体にするよう 仕様を変更した。 RxJisKanjiAlias/JisKanjiAlias関数を追加した。 RxJisPriority関数を追加した。 ソースコードが足りなかったのを修正した。 1997-8-25: 0.91 仕様変更&バグフィックス メモリの使用量を減らした。 旧版のRXJIS.LIBをリンクしたモジュールを組み合わせると動かないのを直し た。 禁足処理が一部正しくなかったのを直した。 RxJisToUpper/JisToUpperでギリシャ文字とロシア文字なども扱うよう仕様を変 更した。 1997-8-5: 0.90 仕様変更&バグフィックス RxJisToZenkakuKatakanaで、ソース文字列が長い場合に Incorrect call to routine になるバグを直した。 RxJisWords/RxJisWord/RxJisWordIndexで禁足処理が不十分だったのを直した。 7ビットJISコードに変換する際、正しくない文字コードを空白にしていたの を、〓に変換するように仕様を変更した。 7ビットJISコードに変換する際、IBM/NEC選定文字を代替文字に変換していた が、字形が不自然なので、字形を優先して代替文字列に変換するように仕様を 変更した。また、代替できない文字はそのままのコードを使っていたのを、〓 に変換するよう仕様を変更した。 メモリの使用量を減らした。(パフォーマンスは若干悪くなった。) 7ビットJISコードからPCコードに変換する際、新JIS/旧JISの入れ替え以外の変 換はしないよう、仕様を変更した。 JisFindWord関数の追加 FMTTEXT3をサンプルとして追加 DBCS版OS/2にしかない\OS2\SYSDATA\$SYS1IBM.TBLを使う仕様を使わない仕様に 変えた。 ビルド環境の変更に伴い、日本語OS/2上でしかビルドできなくなった。 1996-10-28: 0.86 仕様変更&バグフィックス 7ビットJISコードを返す時に、ダブルバイトを指示するエスケープシーケンス を"ESC ( B"に変更した。 RxJisAppend/JisAppendでトラップが長さが1の文字列にアペンドする時に、ト ラップが起きるバグを直した。 1996-10-20: 0.85 バグフィックス MIMESEND.CMDをPostRoadMailer以外のメールソフトで使う時に、重複したヘッ ダーを付けることがないようにした。 1996-9-14: 0.84 バグフィックス (リリースせず) コードページ943でJISコードからPCコードに変換する時に、NEC選定文字をJIS またはIBMの範囲にマップしないようにした。 1996-9-10: 0.83 機能拡張 (リリースせず。) コードページ943のサポートを加えた。コードページ943は新JIS並びの日本語 コードページ。 バージョン番号の誤りを直した。 1996-8-19: 0.82 バグフィックス (リリースせず。) RxJisAppendで、空白で終わる文字列に追加する時、空白で始まる文字列を追加 する時にも、空白が間に入ることがある問題を修正した。 1996-7-22: 0.81 バグフィックス RxJisToJisで255文字を越える長さの文字列で Incorrect call to routine になるバグを直した。(0.80から入ったバグ。) 1996-7-21: 0.80 機能拡張&バグフィックス (リリースせず。) RxJisAppend/RxJisWord/RxJisWords/RxJisWordIndex/RxJisUrlToVarを追加し た。 RxJisEucToが正しく働かないのを修正した。 1996-7-9: 0.72 バグフィックス (リリースせず。) APIが返すバージョン番号が0.70だったのを0.72に修正した。 英語のWarpでも正しくコンパイルできるようにソースを修正した。 1996-7-8: 0.71 バグフィックス RxJisBase64To/RxJisToBase64の変換テーブルにエラーがあったのを修正した。 このバグは0.70で入った。 1996-6-26: 0.70 機能拡張 RxJisToZenkakuKatakana関数を追加した。 JIS/EUCでNEC/MS特有の文字でIBM文字セットで代替可能なPCコードがあればそれ で代替するようにした。 JIS/EUCでJISレベル3の文字のうちIBM文字セットで代替可能なPCコードがあれば それで代替するようにした。 1996-6-20: 0.60 機能拡張&バグフィックス RxJisToJis/RxJisToEucでJIS文字セットの中にないIBM日本語文字(94区以降にあ るもの)のうち、JIS文字セットの文字で代替可能な文字(新字/旧字/本字/古字/ 俗字/別字体の関係にあるなど)はJIS文字セットの文字に置き換えるようにし た。 RxJisToDbcsで全角ハ行+濁点が全角濁音に変換されないのを修正した。 RxJisQuotedPrintableTo/RxJisMimeJisToで=16進の形式のQuotedPrintableの データがあると Incorrect call to routine になるバグを直した。 JisXX関数で、与えた文字列の長さが0の時、結果の文字列がヌル文字列にならな いバグを直した。 1996-5-27: 0.52 バグフィックス RxJisToJisのエスケープシーケンスが正しくないのを修正した。 バージョン番号が0.50だったのを0.52に直した。 1996-5-24: 0.51 バグフィックス RxJisToJisのエスケープシーケンスが正しくないのを修正した。 MIMERECVで一部の制御文字をブランクに変換するのを止めた。 1996-5-19: 0.50 機能拡張&バグフィックス RFC1554のSingle Sift 2をデコードできるようにした。 RFC1554で規定されているエスケープシーケンス以外のコードセット変更の条件 をインプリメントした。 RFC1557で規定されているエスケープシーケンスを扱うようにした。ただし、 ISO-2022-KRをPCコードに変換する機能はない。エスケープシーケンスを含めた 文字列が結果にはいるだけである。 RxJisToSbcs/RxJisToAscii/RxJisToDbcs/RxJisToUpper関数を追加した。 1996-5-1: 0.40 機能拡張&バグフィックス RxJisMimeJisTo/RxJisJisCharTo/RxJisToJisChar関数を追加した。 RxJisLoadFuncsを繰り返して呼ぶとメモリーリークを起こす事があるバグを直し た。 MIMERECV.CMDでRxJisMimeJisToを使うようにした。 1996-4-21: 0.30 機能拡張&バグフィックス JIS78のサポートを追加した。 変換結果がが255文字を越えると Incorrect call to routine になることのあるバグを直した。 JIS7ビット文字列を変換する時に、不完全なエスケープシーケンスがあるとハン グするバグを直した。 変換時のパフォーマンスを大幅に上げた。 無効な漢字コードをブランクに変換するようにした。 C/C++からも呼べるようにRXJIS.HとRXJIS.LIBをパッケージに追加した。 MIMERECVでMIMEのヘッダーが小文字でも正常に動作するようにした。 EXEPACK:2を止めてOS/2 Warp以前の環境でも動作するようにした。(十分なテス トはしていない。) 1996-3-20: 0.20 機能拡張&バグフィックス RxJisToEuc RxJisEucTo RxJisJisTo を追加した。 変換対象として長さが0の文字列を与えた時に Incorrect call to routine が起きる仕様だったのを長さ0の文字列を返すように変更した。 サンプルの.CMDから不要なTRACEを取った。 RxJisLoadFuncsが返すバージョン番号が0.00だったのを0.20に変更した。 スタックの消費量を減らした。 Warpの実行環境が旧JIS並びの場合、JISとPCコードの相互変換が正しく行われる ようにした。 変換対象の文字列の中にヌル文字が含まれている時、変換が正しくないのを正 しい様にした。 ペアになっていないエスケープシーケンスがあると、トラップを起こしていたの を修正した。 MIMERESVでタブとエスケープ文字以外のコントロールキャラクターをブランクに 変換するようにした。 MIMERECV.CMDで、REXXUTILをロードするようにした。 1996-2-14: 0.10 機能拡張&バグフィックス MIMESEND.CMDで、REXXUTILをロードするようにした。 MIMESEND.CMDでNOMIMEファイルがない時にNOVALUE条件が起こらないよ うにした。 RxJisToPcで、漢字インより前に漢字アウトがあった時に、漢字インを 補って変換するようにした。 ビルド環境をCSET++ 2.1からVisualAage C++ 3.0に変更した。 対象実行環境をWarp以降に限定した。 1996-2-5: 0.00 最初のリリース 各関数の説明:[]内はC/C++から呼ぶ時の名前。パラメーターの詳細はRXJIS.H を参照のこと。C/C++から呼ぶ時は、変換後の文字列の長さを返す。-1ならバッ ファーが足りないなどのエラーが起きている。 RxJisLoadFuncs: r = RxJisLoadFuncs() RXJISユーテリティ関数をロードします。 引数: なし 戻り: ユーティリティーのバージョンを示す文字列を返します。 RxJisDropFuncs: RXJISユーテリティ関数をアンロードします。 r = RxJisDropFuncs() 引数: なし 戻り: 空文字列を返します。 RxJisToPc: RxJisJisTo: [JisJisTo(target, source, targetsize)] r = RxJisToPc(s) r = RxJisJisTo(s) 引数: s: JIS7ビットでエンコードされた文字列。 戻り: PC文字コードの文字列を返します。 RxJisToJis: [JisToJis(target, source, targetsize)] r = RxJisToJis(s) 引数: s: PC文字コード文字列。 戻り: JIS7ビットでエンコードされた文字列を返します。 RxJisToEuc: [JisToEuc(target, source, targetsize)] r = RxJisToEuc(s) 引数: s: PC文字コード文字列。 戻り: EUCでエンコードされた文字列を返します。 RxJisEucTo: [JisEucTo(target, source, targetsize)] r = RxJisEucTo(s) 引数: s: EUCでエンコードされた文字列。 戻り: PC文字コードの文字列を返します。 RxJisToBase64: [JisToBase64(target, source, targetsize)] r = RxJisToBase64(s) 引数: s: 文字列。 戻り: sをMIME BASE64フォーマットでエンコードした文字列を返します。 RxJisToQuotedPrintable: [JisToQuotedPrintable(target, source, targetsize)] r = RxJisToQuotedPrintable(s) 引数: s: 文字列。 戻り: sをMIME Quoted Printableフォーマットでエンコードした文字列を返し ます。 RxJisBase64To: [JisBase64To(target, source, targetsize)] r = RxJisBase64To(s) 引数: s: BASE64フォーマットの文字列。 戻り: sをデコードした文字列を返します。ただし、MIMEでエンコードした文 字列のみを渡す必要があります。「=?charset?B?」と「?=」を渡す文字 列の中に 含めてはいけません。 RxJisQuotedPrintableTo: [JisQuotedPrintableTo(target, source, targetsize)] r = RxJisQuotedPrintableTo(s) 引数: s: Quoted Printableフォーマットの文字列。 戻り: sをデコードした文字列を返します。ただし、MIMEでエンコードした文 字列のみを渡す必要があります。「=?charset?B?」と「?=」を渡す文字 列の中に 含めてはいけません。 RxJisMimeJisTo: [JisMimeJisTo(target, source, targetsize)] r = RxJisMimeJisTo(s) 引数: s: MIMEでエンコードした7ビットJIS文字列を含む文字列。 戻り: sをデコードした文字列を返します。戻すのはPCコードの文字列です。sにMIMEエ ンコード標識「=?charset?B?」と「?=」が中に含まれていても構いません。 RxJisJisCharTo: [JisJisCharTo(target, source, targetsize)] r = RxJisJisCharTo(s) 引数: s: JISコードの漢字1文字。 戻り: sをPC漢字コードにデコードした文字を返します。 RxJisToJisChar: [JisToJisChar(target, source, targetsize)] r = RxJisToJisChar(s) 引数: s: PC漢字コードの漢字1文字。 戻り: sをJISコードにデコードした文字を返します。 RxJisToSbcs: [JisToSbcs(target, source, targetsize)] r = RxJisToSbcs(s) 引数: s: PCコードの文字列。 戻り: sの中のDBCS文字をSBCS文字に変換した文字列を返します。DBTOSBCSと異なり、 濁音/半濁音の全角片仮名を半角片仮名+濁点/半濁点に変換します。 RxJisToDbcs: [JisToDbcs(target, source, targetsize)] r = RxJisToDbcs(s) 引数: s: PCコードの文字列。 戻り: sの中のSBCS文字をDBCS文字に変換した文字列を返します。DBTODBCSと異なり、 半角片仮名+濁点/半濁点を全角濁音/半濁音に変換します。また、全角平仮名/片 仮名+濁点/半濁点を全角濁音/半濁音に変換します。 RxJisToAscii: [JisToAscii(target, source, targetsize)] r = RxJisToAscii(s) 引数: s: PCコードの文字列。 戻り: sの中のDBCS文字をSBCS文字に変換した文字列を返します。DBTOSBCSと異なり、 全角片仮名は変換しません。全角ASCII文字のみ変換します。 RxJisToUpper: [JisToUpper(target, source, targetsize)] r = RxJisToUpper(s) 引数: s: PCコードの文字列。 戻り: sの中の文字を大文字に変換した文字列を返します。拡張規則として: 全角/半角の英/ギリシャ/ロシア小文字→全角/半角の英大文字 全角/半角の片仮名小文字→全角/半角の片仮名 平仮名小文字→平仮名大文字 全角の片仮名/平仮名の濁音/半濁音→清音 漢字の旧字体/俗字体/誤字体/古字体→新字体/本字体 全角/半角の「・」「ー」「゜」「゛」→削除 を使います。 RxJisToZenkakuKatakana: [JisToZenkakuKatakana(target, source, targetsize)] r = RxJisToZenkakuKatakana(s) 引数: s: PCコードの文字列。 戻り: 半角片仮名だけ、RxJisToDbcsと同じ規則で全角文字に変換します。ASCII文字は 変換しません。 RxJisWords: [int JisWords(char* string)] r = RxJisWords(s) 引数: s: PCコードの文字列。 戻り: 文字列のワード数を返します。words関数と異なり、DBCS文字は1ワードと数えま す。禁則処理をサポートして、「は、」などは1ワードと数えます。 RxJisWord: [int JisWord(char* target, char* string, int targetsize, int n)] r = RxJisWord(s, n) 引数: s: PCコードの文字列。 n: 数字 戻り: 文字列sのnワード目を返します。ワードの数え方の規則はRxJisWordと同じです。 RxJisWordIndex: [int JisWord(char* string, int n)] r = RxJisWordIndex(s, n) 引数: s: PCコードの文字列。 n: 数字 戻り: 文字列sのnワード目がsの何文字目にあるかを返します。ワードの数え方の規則 はRxJisWordと同じです。 RxJisAppend: [int JisAppend(char* target, char* string, int targetsize)] r = RxJisAppend(s, t) 引数: s, t: PCコードの文字列。 戻り: 文字列sにtを付け足します。sの最後とtの最初がSBCS文字なら間に空白を1つ挟 みます。 RxJisUrlToVar: r = RxJisUrlToVar(s, t) WEBクライアントがFORMを送信した時のURLのselector部分をREXXのSTEM変数に 格納します。GOSERVEのhttpモードで使うことを想定しています。7ビットJISで urlに入っているした漢字はPCコードに変換の上、REXXの変数に入ります。%で エンコードされた文字もデコードして格納します。 引数: s: URLのselector部分 t: stem名。デフォルトは"URL"。 戻り: 空文字列 例: form.html?the1st=abc+def&the2nd=%40abc を渡すと url.the1st: "abc def" url.the2nd: "@abc" となる。 RxJisIso8859_1ToCp850(s): RxJisIso8859_2ToCp852(s): RxJisIso8859_9ToCp857(s): RxJisCp850ToIso8859_1(s): RxJisCp852ToIso8859_2(s): RxJisCp857ToIso8859_9(s): [JisCp857ToIso8859_9(target, source, targetsize)] [JisCp852ToIso8859_2(target, source, targetsize)] [JisCp850ToIso8859_1(target, source, targetsize)] [JisIso8859_1ToCp850(target, source, targetsize)] [JisIso8859_2ToCp852(target, source, targetsize)] [JisIso8859_9ToCp857(target, source, targetsize)] 各々のコードページの間でコード変換をします。 [int JisFindWord(char *s, int size, int pos, int *startword)] この関数は、C/C++インターフェース専用です。REXXにはありません。長さsize の文字列sのpos位置(0開始)から後の語の位置を検索します。開始位置は startwordに、語の長さは戻り値に入ります。語が無ければ、0を返します。日 本語の簡易禁足処理をサポートし、行頭/行末禁止文字が単独の語として返りま せん。また、DBCS文字は単独の語になります。 RxJisKanjiAlias(c): [int JisKanjiAlias(wchar_t c, wchar_t* a, int sizeofa)] 漢字cの俗字体/旧字体/新字体/本字体/古字体/誤字体/本字体があれば、配列t に格納して返します。cも含めて必ず複数の文字が配列tに格納します。返す文 字の数が戻り値です。なければ0が帰ります。-1はエラーを意味します。 RxJisPriority(c, p): REXXが走っているスレッドのプライオリティをクラスc、プライオリティpに設 定します。引数がない時は、現在のスレッドの値を「クラス プライオリティ」 で返します。設定した時も設定後の値を同じ形式で返します。cが0の時は、pは 現在のプライオリティに対する差分になります。cが0以外の時は、プライオリ ティはpになります。cは0から4、pは-31から31です。クラスもプライオリティ も小さな数字の方が低い優先度となります。 RxJisTrace(s): PMPRINTFのウィンドウにメッセージsを出力します。出力フォーマットは: ICLUI: 00000000 000089:01 >970912071426: hello 00000000 行番号。メッセージを出す度に増えます。 000089:01 プロセスID:スレッドID >970912071426: 年月日時分秒: hello メッセージ RxJisSyslog(s): TCP/IP機能のsyslogのログファイルにメッセージsを出力します。出力フォーマッ トは: 980527071816: hello 970912071426: 年月日時分秒: hello メッセージ デフォルトではローカルのsyslogdにメッセージを送ります。環境変数 RXJISSYSLOGDにホスト名またはIPアドレスを指定しておくと、そこへ送ります。な お、syslogdのログファイルはデフォルトでは\MPTN\ETC\SYSLOG.MSGです。 サンプル: MIMESEND.CMD: シフトJIS書かれたメールファイルをヘッダはMIMEでエンコード、メール本体は7 ビットJISに変換するユーティリティ。PostRoadMailerのuser exitに使えます。 NOMIMEというファイルに書いてあるドメインに送る時は、ヘッダーは7ビットJIS にしか変換しません。メール本体やヘッダに日本語の文字が含まれていない時 は、変換をしません。また、メールヘッダーには、メッセージ本体をチェックし てメール本体が日本語かどうかの記述も加えます。なお、マルチパートに対応し ていません。 NOMIMEの例: fin.go.jp # this is comment # the mail to foo@fin.go.jp or foo@jusen.fin.go.jp is no MIME mail. # blank line is ignored foo@hel.com # a line keeps only one domain or one address or one host. MIMERECV.CMD ヘッダーがMIMEまたはJIS7ビットで書かれ、メール本体がJIS7ビットの メールをシフトJISに変換するユーテリティー。PostRoadMailerのuser exitに使えます。 FMTTEXT3.ERXについて FMTTEXT3.ERXは、RXJISとともに使うEPM用の簡易テキストフォーマッターで す。簡易禁足処理にも対応しています。ラインマークした領域をフォーマット します。コマンドダイアログから RX C:\OS2\APPS\FMTTEXT3 のような形で使います。パラメーターが3つあり、第一は左マージン位置、第二は右マー ジン位置、第三は、段落の最初のパラメーターでの左マージン位置です。各々省略可能 で、省略時には、左マージン1、右マージン位置64、段落の最初のマージン位置は左マー ジンと同じ、になります。 この形で使います。 パラメーターが3つあり、第一は左マージン位置、第二は右マー ジン位置、第三は、段 落の最初のパラメーターでの左マージン位置です。 フォマットはの前に、フォーマットする 領域をラインマークしておくことが 必要です。 をRX FMTTEXT3 4 30 6でフォーマットすると この形で使います。パラ メーターが3つあり、第一は 左マージン位置、第二は右 マージン位置、第三は、段落 の最初のパラメーターでの左 マージン位置です。 フォマットはの前に、 フォーマットする領域をライ ンマークしておくことが必要 です。 となります。ツールバーに機能として、「*」、パラメーターとして、「RX FMTTEXT3」 などと設定して使うと便利でしょう。 ソースコードについて: RXJIS.CPP : RXJIS.DLLのソースです。 RXJIS.H : RXJIS.CPP/RXJIS.LIBのヘッダーです。 RXJIS.DEF : RXJIS.DLLのモジュール定義ファイルです。 RXJIS.MAK : MAKEファイルです。 RXJISTBL.CPP : RXJIS.DLLのソースです。 RXJISTBL.HPP : RXJIS.DLLのソースです。 PCTOJIS.HPP : RXJIS.DLLのソースです。 PCTOJIS.CPP : RXJIS.DLLのソースです。 PC2JIS.HPP : RXJIS.DLLのソースです。 PC2JIS.CMD : MAKEファイルの中で使います。 PC2JIS.DAT : PC2JIS.CPPをPC2JIS.CMDが作るためのデータです。 IBM2JIS.HPP : RXJIS.DLLのソースです。 IBM2JIS.CMD : MAKEファイルの中で使います。 IBM2JIS.DAT : IBM2JIS.CPPをIBM2JIS.CMDが作るためのデータです。 JIS2PC.HPP : RXJIS.DLLのソースです。 JIS2PC.CMD : MAKEファイルの中で使います。 JIS2PC.DAT : JIS2PC.CPPをJIS2PC.CMDが作るためのデータです。 BUILD.CMD : ビルドに使うコマンドです。 JISCASE.CMD : ビルドに使うコマンドです。 JISCASE.HPP : RXJIS.DLLのソースです。 JISCASE1.DAT : JISCASE.CPPをJISCASE.CMDが作るためのデータです。 JISCASE2.DAT : JISCASE.CPPをJISCASE.CMDが作るためのデータです。 JISCASE3.DAT : JISCASE.CPPをJISCASE.CMDが作るためのデータです。 JISCASE4.DAT : JISCASE.CPPをJISCASE.CMDが作るためのデータです。 JISCASE5.DAT : JISCASE.CPPをJISCASE.CMDが作るためのデータです。 JISCASE6.DAT : JISCASE.CPPをJISCASE.CMDが作るためのデータです。 JISCASE7.DAT : JISCASE.CPPをJISCASE.CMDが作るためのデータです。 JISCASE8.DAT : JISCASE.CPPをJISCASE.CMDが作るためのデータです。 BUILD RXJIS.DLLをビルドします。 BUILD DLL RXJIS.DLLをビルドします。 BUILD ZIP リリースパッケージのRXJIS.ZIPをビルドします。 使ったコンパイラーはVisualAge C++ 3.0(英語版)です。 CSDは、FixPak8を当てています。