• ベストアンサー

シフト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

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8481/19299)
回答No.3

>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変換は、上記の逆をやれば良い。

nepiatissue
質問者

お礼

No.4も含めて、回答ありがとうございました。 またソースコード掲載もありがとうございます。 試しに動かしてみます。

その他の回答 (4)

  • chie65535
  • ベストアンサー率43% (8481/19299)
回答No.5

>試しに動かしてみます。 動かす場合は    rp = SJIStoJIS(str++);    *p++ = *rp++;    *p++ = *rp;    /* str++; こいつが余計 */   }   str++;  }  return ptr; } で。 あと #define USE_SISO の行は削っておいて、コンパイルする時に cc -DUSE_SISO convsjis.c か cc convsjis.c などのように、コンパイラのスイッチによって「USE_SISO」を定義するか定義しないかを決めるとソースコードを手直しする必要が無くなるので、削っておいた方がいいかも。

  • chie65535
  • ベストアンサー率43% (8481/19299)
回答No.4

>マトモに動く保証もしない。 案の定、str++が1つ余計で、マトモに動かない。余計なstr++を削れば動く。

nepiatissue
質問者

お礼

引き続き、回答ありがとうございます。 ちなみに、 >案の定、str++が1つ余計で、マトモに動かない。余計なstr++を削れば動く。 どちらの「str++」が削除対象でしょうか?

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

自分で作った方が早いのでは? あるいは、外注してもこの程度なら数万円で作ってくれるところがあるはずです。

nepiatissue
質問者

お礼

回答ありがとうございました。 そうですね。自分で作った方が早いでしょうし、 皆さんの回答を待っている間にでも作ってしまえばよかったですね。 ただ、気になるのは、このような文字コード変換ってこれまで数多くのシステム・アプリケーションで使われて来ていると思うのですが、「これだ」という決定版というか定番のライブラリっていうのは、どれなんだろう、という疑問もあります。 今までLinux上の制御系PGが多かったもので、ただ単に私がものを知らないだけなのですが、Windows/C++プログラミングでの定番ライブラリっていうものは、いったいどんなものがあるのでしょうか?

  • taknak08
  • ベストアンサー率50% (8/16)
回答No.1

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 いずれも私は試していませんが・・・申し訳ありません。

nepiatissue
質問者

お礼

回答ありがとうございました。 どちらもUNIX/Linux系みたいですね。 ソースが入手できるようなので、Windowsで使えそうか試してみます。 >kccはSI/SOに対応しているような記述があるようです。 そうですね。期待できそうです。 他のライブラリでも、JIS7->SJIS変換時に、SI/SOを認識してSJISに出力できるライブラリもあったのですが、その逆(SJIS->JIS7)変換時に、SI/SOを出力してくれないというケースがありました。 kccでは実現できることを期待してます。 結果はのちほど。

関連するQ&A

  • JISコードをシフトJISコードに変換する方法

    紙とえんぴつを使ってJISコードをシフトJISコードに変換する方法を教えてください。 たしか16進数の変換などを使って出来ると聞いたことがあります。 一文字の漢字だけで良いんです。 例えば『高』という漢字のJISコード「3962」をシフトJISコード「8D62」に変換したいというわけです。 2進数や16進数の計算の知識だけはあります。よろしくお願いします。

  • JISとシフトJIS

    現在のPCで広く使われているシフトJISの文字コードと、JIS0208の文字コードの間にはなにか一定のルール(変換できるような)ものがあるのでしょうか?

  • シフトJISからUTF-8に変換

    UNIX系OSのC言語で文字列をシフトJISからUTF-8に変換する方法をご存知の方がいらっしゃいましたらご教授下さい。 なにとぞ宜しくお願いいたします。

  • シフトJISをunicodeへ(逆)変換したい

    このカテで良いのか良く分からなかったのですが... シフトJISのバイナリコードをunicodeバイナリコードへ(あるいは逆)変換するための対応表(URL)を探しているのですが良くわかりません。 米国で使用されている2バイトコード体系へ変換したいのでunicodeか否かはっきりしないという問題もあります。 以上について、わかりやすい参考URLがありましたら教えて下さい。

  • シフトJISのエンコード

    JavaScript で、 シフトJISのまま URLエンコードする関数(または 簡単な方法)はないでしょうか? 最近の JavaScript の escape でエンコードすると、日本語コードを 勝手に Unicode に変換してしまいます。 やはり、Unicode と シフトJISの対応表を持った関数を作らないと いけないのでしょうか? みなさんはどうしていますか?

  • コード変換ライブラリについて

    この度、Windowsの開発で、コード変換を行うことになりました。 変換内容は、 1.半角カナを全角カナに変換 2.半角英数字を全角英数字に変換 3.全角カナ(カタカナ)を全角ひらがなに変換 の3パターンです。 漢字コードはシフトJISのみです。 上記変換を行うためのライブラリを探しております。 ご存じのかたおりましたら、教えていただけませんでしょうか。開発環境はVC++.NETですが、UNIX等で動作しているものでもかまいません。

  • 「平成」 をシフトJISの文字コードに

    「平成」 をシフトJIS(SJIS)の文字コードに変換するとどうなるでしょうか?よろしくお願いします。

  • 文字コードshift-jisへの変換について

    お世話になります。 .NET C#にて開発をしております初心者です。 C#からテキストデータにデータの書き出しを行っており、 文字コードをUTF-8からSHIFT-JISへ変換したいのですが、 ネット等で確認し、記述したのですが、データの中には 半角カナ文字もあり、どうも変換がうまくいきません。 どなたかサンプルコードまたは、参考になるサイトなどを お教え頂きたく宜しくお願い致します。

  • シフトJIS⇒MIMEエンコード(RFC2047)

    シフトJISの文字列をMIMEエンコード(RFC2047) (メールのヘッダに使うような、=?ISO-2022-JP?B?・・・というようなヤツ) に変換する、unix系gcc(C++ではなくてC)でコンパイルできるライブラリ、 ないでしょうか。。? 途中まで作りかけたのですが、 あまりに複雑でギブアップしてしまいまして。。 また、用途上、nkfなどの外部プログラムは呼び出せないのです。

  • 入力した漢字をシフトJISコードに変換したいのですが

    パームウエアの開発に使用するため、 ウインドウに入力した漢字をシフトJISコードに変換してくれるような便利なソフトウエア?(Windows用のアプリケーション)は無いでしょうか ご存知の方教えてください。