From: Todd Burch Date: 2007-05-11T05:59:25+09:00 Subject: Re: Trouble using string.tr() Jeremy Hinegardner 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. -- Posted via http://www.ruby-forum.com/.