アプリ版:「スタンプのみでお礼する」機能のリリースについて

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 …

・babel
http://tricklib.com/cxx/ex/babel/

・漢字コード変換ライブラリ
http://www.vector.co.jp/soft/win95/prog/se087586 …

・ack
http://hp.vector.co.jp/authors/VA004474/win/ack. …

・SJET
http://www.vector.co.jp/soft/dl/dos/util/se01839 …

A 回答 (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」を定義するか定義しないかを決めるとソースコードを手直しする必要が無くなるので、削っておいた方がいいかも。
    • good
    • 0

>マトモに動く保証もしない。



案の定、str++が1つ余計で、マトモに動かない。余計なstr++を削れば動く。
    • good
    • 0
この回答へのお礼

引き続き、回答ありがとうございます。

ちなみに、
>案の定、str++が1つ余計で、マトモに動かない。余計なstr++を削れば動く。
どちらの「str++」が削除対象でしょうか?

お礼日時:2009/01/19 13:30

>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変換は、上記の逆をやれば良い。
    • good
    • 0
この回答へのお礼

No.4も含めて、回答ありがとうございました。

またソースコード掲載もありがとうございます。
試しに動かしてみます。

お礼日時:2009/01/19 13:06

自分で作った方が早いのでは?


あるいは、外注してもこの程度なら数万円で作ってくれるところがあるはずです。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

そうですね。自分で作った方が早いでしょうし、
皆さんの回答を待っている間にでも作ってしまえばよかったですね。

ただ、気になるのは、このような文字コード変換ってこれまで数多くのシステム・アプリケーションで使われて来ていると思うのですが、「これだ」という決定版というか定番のライブラリっていうのは、どれなんだろう、という疑問もあります。

今までLinux上の制御系PGが多かったもので、ただ単に私がものを知らないだけなのですが、Windows/C++プログラミングでの定番ライブラリっていうものは、いったいどんなものがあるのでしょうか?

お礼日時:2009/01/19 13:04

wkf や kcc はいかがでしたか?


http://www.mysticwall.com/software/wkf/
http://www.fukatani.org/~hi-lo/blog/archives/000 …

kccはSI/SOに対応しているような記述があるようです。
http://www.pinkdragon.net/DocumentsLibrary/conte …

いずれも私は試していませんが・・・申し訳ありません。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

どちらもUNIX/Linux系みたいですね。
ソースが入手できるようなので、Windowsで使えそうか試してみます。

>kccはSI/SOに対応しているような記述があるようです。

そうですね。期待できそうです。
他のライブラリでも、JIS7->SJIS変換時に、SI/SOを認識してSJISに出力できるライブラリもあったのですが、その逆(SJIS->JIS7)変換時に、SI/SOを出力してくれないというケースがありました。

kccでは実現できることを期待してます。
結果はのちほど。

お礼日時:2009/01/19 12:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!