• ベストアンサー

半角カナの存在チェック

お疲れ様です。 MFCにおいてCStringで取ってきた文字列に半角カナが存在するかのチェックを行いたいのですが問題が出てきました。 (1)文字列が1ByteずつならgetATやMidでとってこれるのですが、漢字やひらがなだと1Byteしかとってとってこないので正確なチェックができない。  一文字ずつ取ってくるのにはどうしたらいいのでしょうか? (2)if((str.Mid(i,1)>='ア'&&str.Mid(i,1)<='ン')){ のような判別だと汎用性がなくなってしまう。 片方でもいいのでアドバイスのほうよろしくお願いします

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

失礼しました、ちょっと勘違い。 (2)は_ismbbkana()を使用してください。 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclib/html/_crt__ismbbkana.asp

wsy920
質問者

お礼

ありがとうございます。 _ismbbkana()は標準で用意されていたのですね。 参考にさせていただきます

その他の回答 (2)

回答No.3

(1)一旦ユニコード文字列に変換してやれば、一文字づつ取り出すことができます。ユニコードだとそもそも、1バイト文字というのが存在しないので。 ::setlocale(LC_ALL, "Japanese"); mbstowwcs(引数省略); で変換できます。 (2)汎用性のある文字列検索なら正規表現でしょう。 ・半角を判定する正規表現 [ -~。-゜]* ・全角判定する正規表現(半角表現を反転しただけ) [^ -~。-゜]* MFCは標準で正規表現サポートしてませんので正規表現ライブラリは以下のものを使えばいいでしょう。これも一旦ユニコードに変換する必要があります。 C++ BOOST http://www.boost.org/

参考URL:
http://www.boost.org/
wsy920
質問者

お礼

ありがとうございます。 uniコードでは一文字ずつとってこれるって利点があるのですね。今まではjavaを使っていたので自然にとってこれていたのでc++をはじめてとまどっていました。 いろいろと解決しました。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

片方でもって、(1)の方法しかないかと。 1バイトずつ判断し、それが2バイト文字の1バイト目だったら次を無視すればいいだけでしょう。

関連するQ&A

  • 半角カナならば(Excel)

    Excelで、A1にある文字列の中の各文字を次の条件で変換するためにB1に数式を設定する場合、 (1)半角カナは全角カナに変換 (2)半角カナでない文字はそのまま(何も変換しない) B1に設定する数式は以下のようなものが考えられると思われますが、 =LET(x,MID(A1,SEQUENCE(LEN(A1)),1), CONCAT(IF(・・・, JIS(x), x))) この・・・にくる「半角カナならば」の条件が思い浮かばないのですが、お分かりの方いらっしゃったら教えていただけますか。

  • 半角カナ文字の変換

    半角カナ文字(濁点あり)の全角カナ文字への変換がうまくいかなくて悩んでいます。 現在、 HashTable.put("ア","ア"); HashTable.put("ン","ン"); このような感じで変換テーブルを作成し、 String strVal = "半角カナ文字"; for(int i = 0; i < strVal.length(); i++){   char c = strVal.charAt(i); if(HashTable.containsKey(c)){ strTmp.append(HashTable.get(c)); } } このような処理をしているのですが、 半角カナ+濁点(例えば、ガ)の変換が、 「カ゛」となってしまいます。 これを「ガ」とするにはどうすればよいでしょうか?? 何か良い方法がありましたら教えてください。 お願いします。

  • CString型 全角半角を意識せずに「1文字」ずつ取り出す

    CString型の文字列に格納されている文字を1文字ずつ取り出したいです。 ただし半角なら1バイト単位で、全角なら2バイト単位で、という風に分離したいです。 半角だけなら、str[0] str[1]...という風に取り出せますが、 全角が混じっていると、1バイト目、2バイト目と分離されてしまいます。 その文字が半角か全角かを判断して、半角なら1バイト、全角なら2バイト同時に取り出すロジックを、下記のような感じの関数として作りたいです。 CString ripString(CString str,int index){ //ソースとなる文字列、n文字目 /*~処理~*/ return 文字列; } たとえば"あaいbうcえdおe"という文字列を入れると、 CString str="あaいbうcえdおe"; ripString(str,0) →結果 "あ" ripString(str,1) →結果 "a" ripString(str,2) →結果 "い" ripString(str,3) →結果 "b"  ・  ・  ・   こういうことをするのに良い方法はありますか? 1バイトごとのそれぞれの文字自身が、 ・半角文字なのか ・全角文字の前1バイトなのか ・全角文字の後1バイトなのか これをプログラム的に判別する方法があればいいのですが・・・悩んでいます。

  • 半角カナから全角カナへ

    お世話になります。 今、フォームから入力された半角カナを全角カナへ変換しようとしているのですが、どうしてもうまく行きません。 処理は以下のようにしています。 jcode::convert(\$str, 'euc'); if($str =~ /[\xA1-\xDF]/){ jcode::h2z_euc(\$str); } (1)まず、半角カナが含まれているかのチェックで[\xA1-\xDF]を使用していますが色々調べたところ、実際は (?:\x8E[\xA6-\xDF]) が正しいようなのですが、この場合文字数が少ないとひっかかってくれません。例えば半角のア1文字や2文字など。また、文字数が多くても半角英数と半角カナが混在しているとひっかからない場合もあります。 上記の式だとひっかかってくれますが、この判定で構わないのでしょうか。 (2)上記の式できちんと置換されるものとされないで漢字のように文字化けするものと出てきてしまいます。 例えば「インターフェース」などという半角は全滅です。 「バージョン」などは大丈夫でした。 間違いなど教えて頂ければと思います。 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • Ruby言語にて、全角カナ⇔半角カナ変換がうまくいかずで困っております

    Ruby言語にて、全角カナ⇔半角カナ変換がうまくいかずで困っております。 以下のようにプログラミングをしてます。 結果が、思った通りではないのですが、何が原因でしょうか。 ※★→←★部分で囲んだ部分は半角文字です(ブラウザ上、半角文字が全角に変換されているようなので、  適宜そのような表記を入れました。 ●半角→全角変換 sss = "★→アイウエオ←★".tr('★→ア-ン←★', 'ア-ン') p sss ⇒★→アウオキケ←★ ●全角→半角 sss = "アイウエオ".tr('ア-ン', '★→ア-ン←★') p sss ⇒ア★→イ←★イ★→ウ←★ウ どうか原因を教えてください。

    • ベストアンサー
    • Ruby
  • Jcode.pmでの半角カナ→全角カナ変換

    Webフォームから取得したデータに半角カナが含まれていた場合の文字化け対策として、Jcode.pmを使用して、下記のようにEUCに変換しています。 use Jcode; $euc_string = jcode($form_input)->h2z->euc; 原理的には間違ってはいない筈ですが、ほとんどの場合、$form_inputの文字コードの判別に失敗(恐らく半角カナをEUCと誤認)し、文字化けしてしまいます。誤認しないように、下記の様に記述すれば、正しく全角カナに変換してくれます。 use Jcode; $euc_string = jcode($form_input,"sjis")->h2z->euc; ただ、入力コードがシフトJISとは限りませんので、この記述は好ましくないと思っています。 半角カナの文字化けは、webフォームを作られた方なら皆さん経験されていると思うのですが、どうされているのでしょうか? Jcode.pmの文字コード判別は、半角カナが混じっていた場合、かなり長い文字列でないと判別に失敗するようなので、フォームで短い文字列(名前等)を入力させて処理させた場合、ほとんど上手く動かないようなのですが?

    • ベストアンサー
    • Perl
  • VBScriptである文字列に半角文字が含まれているかどうか調べる方法について

    VBScriptである文字列に半角文字が含まれているかどうか調べる方法について、ネットで調べてソースコードを拾ってきたのですが... IFの条件でなぜ全角、半角が判断できるか分かりません。教えてください。お願いします。 iLen = Len(str1) iLenByte = 0 '--- 文字列のバイト数 For i = 2 To iLen strField = Mid(str1, i, 1) iCode = Asc(strField) If iCode > 0 Then '--- 半角文字 Else '--- 全角文字 End If Next

  • インターネット上では半角カナは使うなと指摘されたのですが

    こことは違う所で、「半角カナはインターネット上では使用しない様にしましょう。 システムによっては文字化けの原因となる場合があります」と指摘されたのですが、全角カナにするにはどうすれば良いでしょうか? それと、半角のひらがなも文字化けするのでしょうか

  • Javaで、半角カナを2バイトとしてカウントしたい

    JavaでSJISで入力された文字列(全角、半角、英字、記号等混在)の桁数チェックで、 入力された半角カナのバイト数を、2バイトとみなしてカウントしたいと考えています。 例えば  全角の"テスト"の場合、バイト数は6  半角の"テスト"の場合も、バイト数は6 Javaで以下の様にコーディングしたところ、半角カナ部分はとりあえずうまく行ったのですが、 System.out.println 半角の"テスト".getBytes("EUC-JP").length; ->6 特殊な文字「まるの1、まるの2」等で試すと、特殊な文字のバイト数が1バイトとして カウントされてしまいます。 ※まるの1、まるの2は、この質問フォームで入力できないのでこの記載としています。 以降は(1),(2)と記載します。いずれも全角1文字の文字のことです。 System.out.println "(1)".getBytes("EUC-JP").length;   ->1      ※希望結果は2バイト System.out.println "(2)スト".getBytes("EUC-JP").length;   ->5      ※希望結果は6バイト 特殊な文字「(1)、(2)」や半角カナ(2バイトとしてカウント)を含めて、 簡単にバイト数をカウントすることはできないでしょうか。

  • エクセルで列の値を半角カナへ変換する方法を教えてください

    お尋ねします。 エクセル2003を使っています。 エクセルで、A1列に文字列で漢字やひらがななどで名称が入っています。その列の値を半角カナでA2列に表示させたいのですが、どのようにすればいいでしょうか? ご存知の方おられましたら、よろしくお願いします。 A1列   A2列(この列に半角カナで) 卵     タマゴ しょうが  ショウガ シャーペン シャーペン 星     ホシ ※この質問をアップするとA2列は、全角になっていますが、表示させたいのは、半角カナです。

専門家に質問してみよう