VBSでSJIS→EUC-JP変換 おまけにURLエンコード
何年か前にVBSを使ってInputBoxで取得した文字列をHTTPでリクエストを送るスクリプトを書いた。
ネットにはサンプルもたくさんあって、たいした苦労も無く書けたのだが、リクエストを送るcgiはeuc-jpで動いているので、InputBoxで取得した文字列をSHIFT_JISからEUC-JPに文字コードを変換して、URLエンコードしなければならない。
ADODB Streamを使うと変換できそうなことは分かったが、EUC-JP→SHIFT_JISのサンプルは沢山あるが逆は見つからず、当時、面倒だったのでVBSで書くのをやめてrubyで書いて済ませていた。
最近、同じようにサーバにリクエストを送信する必要が生じた。rubyはどのPCにもインストールされているわけではないので、SHIFT_JIS→EUC-JPの変換、URLエンコードを全てVBSで書くことにして昔書いたスクリプトを持ち出してきた。
試行錯誤すること数時間、方法が分かった。
'================================================== ' Sjis -> euc -> URL encode ' Apr. 2014 / Yoshi '================================================== '-------------------------------------------------- ' isAlphaNum(c) ' arg c : character ' ret : bool = true : alphabet or numeric '------------------------------------------------- Function isAlphaNum(c) If Asc("A") <= Asc(c) And Asc(c) <= Asc("Z") Then isAlphaNum = True ElseIf Asc("a") <= Asc(c) And Asc(c) <= Asc("z") Then isAlphaNum = True ElseIf Asc("0") <= Asc(c) and Asc(c) <= Asc("9") Then isAlphaNum = True Else isAlphaNum = False End If End Function '-------------------------------------------------- ' Sjis -> euc -> URL encode ' Function sjis2euc_encode(str) ' arg: str : SJIS text ' ret: string : URL encoded EUC text '-------------------------------------------------- Function sjis2euc_encode(str) Dim oSjisStream, oEucStream Dim strSjis, strEuc, strEnc sjis2euc_encode = "" If str = "" Then Exit Function ' Create ADODB stream set oEucStream = CreateObject("ADODB.Stream") oEucStream.Type = 2 'text data oEucStream.CharSet = "EUC-JP" oEucStream.Open oEucStream.WriteText str ' Change binary mode oEucStream.Position = 0 'rewaind oEucStream.Type = 1 'binary data strEuc = oEucStream.Read 'into byte array For i=1 To LenB(strEuc) c = MidB(strEuc, i, 1) If isAlphaNum(Chr(AscB(c))) = False Then 'is not alphabet or numeric strEnc = strEnc & "%" & Hex(AscB(c)) 'URL encode Else strEnc = strEnc & Chr(AscB(c)) 'append string End If Next sjis2euc_encode = strEnc set oSjisStream = Nothing set oEucStream = Nothing End Function '-------------------------------------------------- ' Read text from InputBox '-------------------------------------------------- Dim memo, title, msg, default Dim eucStr default = "" title = "てすと" msg = Now & vBCrLf & "メモは省略可能です." memo = InputBox(msg, ttl, defalut) If IsEmpty(memo) = true Then WScript.Quit -1 End If '-------------------------------------------------- ' convert text & URL encode '-------------------------------------------------- eucStr = sjis2euc_encode(memo) WScript.Echo "memo=" & memo & " str=" & eucStr |
基本的には、キャラクタセットEUC-JPのADODB Streamを作成して、SHIFT_JIS文字列を書き込む。このストリームのPositionを0に設定して読み出すとEUC-JPに変換されたデータを読み出すことができる。
ハマりどころは、
- ストリームへの書き込み
InputBoxで取得したデータの形はStringなので ADODB StreamのTypeを2(text data)に設定し、ストリームへの書き込みは WriteTextメソッドを使用する必要がある。 - ストリームからの読出し
出力はURLエンコードするため1byteづつ読まなければならないので、ADODB StreamのTypeを1(bynary data)に変えてReadメッソドで読み出すとbyte配列(byte())に読み出される。読み出す前にPositionを0(Streamの先頭)に設定ておく。 - 使用する関数
バイト配列から読んだデータはMid、Asc、Len関数で処理できないのでMidB、AscB、LenBを使う必要がある。
出来てみれば、当時なぜ出来なかったのだろうかと思う。
知人いわく、「今度はVBSか!」いやいや心の趣くままにTPOに応じて..
« Circuit Celler magazine | トップページ | kobo(3) »
「プログラミング」カテゴリの記事
- GMC-4で動く3連ナイトライダー(2022.12.30)
- プログラミング言語ランキング(2022.11.19)
- AWSでサービス構築(2022.05.29)
- Excelの配列式(2022.01.06)
- ローコード・プログラミング(2021.11.07)
コメント