Top/VBS/EBCDICファイルをシフトJISに変換する
//VBS/EBCDICファイルをシフトJISに変換する
*VBSによる変換
Microsoftのサイトに、VBAを使った変換用プログラムがありました。
それを利用して、VBSで変換ツールを自作しました。
*使い方
後述のプログラムを「ConvToSjis.vbs」という名前で保存してください。
以下の方法で実行すると変換ファイルが作成されます。
ConvToSjis.vbs 変換するファイル名 変換後のファイル名
このプログラムは「富士通」準拠のEBCDICに対応しています。
EBCDICは各社によって微妙にコードが異なるので、その他のメーカーのコードに対応する場合はプログラム中にある変換コードのテーブルをカスタマイズしてください。
*プログラムコード
'
' EBCDIC → Shift-JIS変換(ConvToSjis.vbs)
'
' EBCDICファイルをShift-JISファイルに変換します。
'
' (使い方)
' ConvToSjis.vbs 変換するファイル名 変換後のファイル名
'
'
Option Explicit
Dim objParm
Dim objFileSys
Dim strReadFilePath
Dim strWriteFilePath
Dim objReadStream
Dim objWriteStream
Dim strText
Dim strConv
Dim ByteArray
Dim i, j
Dim b
Set objParm = Wscript.Arguments
If objParm.Count < 2 Then
WScript.echo "コマンドライン引数が足りません"
WScript.Quit
End If
strReadFilePath = objParm(0)
strWriteFilePath = objParm(1)
Set objFileSys = CreateObject("Scripting.FileSystemObject")
objFileSys.CreateTextFile strWriteFilePath
Set objReadStream = CreateObject("ADODB.Stream")
Call objReadStream.Open()
objReadStream.Type = 1 'Binary
objReadStream.LoadFromFile(strReadFilePath)
If objReadStream.Size >= 1 Then
ReDim a(objReadStream.Size - 1)
j = 0
For i = 1 To objReadStream.Size
a(j) = AscB(objReadStream.Read(1))
j = j + 1
Next
Set objWriteStream = CreateObject("ADODB.Stream")
Call objWriteStream.Open()
objWriteStream.Type = 2 'Text
objWriteStream.Charset = "ISO_8859-1:1987"
b = Translate(a, EBCDIC_To_ASCII_Table())
For i = 0 To UBound(b)
Call objWriteStream.WriteText(ChrW(b(i)))
Next
Call objWriteStream.SaveToFile(strWriteFilePath, 2)
Call objWriteStream.Close()
End If
Call objReadStream.Close()
Set objReadStream = Nothing
Set objWriteStream = Nothing
Set objFileSys = Nothing
WScript.Echo "変換が完了しました。"
'------------------------------------------------------------------------------
Function Translate(ByVal arrText, xlatTable)
'
' Uses a translation table to map arrText from one character set to another.
'
Dim i, num, codeConv, numConv
Redim arrConv(Ubound(arrText))
'WScript.Echo Ubound(arrText)
For i = 0 To UBound(arrText)
num = arrText(i)
'WScript.Echo num
codeConv = Mid(xlatTable, (num * 2) + 1, 2)
Execute ("numConv = &H" & codeConv)
arrConv(i) = numConv
'If i < 5 Then
' WScript.Echo i & ":'" & Hex(num) & "→" & Hex(numConv) & _
' "(" & Chr(numConv) & ")"
'End If
Next
Translate = arrConv
End Function
Function EBCDIC_To_ASCII_Table()
'
' Returns the following table as a string for use by the Translate
' function to traslate an EBCDIC string to an ASCII-ISO/ANSI string.
'
'(Fujitsu EBCDIC)
' 0 1 2 3 4 5 6 7 8 9 A B C D E F
' 0 00 01 02 03 9C 09 86 7F 97 8D 8E 0B 0C 0D 0E 0F :016 :................:O
' 1 10 11 12 13 9D 85 08 87 18 19 92 8F 1C 1D 1E 1F :032 :................:O
' 2 80 81 82 83 84 0A 17 1B 88 89 8A 8B 8C 05 06 07 :048 :................:O
' 3 90 91 16 93 94 95 96 04 98 99 9A 9B 14 15 9E 1A :064 :................:O
' 4 20 A1 A2 A3 A4 A5 A6 A7 A8 A9 5B 2E 3C 28 2B 21 :080 : 。「」、・ヲァィゥ[.<(+!:O
' 5 73 AA AB AC AD AE AF 20 B0 20 5D 5C 2A 29 3B 5E :096 :sェォャュョッ ー ]\*);^:O
' 6 2D 2F 20 63 64 65 66 67 68 69 7C 2C 25 5F 3E 3F :112 :-/ cdefghi|,%_>?:O
' 7 6A 6B 6C 6D 6E 6F 70 71 72 20 3A 23 40 61 3D 22 :128 :jklmnopqr :#@a=":O
' 8 20 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA 74 BB BC BD BE :133 : アイウエオカキクケコtサシスセ:0
' 9 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 75 76 CA CB CC :160 :ソタチツテトナニヌネノuvハヒフ:0
' A 77 7E CD CE CF D0 D1 D2 D3 D4 D5 78 D6 D7 D8 D9 :176 :w~ヘホマミムメモヤユxヨラリル:O
' B 79 7A 20 20 62 20 26 27 20 20 DA DB DC DD DE DF :192 :yz b &' レロワン゙゚:O
' C 7B 41 42 43 44 45 46 47 48 49 E8 E9 EA EB EC ED :208 :{ABCDEFGHI......:O
' D 7D 4A 4B 4C 4D 4E 4F 50 51 52 EE EF F0 F1 F2 F3 :224 :}JKLMNOPQR......:O
' E 24 20 53 54 55 56 57 58 59 5A F4 F5 F6 F7 F8 F9 :240 :$.STUVWXYZ......:O
' F 30 31 32 33 34 35 36 37 38 39 FA FB FC FD FE FF :256 :0123456789......:
'
' 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 1 2 3 4 5 6 7 8 9 A B C D E F
EBCDIC_To_ASCII_Table = _
"000102039C09867F978D8E0B0C0D0E0F101112139D8508871819928F1C1D1E1F" & _
"80818283840A171B88898A8B8C050607909116939495960498999A9B14159E1A" & _
"20A1A2A3A4A5A6A7A8A95B2E3C282B2173AAABACADAEAF20B0205D5C2A293B5E" & _
"2D2F20636465666768697C2C255F3E3F6A6B6C6D6E6F707172203A2340613D22" & _
"20B1B2B3B4B5B6B7B8B9BA74BBBCBDBEBFC0C1C2C3C4C5C6C7C8C97576CACBCC" & _
"777ECDCECFD0D1D2D3D4D578D6D7D8D9797A2020622026272020DADBDCDDDEDF" & _
"7B414243444546474849E8E9EAEBECED7D4A4B4C4D4E4F505152EEEFF0F1F2F3" & _
"2420535455565758595AF4F5F6F7F8F930313233343536373839FAFBFCFDFEFF"
End Function
'参考
'http://support.microsoft.com/kb/216399/ja
'http://moritora.seesaa.net/article/272675855.html
'http://moritora.seesaa.net/article/272835611.html
'http://www.hitachi.co.jp/Prod/comp/soft1/manual/pc/d3J3820/ISUS0268.HTM
'http://mobile.shinsv.dyndns.org/strings_code/
-参考サイト
http://support.microsoft.com/kb/216399/ja