Jeremy H. wrote:
Have you tried just funnelling the data through some other tool?
No, and I would rather not. Your example seems pretty thorough.
I think I’ve narrowed it down to string#tr is broken. I rebuilt my
translate strings with all hex codes for non-alphanumeric characters,
like this:
$ebcdic_nums = 0xF0.chr + 0XF1.chr + 0xF2.chr + 0xF3.chr + 0xF4.chr +
0xF5.chr + 0xF6.chr + 0xF7.chr + 0xF8.chr + 0xF9.chr ;
$ascii_nums = “0123456789” ;
$ebcdic_chars = $ebcdic_nums ;
$ascii_chars = $ascii_nums ;
$ebcdic_chars += 0x40.chr ; # blank
$ascii_chars += 0x20.chr ;
###$ebcdic_chars += 0xFF.chr ; # unprintable
###$ebcdic_chars += 0x00.chr ; # unprintable
###$ascii_chars += " " ; # make ebcdic 0XFF into a blank
###$ascii_chars += ’ ’ ; # make ebcdic 0X00 into a blank
$ebcdic_chars += 0XC1.chr + 0xC2.chr + 0xC3.chr + 0xC4.chr + 0xC5.chr +
0xC6.chr + 0xC7.chr + 0xC8.chr + 0xC9.chr ; # A-I
$ebcdic_chars += 0XD1.chr + 0xD2.chr + 0xD3.chr + 0xD4.chr + 0xD5.chr +
0xD6.chr + 0xD7.chr + 0xD8.chr + 0xD9.chr ; # J-R
$ebcdic_chars += 0xE2.chr + 0xE3.chr + 0xE4.chr + 0xE5.chr +
0xE6.chr + 0xE7.chr + 0xE8.chr + 0xE9.chr ; # S-Z
$ebcdic_chars += 0X81.chr + 0x82.chr + 0x83.chr + 0x84.chr + 0x85.chr +
0x86.chr + 0x87.chr + 0x88.chr + 0x89.chr ; # a-i
$ebcdic_chars += 0X91.chr + 0x92.chr + 0x93.chr + 0x94.chr + 0x95.chr +
0x96.chr + 0x97.chr + 0x98.chr + 0x99.chr ; # j-r
$ebcdic_chars += 0xA2.chr + 0xA3.chr + 0xA4.chr + 0xA5.chr +
0xA6.chr + 0xA7.chr + 0xA8.chr + 0xA9.chr ; # s-z
$ascii_chars += (‘A’…‘Z’).to_a.to_s ; # A-Z
$ascii_chars += (‘a’…‘z’).to_a.to_s ; # a-z
$ebcdic_chars += 0x4B.chr ; # .
$ascii_chars += 0x2E.chr ;
$ebcdic_chars += 0x6E.chr ; # >
$ascii_chars += 0x3E.chr ;
$ebcdic_chars += 0x4C.chr ; # <
$ascii_chars += 0x3C.chr ;
$ebcdic_chars += 0x4D.chr ; # (
$ascii_chars += 0x28.chr ;
$ebcdic_chars += 0x5D.chr ; # )
$ascii_chars += 0x29.chr ;
$ebcdic_chars += 0x4E.chr ; # +
$ascii_chars += 0x2B.chr ;
$ebcdic_chars += 0x4F.chr ; # |
$ascii_chars += 0x7C.chr ;
$ebcdic_chars += 0x5A.chr ; # !
$ascii_chars += 0x21.chr ;
$ebcdic_chars += 0x5B.chr ; # $
$ascii_chars += 0x24.chr ;
$ebcdic_chars += 0x5C.chr ; # *
$ascii_chars += 0x2A.chr ;
$ebcdic_chars += 0x5E.chr ; # ;
$ascii_chars += 0x3B.chr ;
$ebcdic_chars += 0x5F.chr ; # ^
$ascii_chars += 0x5E.chr ;
#$ebcdic_chars += 0x60.chr ; # -
#$ascii_chars += 0x2D.chr ;
$ebcdic_chars += 0x61.chr ; # /
$ascii_chars += 0x2F.chr ;
$ebcdic_chars += 0x6B.chr ; # ,
$ascii_chars += 0x2C.chr ;
$ebcdic_chars += 0x6C.chr ; # %
$ascii_chars += 0x25.chr ;
$ebcdic_chars += 0x6D.chr ; # _
$ascii_chars += 0x5F.chr ;
$ebcdic_chars += 0x6F.chr ; # ?
$ascii_chars += 0x3F.chr ;
$ebcdic_chars += 0x79.chr ; # `
$ascii_chars += 0x60.chr ;
$ebcdic_chars += 0x7A.chr ; # :
$ascii_chars += 0x3A.chr ;
$ebcdic_chars += 0x7B.chr ; # #
$ascii_chars += 0x23.chr ;
$ebcdic_chars += 0x7C.chr ; # @
$ascii_chars += 0x40.chr ;
$ebcdic_chars += 0x7D.chr ; # ’
$ascii_chars += 0x27.chr ;
$ebcdic_chars += 0x7E.chr ; # =
$ascii_chars += 0x3D.chr ;
$ebcdic_chars += 0x7F.chr ; # "
$ascii_chars += 0x22.chr ;
$ebcdic_chars += 0xBA.chr ; # [
$ascii_chars += 0x5B.chr ;
$ebcdic_chars += 0xBB.chr ; # ]
$ascii_chars += 0x5D.chr ;
$ebcdic_chars += 0xC0.chr ; # {
$ascii_chars += 0x7B.chr ;
$ebcdic_chars += 0xD0.chr ; # }
$ascii_chars += 0x7D.chr ;
$ebcdic_chars += 0xE0.chr ; #
$ascii_chars += 0x5C.chr ;
$ebcdic_chars += 0x50.chr ; # &
$ascii_chars += 0x26.chr ;
I derived the ASCII character codes by writing this 1 line script:
puts ARGV[0].unpack(‘H64’).to_s.upcase ;
Then, I enter:
ruby charcnvt.rb ‘-’
and it responds that the hex code for minus (hyphen) is 0x2D. Ok, fine.
However, then I do the translate, and it converts my ebcdic 0x60 into
ascii 0x2C (a comma) instead of 0x2D.