- ベストアンサー
シフトJIS/7ビットJISの変換ライブラリについて
C/C++で使える漢字コード変換のライブラリを探しています。 以下の条件に当てはまるライブラリ等ご存じでしたら、教えていただけないでしょうか? 1.C/C++で使用可(VisualC++, BorlandC++Builderなど、Windows環境) 2.シフトJISと7ビットJISコードの変換が可能(sjis -> jis, jis -> sjis) 3.SI/SO方式(0x0E/0x0F)でカタカナ/アルファベットを切り替えている7ビットJISコードからシフトJISへの変換が可能。また、同様に、シフトJISからSI/SO方式の7ビットJISコードへの変換が可能 4.ソースコードがあれば尚良い。 特に、3.のSI/SO方式で変換可能ライブラリを探しているのですが、なかなか見つかりません。 「ESC(I」「ESC(J」「ESC$B」を使用してアルファベット/カタカナの変換はどのライブラリでもできているのですが、上記のSI/SO方式での変換ができません。 現在までに評価して駄目だったものをリストにしてみます。 これ以外にご存じの方、もしくは、このリストに載っているものでも可能だよ!、というご意見などいただければ幸いです。 ・nkf for windows http://www.vector.co.jp/soft/win95/util/se295331.html ・babel http://tricklib.com/cxx/ex/babel/ ・漢字コード変換ライブラリ http://www.vector.co.jp/soft/win95/prog/se087586.html ・ack http://hp.vector.co.jp/authors/VA004474/win/ack.txt ・SJET http://www.vector.co.jp/soft/dl/dos/util/se018396.html
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>4.ソースコードがあれば尚良い。 #define USE_SISO #ifdef USE_SISO #define SI 0x0e #define SO 0x0f #endif #define ESC 0x1b #define KI1 '$' #define KI2 'B' #define KO1 '(' #define KO2 'J' #ifndef USE_SISO #define KN2 'I' #endif enum { ASCII=0, KANA, KANJI }; char *SJIStoJIS(unsigned char sjis[2]) { static unsigned char jis[2]; jis[0]=sjis[0]; jis[1]=sjis[1]; if (jis[0] <= 0x9f) { jis[0]-=0x71; } else { jis[0]-=0xb1; } jis[0]*=2; jis[0]++; if (jis[1] >= 0x7f) { jis[1]-=0x01; } if (jis[1] >= 0x9e) { jis[1]-=0x7d; jis[0]++; } else { jis[1]-=0x1f; } return jis; } char * ConvSJIStoJIS(char *str,char *ptr) { int mode = ASCII; char *p = ptr,*rp; unsigned char c; for (;;) { c = *str; if ((c <= 0x7f) { if (mode != ASCII) { #ifdef USE_SISO if (mode == KANA) { *p++ = SO; } else { *p++ = ESC; *p++ = KO1; *p++ = KO2; } #else *p++ = ESC; *p++ = KO1; *p++ = KO2; #endif mode = ASCII; } *p++ = c; if (!c) break; } else if ((c >= 0xa0) && (c <= 0xdf)) { if (mode != KANA) { #ifdef USE_SISO if (mode == KANJI) { *p++ = ESC; *p++ = KO1; *p++ = KO2; } *p++ = SI; #else *p++ = ESC; *p++ = KO1; *p++ = KN2; #endif mode = KANA; } *p++ = (c & 0x7f); } else { if (mode != KANJI) { #ifdef USE_SISO if (mode == KANA) { *p++ = SO; } #endif *p++ = ESC; *p++ = KI1; *p++ = KI2; mode = KANJI; } rp = SJIStoJIS(str++); *p++ = *rp++; *p++ = *rp; str++; } str++; } return ptr; } SJIS⇒JIS変換。検証(動作確認等)はしていない。コンパイルできる保証はしないし、マトモに動く保証もしない。 JIS⇒SJIS変換は、上記の逆をやれば良い。
その他の回答 (4)
- chie65536(@chie65535)
- ベストアンサー率44% (8800/19959)
>試しに動かしてみます。 動かす場合は rp = SJIStoJIS(str++); *p++ = *rp++; *p++ = *rp; /* str++; こいつが余計 */ } str++; } return ptr; } で。 あと #define USE_SISO の行は削っておいて、コンパイルする時に cc -DUSE_SISO convsjis.c か cc convsjis.c などのように、コンパイラのスイッチによって「USE_SISO」を定義するか定義しないかを決めるとソースコードを手直しする必要が無くなるので、削っておいた方がいいかも。
- chie65536(@chie65535)
- ベストアンサー率44% (8800/19959)
>マトモに動く保証もしない。 案の定、str++が1つ余計で、マトモに動かない。余計なstr++を削れば動く。
お礼
引き続き、回答ありがとうございます。 ちなみに、 >案の定、str++が1つ余計で、マトモに動かない。余計なstr++を削れば動く。 どちらの「str++」が削除対象でしょうか?
- jacta
- ベストアンサー率26% (845/3158)
自分で作った方が早いのでは? あるいは、外注してもこの程度なら数万円で作ってくれるところがあるはずです。
お礼
回答ありがとうございました。 そうですね。自分で作った方が早いでしょうし、 皆さんの回答を待っている間にでも作ってしまえばよかったですね。 ただ、気になるのは、このような文字コード変換ってこれまで数多くのシステム・アプリケーションで使われて来ていると思うのですが、「これだ」という決定版というか定番のライブラリっていうのは、どれなんだろう、という疑問もあります。 今までLinux上の制御系PGが多かったもので、ただ単に私がものを知らないだけなのですが、Windows/C++プログラミングでの定番ライブラリっていうものは、いったいどんなものがあるのでしょうか?
- taknak08
- ベストアンサー率50% (8/16)
wkf や kcc はいかがでしたか? http://www.mysticwall.com/software/wkf/ http://www.fukatani.org/~hi-lo/blog/archives/000071.html kccはSI/SOに対応しているような記述があるようです。 http://www.pinkdragon.net/DocumentsLibrary/contents/ja/Linux_man/kcc.1.html いずれも私は試していませんが・・・申し訳ありません。
お礼
回答ありがとうございました。 どちらもUNIX/Linux系みたいですね。 ソースが入手できるようなので、Windowsで使えそうか試してみます。 >kccはSI/SOに対応しているような記述があるようです。 そうですね。期待できそうです。 他のライブラリでも、JIS7->SJIS変換時に、SI/SOを認識してSJISに出力できるライブラリもあったのですが、その逆(SJIS->JIS7)変換時に、SI/SOを出力してくれないというケースがありました。 kccでは実現できることを期待してます。 結果はのちほど。
お礼
No.4も含めて、回答ありがとうございました。 またソースコード掲載もありがとうございます。 試しに動かしてみます。