フォト
無料ブログはココログ

« Circuit Celler magazine | トップページ | kobo(3) »

2014年4月19日 (土)

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) »

日記・コラム・つぶやき」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/577514/59427539

この記事へのトラックバック一覧です: VBSでSJIS→EUC-JP変換 おまけにURLエンコード:

« Circuit Celler magazine | トップページ | kobo(3) »