конвертировать EBCDIC String в формат ASCII? - PullRequest
7 голосов
/ 19 августа 2011

У меня плоский файл, который извлекается из таблицы Db2, плоский файл содержит записи в формате char, а также в упакованном десятичном формате.преобразовать весь плоский файл в формат ASCII.

Ответы [ 4 ]

16 голосов
/ 19 августа 2011

EBCDIC - это семейство кодировок. Вам нужно будет более подробно узнать, какая кодировка EBCDIC нужна вам.

Java имеет несколько поддерживаемых кодировок , в том числе:

  • IBM500 / Cp500 - EBCDIC 500V1
  • x-IBM834 / Cp834 - корейская версия IBM EBCDIC только для DBCS (двухбайтовая)
  • IBM1047 / Cp1047 - Набор символов Latin-1 для хостов EBCDIC

Попробуйте это и посмотрите, что вы получите. Что-то вроде:

InputStreamReader rdr = new InputStreamReader(new FileInputStream(<your file>), java.nio.Charset.forName("ibm500"));
    while((String line = rdr.readLine()) != null) {
        System.out.println(line);
}
1 голос
/ 21 апреля 2012

Исходя из PAP, CP037 является кодировкой EBCDIC США.

Также взгляните на JRecord Project. Он позволяет вам читать файл с описанием Cobol или Xml и обрабатывать EBCDIC и Comp-3.

Наконец, вот процедура для преобразования упакованных десятичных байтов в строку. См. Метод getMainframePackedDecimal in Преобразование

1 голос
/ 19 августа 2011

Считайте файл как строку, запишите его как EBCDIC. Используйте OutputStreamWriter и InputStreamWriter и задайте кодировку в конструкторе.

0 голосов
/ 02 сентября 2014


Предоставление мне примера кода для справки:

    package mypackage;
    import java.io.UnsupportedEncodingException;
    import java.math.BigInteger;
    public class EtoA {

public static void main(String[] args) throws UnsupportedEncodingException {

    System.out.println("########");
    String edata = "/ÂÄÀ"; //Some EBCDIC string ==> here the OP can provide the content of flat file which the OP pulled from DB2 table 
    System.out.println("ebcdic source to ascii:");
    System.out.println("ebcdic: " + edata);
    String ebcdic_encoding = "IBM-1047"; //Setting the encoding in which the source was encoded
    byte[] result = edata.getBytes(ebcdic_encoding); //Getting the raw bytes of the EBCDIC string by mentioning its encoding
    String output = asHex(result); //Converting the raw bytes into hexadecimal format
    byte[] b = new BigInteger(output, 16).toByteArray(); //Now its easy to convert it into another byte array (mentioning that this is of base16 since it is hexadecimal)
    String ascii = new String(b, "ISO-8859-1"); //Now convert the modified byte array to normal ASCII string using its encoding "ISO-8859-1"
    System.out.println("ascii: " + ascii); //This is the ASCII string which we can use universally in JAVA or wherever 

    //Inter conversions of similar type (ASCII to EBCDIC) are given below:
    System.out.println("########");
    String adata = "abcd";
    System.out.println("ascii source to ebcdic:");
    System.out.println("ascii: " + adata);
    String ascii_encoding = "ISO-8859-1";
    byte[] res = adata.getBytes(ascii_encoding);
    String out = asHex(res);
    byte[] bytebuff = new BigInteger(out, 16).toByteArray();
    String ebcdic = new String(bytebuff, "IBM-1047");
    System.out.println("ebcdic: " + ebcdic);

    //Converting from hexadecimal string to EBCDIC if needed
    System.out.println("########");
    System.out.println("hexcode to ebcdic");
    String hexinput = "81828384"; //Hexadecimal which we are converting to EBCDIC
    System.out.println("hexinput: " + hexinput);
    byte[] buffer = new BigInteger(hexinput, 16).toByteArray();
    String eout = new String(buffer, "IBM-1047");
    System.out.println("ebcdic out:" + eout);

    //Converting from hexadecimal string to ASCII if needed
    System.out.println("########");
    System.out.println("hexcode to ascii");
    String hexin = "61626364";
    System.out.println("hexin: " + hexin);
    byte[] buff = new BigInteger(hexin, 16).toByteArray();
    String asciiout = new String(buff, "ISO-8859-1");
    System.out.println("ascii out:" + asciiout);
}

//This asHex method converts the given byte array to a String of Hexadecimal equivalent
public static String asHex(byte[] buf) {
    char[] HEX_CHARS = "0123456789abcdef".toCharArray();
    char[] chars = new char[2 * buf.length];
    for (int i = 0; i < buf.length; ++i) {
        chars[2 * i] = HEX_CHARS[(buf[i] & 0xF0) >>> 4];
        chars[2 * i + 1] = HEX_CHARS[buf[i] & 0x0F];
    }
    return new String(chars);
}
}
...