
文字列に半角・全角スペースが入っているかをチェックする関数のおかしな結果?
下記コードのように「文字列に半角・全角スペースが入っているかをチェックする関数」を作りました。
$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 = "メ";
とするとスペースが入っているという結果になってしまいます。
なぜ「メ」が入ると半角もしくは全角のスペースとみなされてしまうのでしょうか?
また、どうすれば正しくチェックできるようになりますか?
よろしくお願いします。
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);
}
}
正規表現中に全角スペースを書かれていますが、こういった場合(というよりもマルチバイトな文字列を扱う際)には注意が必要ですね。
ありがとうございます!
そうです、Shift-JISで書いています。
なかなか、文字コードとかって鬼門ですね・・・。
全角スペースは\x81\x40なのですね。ググってみたらいろいろ書かれていました。
どうも助かりました。感謝します!
No.4
- 回答日時:
「入出力には shift_jis (ないし CP932) を使う」という必然性があるとしても, それは「スクリプト内で shift_jis (ないし CP932) を使う」必然性にはならんよね.
もっとも, スクリプト内で「文字」単位で処理するようにさえすれば shift_jis だろうと utf8 だろうと euc-japan だろうと問題ない.
No.3
- 回答日時:
> if( $str =~ /.*[\s ]+.*/ ){
通常は全角文字を文字クラスに入れると、上位バイトと下位バイトに分けられて2つのバイト文字を入れたことになってしまいます。文字クラスを使わずに選択を使ったらどうでしょうか。
if ($str =~ /\s| /) {
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- Access(アクセス) Accessのテキストボックスの入力文字制限 1 2023/01/18 20:43
- Excel(エクセル) 【マクロ】フォルダを2つのモニターの定位置に並べたい 2 2022/09/02 01:14
- Excel(エクセル) エクセルの数式で教えてください。 1 2023/02/02 10:20
- Visual Basic(VBA) 指定列最終行までのスペースを改行するVBAについて 2 2022/06/01 19:50
- Excel(エクセル) capeofdragonと申します Excel2016を使っておりまして 半角又は全角の任意文字列が 2 2022/10/31 13:51
- Excel(エクセル) 【マクロ】フォルダを3つ、POモニター上に、決まった並べ方をしたい 4 2022/08/31 11:05
- Excel(エクセル) 【マクロ】フォルダAからダBへファイルを、ファイルの更新日時の条件で、1つづつ移動するには? 3 2022/08/25 09:56
- その他(Microsoft Office) 英数字のみ全角から半角に変換 4 2023/07/28 14:48
- Visual Basic(VBA) VBA 重複チェック後に値をワークシートに転記する方法を教えてください。 1 2023/03/19 12:43
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
住宅にカナを入力する際に丁目...
-
全角英数字の必要性が理解できない
-
VBA 文字に半角が含まれて...
-
VB.net、テキストボックス入力...
-
プログラミングでは、半角括弧...
-
「一角」って何でしょうか
-
ACCESS VBA でのバイナリデー...
-
COBOL・全角判定
-
メモ帳の段落の揃え方
-
IEからEdgeへの移行に伴うIMEの...
-
全角/半角キーをSendkeys関数で...
-
文字列に半角・全角スペースが...
-
C言語のコンパイルエラーなん...
-
エクセル:セル「D列」に「○○○...
-
英数字のみ全角から半角に変換
-
.NET3.5におけるキーボードの「...
-
バッチファイルでデスクトップ...
-
いまスマホからカードの申込み...
-
COBOLでの全角文字の判定をした...
-
perl 初めてのプログラムにエラ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
住宅にカナを入力する際に丁目...
-
英数字のみ全角から半角に変換
-
VBA 文字に半角が含まれて...
-
IEからEdgeへの移行に伴うIMEの...
-
全角英数字の必要性が理解できない
-
COBOL・全角判定
-
word差し込み印刷 半角カタカ...
-
エクセルにMicrosoft Barcode C...
-
プログラミングでは、半角括弧...
-
メモ帳の段落の揃え方
-
エクセルの検索が正しくできな...
-
エクセルでの”々”の扱い
-
char型全角数字から、int型半角...
-
CString Format にて全角空白文...
-
.NET3.5におけるキーボードの「...
-
半角/全角文字混在データの分...
-
Accessで日付や数値を全角で表...
-
[Excel VBA] ODBCによる外部デ...
-
VB.net、テキストボックス入力...
-
改行のないテキストを指定バイ...
おすすめ情報