• ベストアンサー

全角文字のチェック

sankaku197の回答

回答No.3

if(str[i] != 0xffffff82)と書く事で、マッチする可能性があります。 理由は後述します。 そこまで原因が絞れていれば、printfを書けば確認出来ますよ。 for(i = 0; str[i] != '\n'; i++){ printf("%x\n",str[i]);   ←ここにprintfを挟む /* 奇数バイトをチェック */ if(str[i] != 0x82){ ちなみに私の環境だと、str[0]はffffff82と表示されました。 if(str[0] == 0x82)と試しみると、やっぱりマッチしません。 if(str[0] == 0xffffff82)でマッチしました。 ところで話は変わりますが。 Cで文字列を扱うのは、かなり現実的ではないと思います。 一度C#かjavaを経験されてみると、Cがどれだけ面倒くさくて分かりづらい事か分かると思います。 極力Cで記述したいのでしたら、私の場合は文字列の処理のみC++で組みますね。

参考URL:
http://programmer-toy-box.sblo.jp/article/16381630.html
ya-cha
質問者

お礼

ご回答ありがとうございます。 charをunsignedに変更して比較することで解決出来ました。 (よく理由はわかってないですが・・・orz) javaは経験あります。 C言語がとても面倒なのはすごく分かっておりますが、勉強なので・・・。 丁寧にソースを含めての説明本当にありがとうございました。 もし可能でしたら、 >理由は後述します。 の理由を教えていただけないでしょうか? しばらく質問は締め切らずに置いておくので・・・

関連するQ&A

  • 全角文字の判定

    現在C言語を勉強しております。 そこで、キーボードから入力された文字列のチェックを行う関数を作成したいのですが、実装方法が分かりません・・・。 以下に仕様と私の作成したソースを貼ります。 【許可する文字】は、 全角のひらがな 全角の英語(大文字も小文字もOK) 全角の数字 です。 チェックする関数を作成したいのですが、以下ではうまくいかず・・・ 教えてくださいorz 比較の仕方がおかしいでしょうか? 関数は、引数として渡された文字列に許可以外の文字が含まれている場合は1を、そうでなければ0を返す、という仕様にしたいです。 int checkName(char *str) { int i; for(i = 0; str[i] != '\n'; i++){ /* 奇数バイトをチェック */ if(str[i] == 0x82){ i++; /* ひらがなの場合 */ if(str[i] >= 0xa0 && str[i] <= 0xf1) printf("ひらがな\n"); return 0; /* 英語(大文字)の場合 */ if(str[i] >= 0x60 && str[i] <= 0x79) printf("英語大\n"); return 0; /* 英語(小文字)の場合 */ if(str[i] >= 0x81 && str[i] <= 0x9a) printf("英語小\n"); return 0; /* 数字の場合 */ if(str[i] >= 0x50 && str[i] <= 0x58) printf("数字\n"); return 0; } return 1; } return 0; } 以上、よろしくお願いいたします。

  • 文字列に半角・全角スペースが入っているかをチェックする関数のおかしな結

    文字列に半角・全角スペースが入っているかをチェックする関数のおかしな結果? 下記コードのように「文字列に半角・全角スペースが入っているかをチェックする関数」を作りました。 $textに入る文字列に半角・全角のスペースが入っているかをチェックします。 -------------------------------------------- my $text = "東 京"; if( isSpace($text) ) {   print "スペースあり"; } else {   print "スペースなし"; } sub isSpace{   my $str = shift || return(undef);   if( $str =~ /.*[\s ]+.*/ ){     return(1);   }else{     return(0);   } } -------------------------------------------- しかしなぜか1行目を my $text = "メ"; とするとスペースが入っているという結果になってしまいます。 なぜ「メ」が入ると半角もしくは全角のスペースとみなされてしまうのでしょうか? また、どうすれば正しくチェックできるようになりますか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • 全角文字を含んだ文字の並びを逆順にするには?

    こんにちは。 C言語において、以下のような2つの関数を利用して、全角文字を含んだ文字列の並びを逆順にする事を考えました。 ちなみにコンパイラは、borlandのC++コンパイラを使っています。 文字コードがShift_JISの場合、全角文字の上位バイトが0x81~0x9F、0xE0~0xFCの範囲に収まるという事を聞いたので、まず、以下のように、渡された文字が、全角文字の上位バイトかどうかを判定する関数を作りました。 ____________________________________________________________ int is_2byte(unsigned char c){ return ( ( (c >= 0x81) && (c <= 0x9f) ) || ( (c >= 0xe0) && (c <= 0xfc) ) ); } ____________________________________________________________ 次に、上の関数を利用し、以下のように、渡された文字列の、文字の並びを逆順にする関数を作りました。 ____________________________________________________________ void rev_str(char *str) { char temp[1000]; char tmp; int i, j; for(i=strlen(str)-1, j=0; i>=0; i--, j++){ temp[j]=str[i]; if(is_2byte(temp[j])){ tmp=temp[j-1]; temp[j-1]=temp[j]; temp[j]=tmp; } } temp[j]='\0'; strcpy(str, temp); } __________________________________________________ この関数を、あいうえお順に試して行った所、ひらがなの 「あいうえお かきくけこ さしすせそ たちつてと なにぬねの はひふへほ まみむめ」 という文字列は、逆順にする事ができたのできました。 しかし、「も」以降の文字を含ませた途端、実行時エラーが発生し、プログラムがストップしてしまいます。 また、カタカナの場合は、「メ」以降の文字を含ませた場合に、実行時エラーとなります。 何が問題なのかが全然分からないので、困っています。 何かいい方法を知っておられる方がいらっしゃれば、是非アドバイスを頂きたいと思います。 では、よろしくお願い致します。

  • テキストフィールドでの全角チェックについて

    テキストフィールド内にて、全角文字以外が入力されたらエラーをだすようにしています。そのとき以下のソースだと改行した時に、enterが半角とみなされてしまう現象が起こってしまいました。 function jstrlen(str) { len = 0; for (i = 0; i < str.length; i++) { wrk = escape(str.substr(i,1)); if ((wrk.substr(0,2) == "%u") && (wrk < "%uFF71")) { len++; } len++; } return len; } function isZen(str) { len1 = jstrlen(str.value); len2 = str.value.length * 2; if(len1 != len2){ alert("半角文字が混在"); str.focus() ; }else{ alert("全角文字のみ"); } } 対処方法をどなたかよろしくお願いします。

  • 正規表現を使った全角文字のチェック。

    現在入力項目が全角文字OR半角スペースかどうかチェックする、スクリプトをBASP21を使って下のようなコードを作っています。VBSで色々試しましたができません。 本番では、BASAP21が使えないので困っています。 処理としては、入力値が、シフトJISの全角に当たる文字コードかどうかチェックしています。 BASP21を使わない方法で可能でしょうか? また可能であれば方法を教えてください。 環境:WindowsXPSP2 VBScript IIS LOCALHOST上で実行しています。 例: str = " あいうえおア " Set bobj = CreateObject("basp21") output = bobj.Match("/^(?:[\x81-\xEF][\x40-\xFC]|\x20)+$/",str) IF output = 0 THEN Response.Write("全角で入力して下さい。") END IF

  • 全角漢字の入力チェック

    Javascriptにて、Formのテキストフィールドの内容を入力チェックしているのですが、「全角漢字」「全角かな」「全角カナ」「半角英数字」 のみを許可して、それ以外の入力文字をいれるとエラーになるような 関数を作りたいのですが、全角記号や半角記号をチェックするには どうしたらよいのでしょうか。

  • 全角スペースのチェックについて

    こんにちは。 全角スペースについてのご質問です。 ある入力項目に対して必須チェックを行っております。 下記のコードはServlet内で以下のチェックを行っております。 ---------------------------------------------------------------- String name = req.getParameter("name"); bean.setName(name); if(bean.name().trim().length() == 0 || bean.name() == null){ return NO_INPUT_ERR; } ---------------------------------------------------------------- このチェックでは半角スペース『 』であればエラーとして判断してくれますが、 全角スペース『 』ではエラーとして判断してくれません。 (全角スペースはtrim()を実行しても省いてくれないため) 全角スペース『   』の判断をする場合は、 新規にクラスを作成して文字数分繰り返しチェックを入れるような処理を 自分で作成しないとチェックは出来ないのでしょうか? ご存知の方がおりましたら、ご教授の程お願い致します。

    • ベストアンサー
    • Java
  • 文字列の扱い方

    初歩的な質問ですみません… str文字列からcという文字を見つけたら添字を返すという関数を作ったのですが、 iにこの関数を代入して、if文の制御式にiを使って比較するまでは正常なのですが、 真文にiを使うと何故か偽文(という言い方でいいのでしょうか…この場合("そんな値はありません。"というところです)が実行されてしまいます。 よろしければご教授お願い致します。 #include <stdio.h> int str_char(const char str[],int c) { int len = strlen(str); int i; for (i = 0;i < len;i++) { if (str[i] == c) return i; } return -1; } int main() { char str[64] = "Fucking Brutal Death Metal"; int ch,i; printf("どの文字を調べますか?"); scanf("%c",&ch); i = str_char(str,ch); if (i >= 0) printf("その文字は%d番目にあります。",str_char(str,ch) + 1); //何故かiだと動かない else printf("そんな値はありません。"); return 0; }

  • Perl UTF8 での全角カタカナチェック

    ■環境 Linux, Perl 5.8 です。 画面(HTML)と処理(Perl)は分けて作成しており、Templateモジュールで画面表示を行っています。 HTMLもPerlも文字コードはUTF-8です。 ■質問 フォームからうけとった文字列で全角カタカナと特定の全角記号以外はエラーとする 入力チェック処理(正規表現)がうまくチェックを行ってくれません。 SJISだと以下のような書き方があるそうなのですが、UTF8での書き方がわかりません。 ・SJIS if($data !~ /^(?:\x83[\x40-\x96])+$/){ $mes="全角カナ以外の文字が指定されています"; } UTF8での書き方を教えて頂きたいです。 なお、許容する全角カタカナと特定の全角記号は以下のとおりです。 ========================================================== アイウエオカキクケコサシスセソタチツテトナニヌネノ ハヒフヘホマミムメモヤユヨラリルレロワヰヱヲン ァィゥェォッャュョヵヶヴガギグゲゴザジズゼゾダヂヅデド バビブベボパピプペポーヽヾ ========================================================== ご教授お願い致します。

  • 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バイトなのか これをプログラム的に判別する方法があればいいのですが・・・悩んでいます。