• 締切済み

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

みんなの回答

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

半角文字が含まれているかどうかだけだったら、 If LenB(str) = 2*Len(str) Then '半角文字は含まれていない Else '半角文字が含まれている End If で判断できます。

eekaeenonka
質問者

お礼

早速のご回答ありがとうございました。 ご参考にさせて頂きます。

  • gatyan
  • ベストアンサー率41% (160/385)
回答No.1

ASC関数が返す文字コードはSJIS(VbScriptのマニュアルより) 日本語(全角)は、SJISだと第1バイトが必ず80H(16進…128)より大きいので、符号付16Bit整数(全角1文字=2バイト=16Bit)としてみると必ず負になる 逆に半角(特にアルファベット,数字など)は80Hより小さいので、符号付8Bit整数としてみても符号付16Bit整数に変換(拡張)してみても正になる だから、正負で半角・全角が判断できる 注)説明のため、80H以上が全てSJISのような書き方になっていますが、SJISとして使用される(定義される)文字コードの範囲はもっと限定されます。

eekaeenonka
質問者

お礼

早速のご回答ありがとうございました。 ご参考にさせて頂きます。

関連するQ&A

  • VBA 文字に半角が含まれているか確認する方法

    VBAで文字に半角が含まれているか調べる方法を教えて頂けないでしょうか?全角が含まれているかのチェックはできたのですが。。。 下記は全角が含まれているかのチェックです。 If Asc(Mid(文字列, i, 1)) < 0 Or Asc(Mid(文字列, i, 1)) > 256 Then   処理 End If

  • 半長音(ー)及び半角文字を1バイトと取得する方法

    VBScriptのLenB関数では、半角文字も2バイトと算出してしまうと聞きました。 半角文字、(現在すぐに対応したいのは半長音(ー))を1バイトと計算する方法がありましたら教えて下さい。 現在はWebを参考に下記の関数を使用したいと思っていますが、半長音(ー)は2バイトになってしまいます。 Function lngCnLen(strVal) Dim i, strChr lngCnLen = 0 If Trim(strVal) <> "" Then For i = 1 To Len(strVal) strChr = Mid(strVal, i, 1) '2バイト文字は+2 If (Asc(strChr) And &HFF00) <> 0 Then If Asc(strChr)=127 Then lngCnLen = lngCnLen + 1 End If Else lngCnLen = lngCnLen + 1 End If Next End If End Function

  • VBScriptで半角カナと半角英数字を判断する方法

    VBScriptを使用して文字列が半角カナ文字か半角英数字か を調べたいのですが方法がわかりません。 調べたところ 半角文字かどうかは If 0<=ASC(s) And Asc(s) <=255 Then 処理 Else 処理 End If で調べられるようなのですが、半角カナなのか半角英数文字 なのかを知るためにはどうしたらよいのでしょうか? ANSI文字コードがわかれば半角カナと英数字とで 細かく条件を分けれそうなのですが、ANSIコードが 載っているサイトを探してもなかなかみつかりません。 どなたかよい方法をご存知でしたら教えてください。

  • 全角文字と半角文字を判別して文字列を追加

    全角文字と半角文字が混合している文字列に文字を追加するプログラムを考えています。 仕様としては全角から半角に変わる際には全角文字の後ろに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; }

  • VBAでの全角数字と半角数字の判断について

    はじめまして、こんにちは。VBAのプログラムについて教えて欲しいのですが、「ぐう1」のように文字列の一番後ろの数字を削除するプログラムを作成したいです。asc関数を利用して str="ぐう1234" StrLenNum = Len(str) If Asc(Right(str, 1)) >= 48 And Asc(Right(str, 1)) <= 57 Then str = Left(str, StrLenNum - 1) としたのですが、これでは 「ぐう1」という全角数字に対応することができませんでした。 全角文字に対応するにはどうすればよいでしょうか? よろしくお願いします。

  • 特定の文字列が含むときに、専用の処理をさせたい

    最後に「_asc」「_desc」をつけた文字列がいくつかあります。 それを$_GET['aaa']で送り、そこから ・「_asc」「_desc」を削除した文字列だけにし ・「_asc」ならascという文字列を$mmmに「_desc」ならdescを$mmmに ということをしたいです。 $str = "id"; $mmm = 'asc'; if(isset($_GET['aaa'])){ $str = $_GET['aaa']; if(preg_match("/_asc$/i", $str)){ $str = rtrim ($str, "_asc"); }else if(preg_match("/_desc$/i", $str)){ $str = rtrim ($str, "_desc"); $mmm = 'desc'; } } このようにしてみたのですが、上手にできませんでした。 もっといい方法はないでしょうか。

    • ベストアンサー
    • PHP
  • エクセルのマクロで改行挿入(Excel2002)

    セルの文字列に全角10文字(半角20文字)ごとに Chr(10) で改行を入れたいです。 全角10文字を越えてはダメ。 選択したセルに動作する物です。 - - - - - Sub 半角20改行_Click() Dim Tmp As Range, Cha As Long, Num As Long Dim STR As String, MdTmp As Variant, flg As Boolean For Each Tmp In Selection  For Cha = 1 To Len(Tmp.Value)   MdTmp = Mid(Tmp.Value, Cha, 1)   If MdTmp = vbLf Then    If flg = False Then STR = STR & MdTmp    Num = 0    GoTo NextRow   End If   If LenB(StrConv(MdTmp, 128)) = 1 Then    Num = Num + 1   Else    Num = Num + 2   End If   ' この↓(20)で改行文字数変更   If Num >= 20 - 1 Then    STR = STR & MdTmp & vbLf    flg = True    Num = 0   Else    STR = STR & MdTmp    flg = False   End If NextRow:  Next  Tmp.Value = STR  STR = ""  Num = 0 Next For Each Tmp In Selection  If Right(Tmp, 1) = Chr(10) Then   Tmp.Value = LeftB(Tmp, LenB(Tmp) - 2)  End If Next End Sub - - - - - - これだと あいうえおかきくけこさしすせそ ↓↓ あいうえおかきくけこ ←全角10改行 さしすせそ <成功!> あいうえお(かきくけこさし)すせそ ↓↓ あいうえお(かきくけ ←全角9.5改行 こさし)すせそ <成功!> あいうえお(かきくけ)こさしすせそ ↓↓ あいうえお(かきくけ ←全角9.5改行 )こさしすせそ <失敗!!> こうなってほしい↓。 あいうえお(かきくけ) ←全角10改行 こさしすせそ 改行の狭間に全角文字が来た場合は全角9.5文字ごとに改行。 それ以外は全角10文字ごとに改行。 このようにする物を教えてください。

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

    文字列に半角・全角スペースが入っているかをチェックする関数のおかしな結果? 下記コードのように「文字列に半角・全角スペースが入っているかをチェックする関数」を作りました。 $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
  • 文字列に特定の文字の有無を調べたい。

    ある文字列に特定の文字が入っているか否かを調べたいのです。 AccessでVBAを使用して有無を調べたいんです。 具体的には下記の通りです。 カナ氏名が入力されているフィールドを検索して文字列を抽出したいんです。 "抽出"をカナにすると"チュウシュツ"ですよね。 所が私が使用しているテーブルのカナ氏名が入力されているフィールドには "抽出"は"チユウシユツ"と入力されているんです。 "チュウシュツ"と入力しても"抽出"は表示されず、"チユウシユツ"と入力しなければ "抽出"は表示されません。 従って"チュウシュツ"とキーボード入力してから先頭から2文字目と5文字目の "ュ"を"ユ"に再度変換しなければならないんです。 何か簡単な関数やプロシージャがないでしょうか? 何分初心者なんで下記の様な凄く長いプロシージャしか思い浮かびません。 宜しくお願いいたします。 (例) Public Function Kana_change() Dim kana As String '左から2桁目が小文字の時の変換 If Mid(kana, 2, 1) = "ァ" Then kana = Right(kana, 1) & "ア" & Mid(kana, 3, 13) Else kana = kana End If If Mid(kana, 2, 1) = "ィ" Then kana = Right(kana, 1) & "イ" & Mid(kana, 3, 13) Else kana = kana End If If Mid(kana, 2, 1) = "ゥ" Then kana = Right(kana, 1) & "ウ" & Mid(kana, 3, 13) Else kana = kana End If If Mid(kana, 2, 1) = "ェ" Then kana = Right(kana, 1) & "エ" & Mid(kana, 3, 13) Else kana = kana End If If Mid(kana, 2, 1) = "ォ" Then kana = Right(kana, 1) & "オ" & Mid(kana, 3, 13) Else kana = kana End If If Mid(kana, 2, 1) = "ャ" Then kana = Right(kana, 1) & "ヤ" & Mid(kana, 3, 13) Else kana = kana End If If Mid(kana, 2, 1) = "ュ" Then kana = Right(kana, 1) & "ユ" & Mid(kana, 3, 13) Else kana = kana End If If Mid(kana, 2, 1) = "ョ" Then kana = Right(kana, 1) & "ヨ" & Mid(kana, 3, 13) Else kana = kana End If If Mid(kana, 2, 1) = "ッ" Then kana = Right(kana, 1) & "ツ" & Mid(kana, 3, 13) Else kana = kana End If End Sub End Function

  • 括弧が含まれる文字列の括弧の中身の文字列(VB6)

    括弧()の中身の文字列をそれぞれ配列の文字列変数に設定したいと考えているのですが、Replaceを使えばいいのでしょうか? また、Replaceは置き換える文字の検索の開始場所は設定できると思うのですが、置き換える文字の検索の終了の場所は設定できるのでしょうか? 例えば、(asdf)as(asdfe)as(sf)という文字列のasdf,asdfe,sfをそれぞれ配列を使って文字列変数として表したいのです。 nyuuryoku = Text1.Text For i = 1 To Len(nyuuryoku) If Mid(nyuuryoku, i, 1) = "(" Then k = k + "と" + CStr(i) j = j + 1 ElseIf Mid(nyuuryoku, i, 1) = ")" Then m = m + "と" + CStr(i) l = l + 1 End If Next i Text17.Text = "( は" + CStr(j) + "個" + k + "番目、 " + ") は" + CStr(l) + "個" + m + "番目" For i = 1 To Len(nyuuryoku) If Mid(nyuuryoku, i, 1) = "[" Then kk = kk + "と" + CStr(i) jj = jj + 1 ElseIf Mid(nyuuryoku, i, 1) = "]" Then mm = mm + "と" + CStr(i) ll = ll + 1 End If Next i Text2.Text = "[ は" + CStr(jj) + "個" + kk + "番目、" + "] は" + CStr(ll) + "個" + mm + "番目" Dim kakkohajime(50) As Long Dim kakkoowari(50) As Long Dim kakkonakami(50) As String For i = 1 To CStr(j) kakkohajime(0) = 1 kakkohajime(i) = InStr(kakkohajime(i - 1), nyuuryoku, "(") Next For i = 1 To CStr(j) kakkoowari(0) = 1 kakkoowari(i) = InStr(kakkohajime(CStr(j) + 1 - i), nyuuryoku, ")") Next このあとにkakkohajime(i)の場所からkakkoowari(i)の場所までの文字列をそれぞれkakkonakami(i)の配列の文字列にいれたいのです。 最後に、kakkonakami(i)をtextに表示したいと思っています。