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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- その他(パソコン・スマホ・電化製品) ウィルスバスターモバイルについて。 iphone12 miniで、ウィルスバスターモバイルを使ってい 2 2022/07/10 12:59
- モテる・モテたい バイトで、同い年で後輩の女の子がいます。 その子は控えめだけど、男女問わず愛想が良い子です。 バイト 2 2022/12/09 21:29
- 片思い・告白 バイトで、同い年で後輩の女の子がいます。 その子は控えめだけど、男女問わず愛想が良い子です。 バイト 3 2022/12/09 19:33
- 片思い・告白 以下の文章を踏まえて、相手のLINEの返信がまだ来ていない状況で、今日の夜、「明日、バイト帰りにご飯 1 2023/02/27 19:47
- C言語・C++・C# 【C言語】全角文字の配列を、全角のまま1文字ずつ出力する方法 4 2023/05/09 15:08
- 片思い・告白 バイトで、同い年で後輩の女の子がいます。 その子は控えめだけど、男女問わず愛想が良い子です。 バイト 2 2022/12/09 21:15
- 片思い・告白 バイトで、同い年で後輩の女の子がいます。 バイトの初日に、「タメでいいよ!」と僕は言いましたが、 そ 2 2022/11/26 17:06
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
10Mバイトて文字数に すると何...
-
「1TB」のHDDに日本語は何字入...
-
UTF-8で5~6バイトになる文字コ...
-
COBOLのCOMP形式について
-
char str[256]の256の意味は?
-
エクセルシート名の制限を変更...
-
バイナリとBCDコード
-
3バイト文字(UTF-8)をprintfで...
-
ビットスワップとバイトスワッ...
-
SQLで1バイト、2バイト混在...
-
C言語において2バイト文字を検...
-
[VBScript][wsh]byte単位でのデ...
-
エクセル VBプロジェクトの...
-
バイト列とバイナリ列の違いが...
-
Javaで日本語1文字のバイト数
-
java6で4バイトUTF-8文字を利用...
-
半角、全角の判別方法
-
CRC計算方法
-
ピクセル,dpiから容量(バイト...
-
text型の文字数
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10Mバイトて文字数に すると何...
-
UTF-8で5~6バイトになる文字コ...
-
エクセルシート名の制限を変更...
-
COBOLのCOMP形式について
-
ビットスワップとバイトスワッ...
-
char str[256]の256の意味は?
-
バイナリとBCDコード
-
ピクセル,dpiから容量(バイト...
-
バイト列とバイナリ列の違いが...
-
UCS-2の一覧表が欲しい
-
SQLで1バイト、2バイト混在...
-
全角半角を調べるライブラリ関...
-
3バイト文字(UTF-8)をprintfで...
-
Javaで日本語1文字のバイト数
-
URLは最高何文字まで可能なので...
-
「1TB」のHDDに日本語は何字入...
-
1KBが1024byteな理由
-
COBOL PICTUREで X,S,Vの意味
-
memcmp バイナリデータの比較方法
-
機種依存文字をチェックしたい。
おすすめ情報