プロが教える店舗&オフィスのセキュリティ対策術

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

下記コードのように「文字列に半角・全角スペースが入っているかをチェックする関数」を作りました。
$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 = "メ";

とするとスペースが入っているという結果になってしまいます。
なぜ「メ」が入ると半角もしくは全角のスペースとみなされてしまうのでしょうか?
また、どうすれば正しくチェックできるようになりますか?

よろしくお願いします。

A 回答 (4件)

こんにちは、



コードを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);
  }
}

正規表現中に全角スペースを書かれていますが、こういった場合(というよりもマルチバイトな文字列を扱う際)には注意が必要ですね。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/08/07 16:40

「入出力には shift_jis (ないし CP932) を使う」という必然性があるとしても, それは「スクリプト内で shift_jis (ないし CP932) を使う」必然性にはならんよね.


もっとも, スクリプト内で「文字」単位で処理するようにさえすれば shift_jis だろうと utf8 だろうと euc-japan だろうと問題ない.
    • good
    • 0

> if( $str =~ /.*[\s ]+.*/ ){



通常は全角文字を文字クラスに入れると、上位バイトと下位バイトに分けられて2つのバイト文字を入れたことになってしまいます。文字クラスを使わずに選択を使ったらどうでしょうか。

if ($str =~ /\s| /) {
    • good
    • 0

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

    • good
    • 0
この回答へのお礼

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

お礼日時:2010/08/15 11:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!