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

MyList

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

プログラミング」カテゴリの記事

コメント

コメントを書く

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

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

トラックバック


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

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