• ベストアンサー

[VBScript]バイト長の判定

テキストのバイト長を取得したく「LenB関数」を使用したのですが、Unicodeの為、半角も全角も全て2バイトでカウントされてしまいます。 「StrConv関数」もVBScriptにはないため、どうしたものかと困っています。 一文字ずつコード値を出して、1バイトか2バイトに振り分けるという処理は、データの量からして現実的ではありません。 なにかよい方法がありましたらおしえてください。 よろしくお願いします。

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

  • ベストアンサー
  • G_Amino
  • ベストアンサー率76% (13/17)
回答No.1

参考URLのような関数を作成すれば、ご希望のバイト長を出すことができます。JavaScriptで書かれていますが、VBScriptからも呼び出すことができます。 <SCRIPT TYPE="text/JavaScript"> ~ </SCRIPT>で囲んで、メインのスクリプトより前に記述してください。

参考URL:
http://www.tohoho-web.com/js/string.htm#StrLength
casval
質問者

お礼

G_Aminoさん ありがとうございます。 「Script.js」に「jstrlen関数」を記述し、 呼び出し元のwsfに下記の記述で呼び出したところ、 <SCRIPT TYPE="text/javascript" SRC="./Script.js"></SCRIPT> javaScriptと認識されたためか、呼び出し元ソースでエラーとなってしまいました。 wsfでも使えますでしょうか?

casval
質問者

補足

<SCRIPT language="JScript" SRC="./Script.js"></SCRIPT> で呼び出してあげたらうまくいきました! ありがとうございました。

その他の回答 (1)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

厳密な意味で、半角・全角ではなくて、Ansi とUnicodeの日本文字の半角文字を半角として取り扱うということです。該当する半角だけ選りだして、その数を数えて、 LenB(全体)-Len(半角) としています。つまり、半角として認めたもののみが、半角として数えられる、ということで、実際は、もう少し時間を掛けたテストが必要かもしれません。 Function ByteChk(arg1) Set objRe = CreateObject("VBScript.RegExp") With objRe .Pattern = "([\u0021-\u007e]+|[\uff61-\uff9f]+)" .Global = True Set Matches = .Execute(arg1) For Each Match In Matches LenCnt = LenCnt + Len(Match.Value) Next End With ByteChk = LenB(arg1) - LenCnt Set Matches = Nothing Set objRe =Nothing End Function

casval
質問者

お礼

Wendy02さん ありがとうございます。お礼が遅くなって申し訳ありません。 確かに全ケース洗い出してテストする必要がありそうです。 G_Aminoさんに教えていただいたものもそうですが、 一文字ずつ処理していくと処理時間がかかってしまい、 結局BASP21に頼ることにしました。 数GByte単位のファイルを処理するので・・・

関連するQ&A

  • Vbscript Unicode文字の判定

    今、テキストファイルがあり、その中には「Unicode文字」が含まれています。 タックシール(ダイレクトメール用)に出力するのに、マンション名やビル名は改行しなければなりません。 1行に印字できる文字数は全角で20文字(40バイト)です。 したがって、「住所1」と「住所2(マンションやビル名)」の正確なバイト数を調べるのですが、今、「Unicode」のテキストファイルを作って、確かめたところ、半角文字は、そのまま「Asc()」で正の整数で返ってきます。 また、通常の2バイト文字(全角スペースから外字の最終文字)までは、負の整数で返ってきました。 しかし、「Unicode」文字は、常に「63」で返ってきます。 Character Code「63」は、半角の「?」です。 どうやら、「VBScript」は「Unicode」文字をすべて「?」として認識してしまうようです。 通常は、住所に「?」はないはずなのですが、最近、お客様のデータを見ていると、半角の「-」が、よく、半角の「?」に化けているので、「?」はちゃんと1バイトとして、Unicodeの文字は2バイトとして調べなければなりません。 VBAのように「Len()」と「LenB()」があれば、問題ないのですが、「VBScript」では、正しく動作しません(すべて「2」と返してきます)。 正確に文字数(バイト数)を調べるには、どうすればよいのでしょうか?

  • バイト数

    こんにちわ。 VB6でのすごく初歩的な質問なんですが、テキストボックスの中の文字のバイト数をLenB関数で取得して表示させようとしたのですが、半角も全角も1文字2バイトとでてしまいますがなぜでしょうか? お暇なときで結構ですのでどなたか回答をおねがいします。

  • 文字列の中に2バイトが含まれているか調べたい

    文字列の中に、2バイト(つまり全角)が含まれているかどうかを調べたいです。 VBなどでは、LenB(StrConv(Value, vbFromUnicode))とかで、調べられるのですが、Pealではどのような関数を用いれば良いでしょうか・ 最適な関数、あるいは手法があれば、教えてくださいませ。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • VB2008で全角半角の判定

    VB2008で全角半角の判定 VB6 では下記のようにして判定していましたが、VB2008では どのようにすればよいのかお教えください。  dim moji as string dim zhN as integer  zhN = LenB(StrConv(moji, vbFromUnicode)) mojiには1文字格納されており、  半角なら zhN = 1 全角なら zhN = 2 となる。  これをVB2008で実現する方法がわかりません。  よろしくお願いします。

  • Excelで22バイトの文字を数えたい

    Excel2002です。 VBAでセルの文字列を取得する時に全角制御文字(2バイト)を含めて22バイトの制限を考慮したいのですがその方法がわかりません。 全角文字だけなら10文字、  半角文字だけなら22文字の取得ができます。 その後の作業の都合上、22バイトを基準に条件判断したいのですが現在はその方法がわからないためLEN()で10を上限としています。LENB()でも同じ結果(文字数が返される)になります。 対象のセルには全角文字/半角文字が混在しており、全角-半角-全角-半角のような混在であれば制御文字を2回考慮する必要があります。 最悪その文字が全角か半角かの区別がつけば対応できると思います。 よい方法をご教授いただきたくお願いいたします。

  • ACCESS97 : レコードが長いファイルのインポートについて

    ACCESS97で、文字列を文字数ではなくバイト数で扱うことは可能でしょうか。 1レコードが20,000ByteあるテキストファイルをACCESS97のテーブルに インポートしようとしています。 インポート先のテーブルのフィールドをすべて「メモ型」にしたのですが、 インポート定義を利用してインポートを行おうとすると、 「レコードが大きすぎます。」というエラーが発生します。 そこで、プログラムでファイルを1レコードずつ読み込みながらテーブルに インサートしていく方法を取ろうかと思います。 テキストファイルは半角と全角が混在しているのですが、困ったことに 全角のデータが入るべきところに半角が混ざっている可能性があります。 たとえば、全角10文字入るべき場所に半角の空白が20文字入っていると いうような状態です。 この状態で StrConv関数でUnicodeに変換してからMidB$関数で文字を抜き 出すと、フィールドがずれてきます。 1文字目から10文字分、ではなく1Byte目から10Byte、などというように文 字列を扱うことができれば、全角と半角がどのような位置で混在していても 関係なくプログラム上で扱うことができると思うのですが,方法がわかりません。 また、これ以外で長いレコードのファイルをインポートできる方法があれば 教えていただきたいと思います。 長くなってしまいましたが、ご回答をいただけますようよろしくお願いいたします。

  • LENB 関数

    関数LENBを使用して、作成している条件が、 今まで全角20文字以内であれば、チェック項目○、20文字以上又は、 半角英数が入れば、チェック項目×になるよう関数作ってました。 → =IF(LEN($C$5)*2=LENB($C$5),IF(AND(LENB(C5)>=2,LENB(C5)<=40),"○","×"),"×") 今回 条件を変えたいんです。 全角でも半角英数がはいっても、40バイトであれば、チェック項目○、40バイト超過すれば チェック項目×にするには、 どうしたらいいですか? 教えていただける方、ご指導お願いします。。

  • セル内の文字で半角2文字で1文字とカウントしたい

    openofficeを利用しています。 セル内の全角と半角が混じった文章から半角2文字で1文字とカウント 全角はそのまま1文字とカウント して文字数を数えることはできますでしょうか? LENBが利用できないので困っています。 よろしくお願いします。

  • [VBScript][wsh]byte単位でのデータの切り出し

    以前LenBに関して質問した者です。 今回は 「ある文字列の○byte目から△byte分取得する」という処理で困っています。 MidB関数を使うと思うのですが、Unicodeの為、 BASP21の.KconvでSJISに変換してあげています。 HOGEasc = objBasp.Kconv(MidB(tmpLine, ○, △),1) ここで問題となるのが、切り出した文字列が化けてしまうのです。 以下のようにもう一度Unicodeに変換してあげてもダメです。 HOGEuni = objBasp.Kconv(HOGEasc,4) いろいろ試してみましたが、お手上げ状態です。 このような処理はできないのでしょうか? どうぞよろしくお願いいたします。

  • 文字のバイト数を数えるには

    なんか一日一問になってしまったのですが、、 よろしくお願いします。 wchar_t 型に入っている文字のバイト数を数えるにはどうしたら良いでしょうか? L"あいう123" のような文字の場合UNICODEの場合12バイトですが、 全角半角区別して9バイトを求めたいです。 UNICODE環境では不可能でしょうか?

専門家に質問してみよう