• ベストアンサー

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

  • 日本語(2byte文字)の判別方法について【PHP4】

    こんにちは。よろしくお願い致します。 メールアドレスの入力チェックで 日本語(2byte文字)が入力されたら エラーを返すようにしたいのですが どのようにすればよいかわかりません。 マニュアルのマルチバイトに関する辺りを 読んでみたのですが、 それらしい関数をみつけることができませんでした・・。 アドバイスよろしくお願い致します。 環境:国際化版PHP 4.2.3

    • ベストアンサー
    • PHP
  • 全角日本語について

     全角日本語はchar型を2つ連続で続けて出力しないといけませんよね。半角だと1バイトですむところを2バイト使っているわけですけど。半角と全角が入り混じったテキストから的確に1文字ずつ取り出すことは出来ないのでしょうか?(2バイトずつ取り出すと、半角のところで文字化けになってしまいますし、1バイトずつだと全角のところが文字ばけしますよね。)半角の時は、半角を、全角の時は全角をという風に。。。  あと、全角の日本語を一文字として扱う型は何かないでしょうか。いつも、charの配列でchar[0],char[1]として使っているのですが。 ちなみに、windows98でBorlandのTurbo C++を使って、C言語で書いています。 なにとぞ、よろしくおねがいします。

  • BCBで使えるHTMLパーサー、リンクの抽出

    Borland C++Builderで使えるHTMLパーサーのVCLを探しています。海外では、THTMLParserなどを検索語にして調べると幾つかありましたが日本語が文字化けしたりして、調子よくありません。 http://www.dallas.net/~richardp/delphi/components/home.html 日本語の通るフリーのHTMLパーサーのVCLというのはご存知でしょうか。 また、実際にやりたいのは、ページから、 ・<TITLE>タグで囲まれたタイトルの抽出 ・<A HREF = URL>リンク文字列</A>  の、URL部分とリンク文字列のリストを得る ということなのですが、私の拙い知識では何度やってもうまく取り出すことができません。それでVCLでできないかなあと調子の良いことを考えています。こういった文字列解析の定石のようなコーディングはあるのでしょうか。 質問ばかりですみません。ご存知の方よろしくお願いいたします。

  • エンコード 日本語(JIS)が選べない

    教えてください。 Internet Explorer 9 を使用しています。 エンコード  Unicode(UTF-8)が選ばれており、 支障をきたしています。 http://okwave.jp/qa/q8078148.html 上記で支障をきたす理由記載。 日本語(シフト JIS)を選びたいのですが チェックを変えると文字化けしてしまい、 ホームに戻ってみると文字化けが解消されるとともに Unicode(UTF-8)にもどってしまいます。 自動選択にチェックいれてみたりためしましたが どうしてもUnicode(UTF-8)に勝手に戻ってしまいます。 日本語(シフト JIS)を設定するにはどうすればいいでしょうか? ヒントでも結構です! 宜しくお願い致します。

  • VC++で日本語(マルチバイト)ファイルの読み込み

    VC++で日本語(マルチバイト)の文字が含まれているファイルを読み込もうと思っています。 例えばunicodeのファイルとして下記の内容があるとして、 11111 abcdef いろはにほへと このファイルから1文字ずつ読み込みたいのですが、ヘルプで調べたところfgetwc関数でマルチバイトの読み込みができるということを調べました。 ファイルのオープンは_wfopenを使用しているのですが、テキストモード・バイナリモードでどちらで開いても、fgetwc関数の戻りはファイルを1byte読んだ結果を返します。 半角文字の場合は"1"とか"a"を単純に呼んで、マルチバイト文字であれは"い"とか"ろ"というデータを読み込みたいのですが、どうすればいいでしょうか?

  • BCBでVC++のDLLを利用するために

    C++Builder5で、VC++で作ったDLLを利用する必要に駆られてしまいました。 提供されているのはDLL本体とヘッダの2点で、BCBからリンクするために、implibを使ってdllからlibの作成をし、プロジェクトに加え、ヘッダをインクルードしました。続けて試しにコードを書いたところ、 '外部シンボル_initialize_libraryが未解決' との表示。(initialize_libraryとはDLL内にある関数です。) 調べてみたところ、 1.呼び出し規約は標準で __stdcall 2.VC++ では、_ がシンボル名の頭に付く 3.Builder ではつかない これで食い違いが生じているんだと思うのですが、更に調べると、モジュール定義ファイルにて再定義をすれば良いとの結論になりました。 BorlandのFAQも見たのですが、書式が理解できなくて・・・そこで質問させて頂きたいのですが、単純にproject名.defを作って、 >IMPORTS >initialize_library=_initialize_library とやってプロジェクトに加えれば良いのでしょうか? ソース本体にextern "C" というのも必要なようですが、こちらの記述も教えて頂けたら嬉しいです。

  • 日本語(マルチバイト)でのwordwrap処理

    簡易メーラーのようなものを作っており、返信の際に改行と”>”が入る処理をしたいと思っています。 しかし、wordwrapを使って分割しようとすると、文字列の途中に半角文字が奇数個入っている場合、その後の文字が化けてしまいます。 mb_splitという関数がありますが、これはまだ実験段階ということなので、今の時点での利用は避けたいと思っています。他のマルチバイト関数を一通り見てみましたが、mb_split以外にwordwrapのような機能は無いように見えました。 どのようにすれば日本語で自動改行処理ができますでしょうか。ご教授下さい。宜しくお願いします。

    • ベストアンサー
    • PHP
  • 「か゚」などの文字は「日本語」ですか?いつから?

    鼻濁音の「か゚」。これは日本語でしょうか? もし日本語の場合、いつから使われているのでしょうか? 古文書等で見たことがありません。おそらく明治時代までには日本語として存在しなかった文字と思います。だとしたらいつからどのような状況・分野で使われ始めたのでしょうか? Shift_JIS-2004やUnicodeの勉強をする機会があり、『Shift_JIS-2004やUnicodeでは「か゚」などの文字が使えるようになった』としばしば出てきます。ひらがなの文字割り当ての領域に出てくるので、当然日本語として扱われているのだと思うのですが、少なくとも私は平成の終わり頃まで見たこともありませんでした。 ・「か゚」などの文字は「日本語」なのか? ・いつから使われている文字なのか? ・どのような状況・分野で使われているのでしょうか この点について教えてください。よろしくお願いします。 ※「鼻濁音とは何か」はわかっています。鼻濁音自体の説明は要りません。 また、質問の対象は音ではなく、文字・表記の存在についてです。

  • cprintf()関数で2バイト文字を表示するには

    cprintf()関数の引数に2バイト文字を含む文字列を指定してプログラムを 実行すると、表示結果の2バイト文字の部分が全て文字化けしてしまいます。 cprintf()関数で2バイト文字を表示することはできないのでしょうか? ご教示宜しくお願い致します。 下記は実際に文字化けしてしまうコードです。 ---------------------- #include <conio.h> int main(void) { cprintf("日本語 English"); return 0; } ---------------------- 【環境情報】 使用コンパイラ:VC++2008 実行環境:WinXPSP2とVistaHomePremiumSP1の2環境で確認 【質問の背景】 『独習C 第3版』という本の中に、一部のコンパイラでは、getche()の ような非標準の入出力関数とprintf()などの標準の入出力関数を併用 すると問題が発生すると記載されており、printf()関数の代わりに cprintf()関数を使用したサンプルコード(上記のコードとは異なる)も記載されています。 しかし、実際にそれをコンパイルして実行してみると、2バイト文字が 全て文字化けして表示されてしまいました。

  • JSPでincludeファイルの日本語が文字化けします。

    tomcat3.1を使用しています。 JSP本体でcharset=Shift_JISを設定し、SJISコードで記述した文字は正常に表示されますが、 <%@ include file="file.html" %>にて読み込んだfile.htmlに記述した日本語が文字化けします。 file.htmlが文字化けしないようにする方法を教えてください。

専門家に質問してみよう