![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
Borland C++ Builder5 を使っています。
日本語の1バイト目(または2バイト目)のチェックをしたいと考えています。
nthctype()関数を使えば良さそうなのですが、jstring.hをincludeしても、リンカエラーとなってしまいます。
他に何をincludeしたら良いのでしょうか?
あるいは、nthctype()関数にこだわらず、1バイト目の判定が出来る方法があったらご指導いただければ幸いです。
要は、ある文字が、日本語の1バイト目であるか、2バイト目であるか、それ以外であるかが分かればOKです。
なお、文字はS-JISで作成されています。
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 );
ありがとうございました。
(コメントが遅くなり申し訳ありませんでした。)
ByteTypeを使うと、2バイト目のチェックもしっかり出来るのですね!
今後はこれを使うこととします。
No.4
- 回答日時:
移植性を全く考慮しないのであれば、_ismbbleadおよび_ismbbtrail関数がそれに当たります(使用方法はドキュメントを読んでください)。
ただし、#3でも指摘されているように、_ismbbtrailが真を返したからといって、必ずしも2バイト目であるとは限りません。移植性を考えるのであれば、正しい多バイト文字かどうかを判定するには、mblenを使うのがよいかと思います。すなわち、
char s[] = "あ";
if (mblen(s, 1) == 1)
/* s[0]は単バイト文字 */
else
/* s[0]は多バイト文字の1バイト目 */
といった具合です。
この方法を使うには、あらかじめsetlocale関数を用いてロケールを設定しておいてください。
みなさん回答ありがとうございました。
どうも_ismbbleadを使うのが良さそうですね。
今回の仕様は、ある長さの文字列(1バイト2バイト混在)を途中で切る、というものです。
このとき、2バイト文字の途中で切ることは避けるために、このチェックを入れたいのです。
2バイト目のチェックをしても必ずしも正しい結果を得られないようですから、切る位置の1バイト前を調べるようにしようと思います。
No.3
- 回答日時:
私もBLUEPIXYさんと同じ内容で回答しようとしてました。
でも、ちょっと注意が必要です。
isSJIS2()で0以外が返ってきた際、必ずしも漢字の2バイト目である保証はありません。
→1バイト目が漢字コードで且つisSJIS2()で0以外が返ってきた場合、漢字2バイト目という認識になります。
たとえば、いきなり isSJIS2('A')を実行すると漢字2バイト目と認識されてしまいます。
以上、ANo.#2へ補足させて頂きました。
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);
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UTF-8で5~6バイトになる文字コ...
-
COBOLのCOMP形式について
-
エクセルシート名の制限を変更...
-
SQLで1バイト、2バイト混在...
-
:(コロン)のKeyCode
-
バイト配列 抜き出す
-
バイト列とバイナリ列の違いが...
-
COBOL PICTUREで X,S,Vの意味
-
[VBScript][wsh]byte単位でのデ...
-
10Mバイトて文字数に すると何...
-
64bit対応
-
16bitアクセスRAMとは
-
最大長を用意せずにバイナリデ...
-
「1TB」のHDDに日本語は何字入...
-
ReadProcessMemoryの読み込みバ...
-
ポインター引数の関数でコンパ...
-
DataGridViewの特定列に入力さ...
-
Excel VBA メール作成について ...
-
Rstudioによるテキストマイニン...
-
stable diffusionのエラー
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10Mバイトて文字数に すると何...
-
エクセルシート名の制限を変更...
-
UTF-8で5~6バイトになる文字コ...
-
char str[256]の256の意味は?
-
「1TB」のHDDに日本語は何字入...
-
COBOLのCOMP形式について
-
バイナリとBCDコード
-
バイト列とバイナリ列の違いが...
-
ビットスワップとバイトスワッ...
-
ピクセル,dpiから容量(バイト...
-
SQLで1バイト、2バイト混在...
-
UCS-2の一覧表が欲しい
-
【VB2005】テキストボックス内...
-
Javaで日本語1文字のバイト数
-
3バイト文字(UTF-8)をprintfで...
-
機種依存文字をチェックしたい。
-
Visual Basicでパック10進(2進...
-
[VBScript][wsh]byte単位でのデ...
-
memcmp バイナリデータの比較方法
-
COBOL PICTUREで X,S,Vの意味
おすすめ情報