小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

シフトJISからUTF-16へ変換

VBScriptシフトJISからUTF-16への変換ルーチンを組んでみました。

◆ソース(sj2utf.vbs)

Call FromTo("sj.txt", "shift_jis", "utf16.txt", "utf-16")
'FromToサブの第4引数を以下を参照して替える
'BOM付きビックエディアン unicodeFEFF
'BOM無しビックエディアン utf-16be
'BOM無しリトルエディアン 不明
'BOM付きリトルエディアン unicode, unicodeFFFE, utf-16, utf-16le, 

Public Sub FromTo(inFileName, inCharset, outFileName, outCharset)
Const adSaveCreateOverWrite = 2
Dim inStream
Dim outStream

    Set inStream = CreateObject("ADODB.Stream")
    inStream.Charset = inCharset
    inStream.Open

    Set outStream = CreateObject("ADODB.Stream")
    outStream.Charset = outCharset
    outStream.Open

    inStream.LoadFromFile inFileName
    inStream.CopyTo outStream
    outStream.SaveToFile outFileName, adSaveCreateOverWrite

    outStream.Close
    inStream.Close
    Set outStream = Nothing
    Set inStream = Nothing
End Sub

◆実行方法

sj2utf.vbsとsj.txt(シフトJISのコードのデータ)を同じフォルダにして以下のコマンドを実行。または、単にsj2utf.vbsをダブルクリックする。

C:\wk>CScript sj2utf.vbs

◆補足

FromToサブの第4引数は、レジストリの以下に登録されているものとのことですが、それ以外にもあるようです。

HKEY_CLASSES_ROOT\MIME\Database\Charset

また、『BOM無しリトルエディアン』の指定の方法が不明です。
ちなみに、PerlのEncodeでは、『BOM付きリトルエディアン』の指定の方法が不明だったのですが・・・。

◆蛇足

Perlと同じように標準入出力でプログラムを組みたかったのですが、VBScriptではバイナリデータを標準出力することが出来ないみたいです(テキストなら出来る)。
また、直接的な変換関数もなく、Asc,Hex,Valを組み合わせば出来そうなのですが・・・来なかったです。
そこで、標準入出力と独自変換はあきらめ、ファイル指定の入出力とADODB.Streamの変換を使ってみました。
ADODB.Streamでのコード変換は、VBScriptでの定石のようです。