• ベストアンサー

BCB5 日本語の1バイト目のチェック

Borland C++ Builder5 を使っています。 日本語の1バイト目(または2バイト目)のチェックをしたいと考えています。 nthctype()関数を使えば良さそうなのですが、jstring.hをincludeしても、リンカエラーとなってしまいます。 他に何をincludeしたら良いのでしょうか? あるいは、nthctype()関数にこだわらず、1バイト目の判定が出来る方法があったらご指導いただければ幸いです。 要は、ある文字が、日本語の1バイト目であるか、2バイト目であるか、それ以外であるかが分かればOKです。 なお、文字はS-JISで作成されています。

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

  • ベストアンサー
  • KoHal
  • ベストアンサー率60% (110/181)
回答No.6

別にヘルプに書いてある通りの関数で難しいことはないはず…、と思ったら、ヘルプに誤記がありますね。あらら。 AnsiStringのメソッドは先頭1始まりです。  String str = "あAいBうCえDおE";  String result;  for ( int i=1; i<=str.Length(); ++i ) //範囲に注意  {   if ( str.IsLeadByte(i) )    result += String(i) + "バイト目はマルチバイト文字の先頭バイト\n";   else if ( str.IsTrailByte(i) )    result += String(i) + "バイト目はマルチバイト文字の後バイト\n";   else    result += String(i) + "バイト目はマルチバイト文字ではない\n";  }  ShowMessage( result ); ちなみに、上記のように3種に分類する必要があるならこっちのほうがスマート。  String str = "あAいBうCえDおE";  String result;  for ( int i=1; i<=str.Length(); ++i ) //範囲に注意  {   switch ( str.ByteType(i) ) {   case mbLeadByte:    result += String(i) + "バイト目はマルチバイト文字の先頭バイト\n";    break;   case mbTrailByte:    result += String(i) + "バイト目はマルチバイト文字の後バイト\n";    break;   case mbSingleByte:    result += String(i) + "バイト目はマルチバイト文字ではない\n";    break;   }  }  ShowMessage( result );

Han1344
質問者

お礼

ありがとうございました。 (コメントが遅くなり申し訳ありませんでした。) ByteTypeを使うと、2バイト目のチェックもしっかり出来るのですね! 今後はこれを使うこととします。

その他の回答 (5)

  • KoHal
  • ベストアンサー率60% (110/181)
回答No.5

BCBならAnsiString::IsLeadByte()がつかえます

Han1344
質問者

お礼

これも使えそうだ、と調べました。 しかし、イマイチ使い方が分からず、挫折してしまいました。 申し訳ありませんが、例文を挙げていただけると嬉しいのですが・・。

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

移植性を全く考慮しないのであれば、_ismbbleadおよび_ismbbtrail関数がそれに当たります(使用方法はドキュメントを読んでください)。ただし、#3でも指摘されているように、_ismbbtrailが真を返したからといって、必ずしも2バイト目であるとは限りません。 移植性を考えるのであれば、正しい多バイト文字かどうかを判定するには、mblenを使うのがよいかと思います。すなわち、 char s[] = "あ"; if (mblen(s, 1) == 1)  /* s[0]は単バイト文字 */ else  /* s[0]は多バイト文字の1バイト目 */ といった具合です。 この方法を使うには、あらかじめsetlocale関数を用いてロケールを設定しておいてください。

Han1344
質問者

お礼

みなさん回答ありがとうございました。 どうも_ismbbleadを使うのが良さそうですね。 今回の仕様は、ある長さの文字列(1バイト2バイト混在)を途中で切る、というものです。 このとき、2バイト文字の途中で切ることは避けるために、このチェックを入れたいのです。 2バイト目のチェックをしても必ずしも正しい結果を得られないようですから、切る位置の1バイト前を調べるようにしようと思います。

noname#20242
noname#20242
回答No.3

私もBLUEPIXYさんと同じ内容で回答しようとしてました。 でも、ちょっと注意が必要です。 isSJIS2()で0以外が返ってきた際、必ずしも漢字の2バイト目である保証はありません。 →1バイト目が漢字コードで且つisSJIS2()で0以外が返ってきた場合、漢字2バイト目という認識になります。 たとえば、いきなり isSJIS2('A')を実行すると漢字2バイト目と認識されてしまいます。 以上、ANo.#2へ補足させて頂きました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

リンクできない原因はよく分かりませんが Shift_JIS なら こんな感じでいいのでは // シフトJIS漢字文字の第1バイト目か? int isSJIS1(unsigned char ch){ return (ch >= 0x81 && ch <= 0x9F || ch >= 0xE0 && ch <= 0xFC); } // シフトJIS漢字文字の第2バイト目か? int isSJIS2(unsigned char ch){ return (ch >= 0x40 && ch <= 0x7E || ch >= 0x80 && ch <= 0xFC); }

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.1

BCCが手元に無いですが、<cctype>とisleadbyteでどうですか。

Han1344
質問者

お礼

すみません。 せっかくコメント付けてくれたのに、isleadbyteの使い方が良く分かりません。

関連するQ&A