ANK文字のJIS8→EBCDIC変換
それほど機会がないと思いますが・・・。(^^;A
ANK文字(1バイト文字)をJIS8(ASCII+半角カナ)からEBCDICコードへコード変換するプログラムです。テキストファイルの内容を汎用機用に変換する機会があったのですが
たかが1バイト文字を市販の変換ツールを使用してわざわざ変換するのスマートじゃないと言うことで作成しました。VB4.0以降の32ビット版だと文字列を勝手にUnicodeに変換してしまうため文字型の変数では処理できません。
そこでバイト型の配列を利用して処理しています。
'JIS-8のANK文字列をEDCDICのANKに変換 '戻り値はバイト型の配列(=バリアント型) Private Function AsciiToEbicdic(Str As String) As Variant Dim Tbl_AtoE(255) As Byte Dim i As Integer Dim Ebicdic_DATA() As Byte '変換テーブルのセット Tbl_AtoE(0) = &H0 Tbl_AtoE(1) = &H1 Tbl_AtoE(2) = &H2 Tbl_AtoE(3) = &H3 Tbl_AtoE(4) = &H37 Tbl_AtoE(5) = &H2D Tbl_AtoE(6) = &H2E Tbl_AtoE(7) = &H2F Tbl_AtoE(8) = &H16 Tbl_AtoE(9) = &H5 Tbl_AtoE(10) = &H15 Tbl_AtoE(11) = &HB Tbl_AtoE(12) = &HC Tbl_AtoE(13) = &HD Tbl_AtoE(14) = &HE Tbl_AtoE(15) = &HF Tbl_AtoE(16) = &H10 Tbl_AtoE(17) = &H11 Tbl_AtoE(18) = &H12 Tbl_AtoE(19) = &H13 Tbl_AtoE(20) = &H3C Tbl_AtoE(21) = &H3D Tbl_AtoE(22) = &H32 Tbl_AtoE(23) = &H26 Tbl_AtoE(24) = &H18 Tbl_AtoE(25) = &H19 Tbl_AtoE(26) = &H3F Tbl_AtoE(27) = &H27 Tbl_AtoE(28) = &H1C Tbl_AtoE(29) = &H1D Tbl_AtoE(30) = &H1E Tbl_AtoE(31) = &H1F Tbl_AtoE(32) = &H40 Tbl_AtoE(33) = &H5A Tbl_AtoE(34) = &H7F Tbl_AtoE(35) = &H7B Tbl_AtoE(36) = &HE0 Tbl_AtoE(37) = &H6C Tbl_AtoE(38) = &H50 Tbl_AtoE(39) = &H7D Tbl_AtoE(40) = &H4D Tbl_AtoE(41) = &H5D Tbl_AtoE(42) = &H5C Tbl_AtoE(43) = &H4E Tbl_AtoE(44) = &H6B Tbl_AtoE(45) = &H60 Tbl_AtoE(46) = &H4B Tbl_AtoE(47) = &H61 Tbl_AtoE(48) = &HF0 Tbl_AtoE(49) = &HF1 Tbl_AtoE(50) = &HF2 Tbl_AtoE(51) = &HF3 Tbl_AtoE(52) = &HF4 Tbl_AtoE(53) = &HF5 Tbl_AtoE(54) = &HF6 Tbl_AtoE(55) = &HF7 Tbl_AtoE(56) = &HF8 Tbl_AtoE(57) = &HF9 Tbl_AtoE(58) = &H7A Tbl_AtoE(59) = &H5E Tbl_AtoE(60) = &H4C Tbl_AtoE(61) = &H7E Tbl_AtoE(62) = &H6E Tbl_AtoE(63) = &H6F Tbl_AtoE(64) = &H7C Tbl_AtoE(65) = &HC1 Tbl_AtoE(66) = &HC2 Tbl_AtoE(67) = &HC3 Tbl_AtoE(68) = &HC4 Tbl_AtoE(69) = &HC5 Tbl_AtoE(70) = &HC6 Tbl_AtoE(71) = &HC7 Tbl_AtoE(72) = &HC8 Tbl_AtoE(73) = &HC9 Tbl_AtoE(74) = &HD1 Tbl_AtoE(75) = &HD2 Tbl_AtoE(76) = &HD3 Tbl_AtoE(77) = &HD4 Tbl_AtoE(78) = &HD5 Tbl_AtoE(79) = &HD6 Tbl_AtoE(80) = &HD7 Tbl_AtoE(81) = &HD8 Tbl_AtoE(82) = &HD9 Tbl_AtoE(83) = &HE2 Tbl_AtoE(84) = &HE3 Tbl_AtoE(85) = &HE4 Tbl_AtoE(86) = &HE5 Tbl_AtoE(87) = &HE6 Tbl_AtoE(88) = &HE7 Tbl_AtoE(89) = &HE8 Tbl_AtoE(90) = &HE9 Tbl_AtoE(91) = &H4A Tbl_AtoE(92) = &H5B Tbl_AtoE(93) = &H40 Tbl_AtoE(94) = &H5F Tbl_AtoE(95) = &H6D Tbl_AtoE(96) = &H40 Tbl_AtoE(97) = &HC1 Tbl_AtoE(98) = &HC2 Tbl_AtoE(99) = &HC3 Tbl_AtoE(100) = &HC4 Tbl_AtoE(101) = &HC5 Tbl_AtoE(102) = &HC6 Tbl_AtoE(103) = &HC7 Tbl_AtoE(104) = &HC8 Tbl_AtoE(105) = &HC9 Tbl_AtoE(106) = &HD1 Tbl_AtoE(107) = &HD2 Tbl_AtoE(108) = &HD3 Tbl_AtoE(109) = &HD4 Tbl_AtoE(110) = &HD5 Tbl_AtoE(111) = &HD6 Tbl_AtoE(112) = &HD7 Tbl_AtoE(113) = &HD8 Tbl_AtoE(114) = &HD9 Tbl_AtoE(115) = &HE2 Tbl_AtoE(116) = &HE3 Tbl_AtoE(117) = &HE4 Tbl_AtoE(118) = &HE5 Tbl_AtoE(119) = &HE6 Tbl_AtoE(120) = &HE7 Tbl_AtoE(121) = &HE8 Tbl_AtoE(122) = &HE9 Tbl_AtoE(123) = &H40 Tbl_AtoE(124) = &H4F Tbl_AtoE(125) = &H40 Tbl_AtoE(126) = &HA1 Tbl_AtoE(127) = &H7 Tbl_AtoE(128) = &H40 Tbl_AtoE(129) = &H40 Tbl_AtoE(130) = &H40 Tbl_AtoE(131) = &H40 Tbl_AtoE(132) = &H40 Tbl_AtoE(133) = &H40 Tbl_AtoE(134) = &H40 Tbl_AtoE(135) = &H40 Tbl_AtoE(136) = &H40 Tbl_AtoE(137) = &H40 Tbl_AtoE(138) = &H40 Tbl_AtoE(139) = &H40 Tbl_AtoE(140) = &H40 Tbl_AtoE(141) = &H40 Tbl_AtoE(142) = &H40 Tbl_AtoE(143) = &H40 Tbl_AtoE(144) = &H40 Tbl_AtoE(145) = &H40 Tbl_AtoE(146) = &H40 Tbl_AtoE(147) = &H40 Tbl_AtoE(148) = &H40 Tbl_AtoE(149) = &H40 Tbl_AtoE(150) = &H40 Tbl_AtoE(151) = &H40 Tbl_AtoE(152) = &H40 Tbl_AtoE(153) = &H40 Tbl_AtoE(154) = &H40 Tbl_AtoE(155) = &H40 Tbl_AtoE(156) = &H40 Tbl_AtoE(157) = &H40 Tbl_AtoE(158) = &H40 Tbl_AtoE(159) = &H40 Tbl_AtoE(160) = &H40 Tbl_AtoE(161) = &H41 Tbl_AtoE(162) = &H42 Tbl_AtoE(163) = &H43 Tbl_AtoE(164) = &H44 Tbl_AtoE(165) = &H45 Tbl_AtoE(166) = &H46 Tbl_AtoE(167) = &H47 Tbl_AtoE(168) = &H48 Tbl_AtoE(169) = &H49 Tbl_AtoE(170) = &H51 Tbl_AtoE(171) = &H52 Tbl_AtoE(172) = &H53 Tbl_AtoE(173) = &H54 Tbl_AtoE(174) = &H55 Tbl_AtoE(175) = &H56 Tbl_AtoE(176) = &H58 Tbl_AtoE(177) = &H81 Tbl_AtoE(178) = &H82 Tbl_AtoE(179) = &H83 Tbl_AtoE(180) = &H84 Tbl_AtoE(181) = &H85 Tbl_AtoE(182) = &H86 Tbl_AtoE(183) = &H87 Tbl_AtoE(184) = &H88 Tbl_AtoE(185) = &H89 Tbl_AtoE(186) = &H8A Tbl_AtoE(187) = &H8C Tbl_AtoE(188) = &H8D Tbl_AtoE(189) = &H8E Tbl_AtoE(190) = &H8F Tbl_AtoE(191) = &H90 Tbl_AtoE(192) = &H91 Tbl_AtoE(193) = &H92 Tbl_AtoE(194) = &H93 Tbl_AtoE(195) = &H94 Tbl_AtoE(196) = &H95 Tbl_AtoE(197) = &H96 Tbl_AtoE(198) = &H97 Tbl_AtoE(199) = &H98 Tbl_AtoE(200) = &H99 Tbl_AtoE(201) = &H9A Tbl_AtoE(202) = &H9D Tbl_AtoE(203) = &H9E Tbl_AtoE(204) = &H9F Tbl_AtoE(205) = &HA2 Tbl_AtoE(206) = &HA3 Tbl_AtoE(207) = &HA4 Tbl_AtoE(208) = &HA5 Tbl_AtoE(209) = &HA6 Tbl_AtoE(210) = &HA7 Tbl_AtoE(211) = &HA8 Tbl_AtoE(212) = &HA9 Tbl_AtoE(213) = &HAA Tbl_AtoE(214) = &HAC Tbl_AtoE(215) = &HAD Tbl_AtoE(216) = &HAE Tbl_AtoE(217) = &HAF Tbl_AtoE(218) = &HBA Tbl_AtoE(219) = &HBB Tbl_AtoE(220) = &HBC Tbl_AtoE(221) = &HBD Tbl_AtoE(222) = &HBE Tbl_AtoE(223) = &HBF Tbl_AtoE(224) = &H40 Tbl_AtoE(225) = &H40 Tbl_AtoE(226) = &H40 Tbl_AtoE(227) = &H40 Tbl_AtoE(228) = &H40 Tbl_AtoE(229) = &H40 Tbl_AtoE(230) = &H40 Tbl_AtoE(231) = &H40 Tbl_AtoE(232) = &H40 Tbl_AtoE(233) = &H40 Tbl_AtoE(234) = &H40 Tbl_AtoE(235) = &H40 Tbl_AtoE(236) = &H40 Tbl_AtoE(237) = &H40 Tbl_AtoE(238) = &H40 Tbl_AtoE(239) = &H40 Tbl_AtoE(240) = &H40 Tbl_AtoE(241) = &H40 Tbl_AtoE(242) = &H40 Tbl_AtoE(243) = &H40 Tbl_AtoE(244) = &H40 Tbl_AtoE(245) = &H40 Tbl_AtoE(246) = &H40 Tbl_AtoE(247) = &H40 Tbl_AtoE(248) = &H40 Tbl_AtoE(249) = &H40 Tbl_AtoE(250) = &H40 Tbl_AtoE(251) = &H40 Tbl_AtoE(252) = &H40 Tbl_AtoE(253) = &H40 Tbl_AtoE(254) = &H40 Tbl_AtoE(255) = &H40 '配列を割り当て ReDim Ebicdic_DATA(Len(Str) - 1) 'EBCDICに変換 For i = 1 To Len(Str) Ebicdic_DATA(i - 1) = Tbl_AtoE(Asc(Mid(Str, i, 1))) Next i AsciiToEbicdic = Ebicdic_DATA End Function
かなり強引なルーチンです。(笑)
呼び出すたびにEBCDICコードを格納している配列「EBCDICコード変換テーブル(Tbl_AtoE)」にEBCDICコードをセットしていますので、大量のデータを変換する場合はオーバーヘッドが大きくなる可能性があります。
処理効率の低下が懸念される場合はEBCDICコードをセットを別ルーチンにしてください。やってる事は大したことはありません。
引数である変換元文字列の文字数分のバイト型配列にRedimステートメントで必要な(文字数分の)メモリを割り当て、そこにAsc関数を使用して「EBCDICコード変換テーブル(Tbl_AtoE)」から対応するEBCDICコードを取得してセットしています。なお、このサンプルの変換テーブルは
JIS8 EBCDIC 数字・記号 → 数字・記号 カナ文字 → カナ文字 英小文字 → 英大文字 英大文字 → 英大文字 と、「英小文字」を「英大文字」に変換しています。
これは規格化されていないEBCDICコードの仕様で、EBCDICコードでは「カナ文字」と「英小文字」の文字コードが同じための処置です。
(例えばEBCDICコード"81h"は、半角カナの"ア"であり、英小文字の"a"でもあるのです。使用しているシステムによってどっちに解釈するかが決まります)
問題がある場合は、変換テーブルにセットしている値を修正してください。
具体的な使用例はこんな感じです。
Private Sub Command1_Click() Dim i As Integer Dim OUT_DATA() As Byte '文字列をEDCDICに変換 '戻り値はバイト型の配列(=バリアント型) OUT_DATA() = AsciiToEbicdic(Text2.Text) 'バイナリモードでオープンするため予めファイル削除 If Dir(Text1.Text) <> "" Then Kill Text1.Text End If 'バイナリモードでオープン Open Text1.Text For Binary As #1 '変換されたEDCDIC文字列を1バイトずつ出力 For i = 0 To UBound(OUT_DATA) Put #1, , OUT_DATA(i) Next i Close #1 Beep MsgBox "終わったよん" End Sub
ファイルに出力する場合は、上の例のようにバイナリモードで開いてPutステートメントで出力しないと、VBの「勝手に変換機能」が働いてしまいます・・・。
[ Window Close ]