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

このQ&Aのポイント
  • [VBScript][wsh]byte単位でのデータの切り出しについて困っています。MidB関数を使って文字列の一部を取得しようとしていますが、Unicodeのため表示が化けてしまいます。
  • どうすれば文字列の一部を正しく取得できるでしょうか?
  • 質問内容を理解いたしました。詳細を確認し、解決策を提供いたします。
回答を見る
  • ベストアンサー

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

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

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

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

>以前LenBに関して質問した者です。 前回の質問については、Openのままでは、回答した私としては、けじめがつきませんから、マナーとして、閉めてくださいませんか? >tmpLine:"123456789あいうえお" > >開始位置:2 、指定バイト長:5 > "23456" >開始位置:10、指定バイト長:4 > "あい" これは、wsf ではありませんが、このようにすればできるのでは? つまり、byte で数えて、byte 長に満たしたら、その文字の場所を出すという方法です。後は、wsf に合うように、換えてください。それから、あまり、長い文字列は、かなり遅くなりますね。 'bytecount: tmpline = "123456789あいうえお" kaishi = 2 wnum = 5 msg ="開始位置:" & kaishi & " 、指定バイト長:" & wnum Set objBasp = Wscript.CreateObject("Basp21") k = 1 For i = 1 To Len(tmpline) ReDim Preserve bufarray(k) moji =Mid(tmpline,i,1) bufarray(k) = LenB(objBasp.Kconv(moji, 1, 5)) k = k + 1 Next For j = 1 To UBound(bufarray) cnt1 = cnt1 + bufarray(j) If cnt1 > kaishi Then Exit For End If Next For m = j To UBound(bufarray) cnt2 = cnt2 + bufarray(m) If cnt2 > wnum Then Exit For End If Next Msgbox msg MsgBox Mid(tmpline, j, m - j)

casval
質問者

お礼

Wendy02さん ありがとうございます。 やりたいことができました。 ただ、やはり処理時間がかかってしまい、 VBScriptの限界なのかなと思い始めています。 まだ、考え中なので、このままオープンとさせていただきます。 不躾にもかかわらず、丁寧に教えてくださりありがとうございました。

その他の回答 (2)

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

>VBScriptの限界なのかなと思い始めています。 はい、少なくとも私はそう思っています。wsf に使うのは、別に、VBScript だけでもありません。大量なら、Perlという手もあります。 ただ、「開始位置:2 、指定バイト長:5」というような考え方自体に無理があるのかもしれません。

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

バイトで(決め撃ちで)切り出してるんだから、化けてもしょうがないですよね。 何がしたいのかよくわかりません。

casval
質問者

補足

すみません。補足します。 ================================ tmpLine:"123456789あいうえお" 開始位置:2 、指定バイト長:5 > "23456" 開始位置:10、指定バイト長:4 > "あい" ================================ このような結果を返したいのです。

関連するQ&A

  • [VBScript]バイト長の判定

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

  • byte型をstring型として扱うには

    今日の質問/マイページに反映されないので、再度の質問です。 windows2000-sp4/vb6-sp5環境です。ユニコードのデータをvbで直接入出力し、vb内でstring型で扱いたいとおもっています。今のところ、vbの入出力では、自動的にsjis/unicode変換がされるので、binaryで受け取り、string型にするのかなと思っています。byte型で受け取り、APIの"MoveMemory"("RtlMoveMemory")でstring型にcopyするのかなとは思っているのですが、うまくいきません。経験不足そのものです。vbでのbyte型とstring型双方向のbinaryな変換の方法をお教えください。

  • BASP21のKconvについて

    BASP21のKconv関数をVCにて利用しておりますが、 SJISからEUCの変換はできるのですが、 EUCからSJISができずに困っております。 以下にサンプルコードを示します。 =============================================== _bstr_t strEUC, strSJIS; char str[1024]; IBasp21Ptr pIBasp21(__uuidof(Basp21)); strSJIS = "不明"; strEUC = pIBasp21->Kconv(strSJIS, 2, 1); strSJIS = pIBasp21->Kconv(strEUC, 1, 2); sprintf(str, "%s\0", strEUC.copy()); MessageBox(NULL, str, "EUC", NULL); sprintf(str, "%s\0", strSJIS.copy()); MessageBox(NULL, str, "SJIS", NULL); =============================================== メッセージは「ノヤフタ」、「??」となり、 「??」部分が「不明」になるものと思っておりますが、 値の渡し方などが違うのでしょうか? どなたかご教授ねがいます。

  • BYTEの配列の扱いについて

    すみません、BYTEを初めて利用している者なのですが、 文字列の描画で BYTE* ptr = new BYTE[20480]; と宣言した中に、 GetGlyphOutline() で取得した文字の画像を、1文字ずつ &ptr[0]  &ptr[2000]  &ptr[4000]  &ptr[6000] ・・・ と2000毎に文字を入れ、書き出す時もそうしているのですが、 1文字目はキレイに描画できるのですが、2文字目以降が崩れてしまいます。 変なループが起きたり、文字毎に下に隙間が等倍で増えていく感じです。 これはBYTEの使い方を誤っていて、無理な使い方をしているのでしょうか? また、以前の質問でバイトも配列?が使えると聞いたのですが、 BYTE* ptr = new BYTE[1048 * 10]; これは BYTE* ptr = new BYTE[10480];  これと全く同じ物という意味なのでしょうか?

  • 文字列のバイト数を取得したい

    処理中に渡ってくる文字列のバイト数を取得したいのですが、 そういった関数はありませんでしょうか? 探しても見つかりませんでした。 文字列はUTF-8かSJISで渡ってきますので、両方に 対応していると嬉しいです。 対応していなければ渡ってくる前に文字コードを 変換します。 どなたかご教示下さい。

    • ベストアンサー
    • PHP
  • JAVAでSJISのコード変換

    JAVAで、UnicodeからSJISへのコード変換を行った上で ファイル出力を行いたいです。 たとえば文字列中にある「(1)」の文字コードが以下である時 ------------------------------- SJIS:8744 - UNICODE:2464 ------------------------------- 2464のコードを8744に変換した上でファイル出力したいです。 処理として、以下の様な形を考えているのですが 文字化けしてしまします。 ------------------------------- String source = "(1)あああああ"; 文字列の数分ループ処理↓ int code = (int) (source[x].charAt(i)); if (code == 2464) { strBuff.append(String.valueOf((char) (8744))); } ------------------------------- Unicodeで扱われているので「getByte("SJIS")」などとしているのですが 同様の結果となります。 何か良い手はないものでしょうか?

    • ベストアンサー
    • Java
  • 日本語文字列の指定長(byte)切出し

    以下は日本語文字列(EUC)の指定長(byte)切出し関数なのですが、 これをShift-JIS版にするにはどうすれば良いのでしょうか? ================================================================ sub jcut { # 日本語文字列(EUC)の指定長(byte)切出し local($string, $length) = @_; if (substr($string,$length-1,1) =~ /[\x80-\xff]/) { $length++; } return substr($string, 0, $length); } ================================================================ 宜しくお願い致します。

  • plpgsqlでのbyte数指定での文字切り出し

    postgresql(plpgsql)にて、byte数指定での文字列切り出しを行いたいのですが、よい手法などありませんか? substr(substring)だと、文字数の指定となり、対象がマルチバイト、シングルバイト文字混在だと意図した値が取得できません。 ※Oracleのsubstrbに相当するものです。 ※select substr(カラム, 1, 20) from ...的な取得がしたいです。 よろしくお願いします。

  • int型の内容をbyteの配列にコピー

    int型の内容をbyteの配列にコピーする方法を教えて下さい。 int i_value = 500; byte[] by_value; by_value = new byte[4]; // どのような処理が必要ですか? by_value[0]には、0x1 by_value[1]には、0xf4 と格納したいです。 数字→文字列→文字(byte)できたのですが…。 C言語の場合、memcpy関数で型が異なってもキャストすれば回避できました。 JAVAでの方法を教えて下さい。

    • ベストアンサー
    • Java
  • テキストBOXから取得した文字コードの扱いについて

    JSPで記述したページのテキストBOXに入力されたSJIS形式の日本語文字データをサーブレットに送信してそれを取得して、文字のエンコードを行う際に気がついたのですが String text = request.getParameter("text"); byte[] bytes =text.getBytes("ISO8859_1"); text=new String(bytes, "SJIS"); のようにすればサーブレットで扱う時に正しく日本語表示できるのですが String text = request.getParameter("text"); byte[] bytes =text.getBytes("SJIS"); text=new String(bytes, "SJIS"); とすると正しく表示されません。 text.getBytes("SJIS");で取得格納されるbyteのデータに違いがあるようです。この場合取得されるbyteの配列は3つになっています。 ISO8859_1で取得するとbyte配列は2つになっています。このISO8859_1のbyte配列のデータと同じ中身のものを単にString(byteデータ,文字コード)のコンストラクタに入れるとSJISの文字コードで正しく変換出来ています。 要するにもともとSJISの文字データをgetByte("SJIS")で変換したものがなんで、もとに戻せないのかということです。また、違う文字コードのISO8859_1ではSJISに対応したbyteの配列になるのかということです。 ひどい乱文ですみませんが、よろしくお願いします。

専門家に質問してみよう