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

このQ&Aのポイント
  • 「文字列に半角・全角スペースが入っているかをチェックする関数」の結果がおかしいです
  • 特定の文字列を入力すると、半角・全角スペースとして判定されてしまいます
  • 正しい結果を得るためにはどのようにすればいいでしょうか
回答を見る
  • ベストアンサー

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

文字列に半角・全角スペースが入っているかをチェックする関数のおかしな結果? 下記コードのように「文字列に半角・全角スペースが入っているかをチェックする関数」を作りました。 $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 = "メ"; とするとスペースが入っているという結果になってしまいます。 なぜ「メ」が入ると半角もしくは全角のスペースとみなされてしまうのでしょうか? また、どうすれば正しくチェックできるようになりますか? よろしくお願いします。

  • suffre
  • お礼率76% (2013/2633)
  • Perl
  • 回答数4
  • ありがとう数7

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

  • ベストアンサー
  • g_p_
  • ベストアンサー率53% (28/52)
回答No.1

こんにちは、 コードをShift-JISで書かれているのではないですか? もしそうなら、下の様なコードを書かれているのと同じことになるのではないでしょうか。 #my $text = "メ"; my $text = "\x83\x81"; if( isSpace($text) ) {   print "スペースあり"; } else {   print "スペースなし"; } sub isSpace{   my $str = shift || return(undef);   #if( $str =~ /.*[\s ]+.*/ ){   if( $str =~ /.*[\s\x81\x40]+.*/ ){     return(1);   }else{     return(0);   } } 正規表現中に全角スペースを書かれていますが、こういった場合(というよりもマルチバイトな文字列を扱う際)には注意が必要ですね。

suffre
質問者

お礼

ありがとうございます! そうです、Shift-JISで書いています。 なかなか、文字コードとかって鬼門ですね・・・。 全角スペースは\x81\x40なのですね。ググってみたらいろいろ書かれていました。 どうも助かりました。感謝します!

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

「入出力には shift_jis (ないし CP932) を使う」という必然性があるとしても, それは「スクリプト内で shift_jis (ないし CP932) を使う」必然性にはならんよね. もっとも, スクリプト内で「文字」単位で処理するようにさえすれば shift_jis だろうと utf8 だろうと euc-japan だろうと問題ない.

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.3

> if( $str =~ /.*[\s ]+.*/ ){ 通常は全角文字を文字クラスに入れると、上位バイトと下位バイトに分けられて2つのバイト文字を入れたことになってしまいます。文字クラスを使わずに選択を使ったらどうでしょうか。 if ($str =~ /\s| /) {

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「スクリプトで使う (マルチバイト文字の) コード」を指定すればいいんだけどね.

suffre
質問者

お礼

ネットでみそもそも日本語使う時点でSJISは鬼門のようですね。 しかし携帯用サイトなのでSJISを使いたいのです。

関連するQ&A

  • 文字列から半角スペースと全角スペースを取り除く処理

    DBから取得した文字列に半角スペースか全角スペースが 含まれている場合取り除きたい、と考えています。 以下の様なロジックを考えているのですが、 こんな感じで良いのでしょうか。 普通は、どの様にするのでしょうか? アドバイスなどありましたら、お願い致します。m(__)m private String test(String str) {  StringBuffer sb = new StringBuffer();  char[] chr = str.toCharArray();  for(int p=0;p<chr.length;p++) {   if( chr[p] == ' ' || chr[p] == ' ' ) continue;   sb.append(chr[p]);  }  return sb.toString(); }

    • ベストアンサー
    • Java
  • 全角文字のチェック

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

  • 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

  • splitを使ってスペース位置で文字列を区切りたい

    splitを使ってスペース位置で文字列を区切りたいのですが、 String[] word = str.split(" ",0);  //半角空白 のように書くと、全角スペースは区切りとしてみなされず、 String[] word = str.split(" ",0);  //全角空白 のように書くと、半角スペースは区切りとしてみなしてくれません。 全角スペースでも半角スペースでも、スペース位置で文字列を区切りたいのですが、どのように書けばよいのでしょうか?

    • ベストアンサー
    • Java
  • 全角文字と半角文字を判別して文字列を追加

    全角文字と半角文字が混合している文字列に文字を追加するプログラムを考えています。 仕様としては全角から半角に変わる際には全角文字の後ろに1234を、 半角から全角に変わるときは半角文字の後ろに4321をつけるというものです。 例1 文字列が「あxxxお」ならば出力結果は「あ1234xxx4321お」 そこで質問なのですが 文字列から全角文字と半角文字をプログラム上で判別して 上記のように出力するにはどうしたらいいんでしょうか? ヒント等ございましたらどうぞお願いします。 とりあえず作ってみた例1の結果を無理やり出力するプログラムのコードを載せておきます。 こちらをうまく改変してくださっても結構ですのでよろしくお願いいたします。 #include <stdio.h> #include <string.h> int main(void){ unsigned char str0[256] = "あxxxお", str1[256] = "1234",str2[256]= "4321"; unsigned int zh,hz, len0 = strlen(str0),len1=strlen(str1),len2=strlen(str2); printf("挿入前:%s\n",&str0); zh=2; //全角から半角に変わる位置 hz=5; //半角から全角に変わる位置 //1234を挿入/// memmove(&str0[zh+len1], &str0[zh], len0 - zh+1); memcpy(&str0[zh], str1, len1); //4321を挿入/// memmove(&str0[hz+len1+len2], &str0[hz+len1], len0); memcpy(&str0[hz+len1], str2, len2); printf("挿入後:%s\n",&str0); return 0; }

  • 半角スペースを全角スペースに

    文字列で、半角スペースを全角に置き換える方法がわかりません。。。 正規表現が苦手で、MySQLに登録する画面を作りましたが、半角スペースがあると、それ以降が無視されてしまうため、その半角スペースを全角スペースに置き換えたいのですが、書式がわかりません。 すいませんが、ご教授お願いします。 あと、もし全角スペースに置き換える方法以外で何かいい策などもしありましたら、それもよろしくお願いします。

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

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

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

    • ベストアンサー
    • Java
  • 半角カタカナの入力チェックを作りたいです

    入力フォームで入力された文字に対して半角カタカナかチェックをしたいです。 function CheckHalfSizeKatakana($str) {  if (mb_ereg("^[ア-ン゛゜]+$",$str)) {    return true;  } else {    return false;  } } としたのですがうまくいきません。 PHP4です。

    • ベストアンサー
    • PHP
  • 文字列に半角スペースがあるかのチェック

    文字列に半角スペースがあるかのチェックを正規表現を使って行いたいのですが、どのように書けばよろしいでしょうか? 開発環境はeclipse、開発言語はjavaを使っています。

    • ベストアンサー
    • Java