2013-08-11 3 views
2

Преобразование String в EBCDIC через String.getBytes (charset) обеспечивает как минимум один ложный результат. Символ «a» становится 0x3f, но должен быть 0x81.String.getBytes (charset) имеет ошибки для EBCDIC-charset

public static void convert() throws UnsupportedEncodingException { 
    String data="abcABC"; 
    String ebcdic = "IBM-1047"; 
    String ascii = "ISO-8859-1"; 

    System.out.printf("Charset %s is supported: %s\n", ebcdic, Charset.isSupported(ebcdic)); 
    String result= new String(data.getBytes(ebcdic)); 
    System.out.printf("EBCDIC: %s\n",asHex(result.getBytes())); 

    System.out.printf("Charset %s is supported: %s\n", ascii, Charset.isSupported(ascii)); 
    result= new String(data.getBytes(ascii)); 
    System.out.printf("ASCII: %s\n",asHex(result.getBytes())); 
} 

public static String asHex(byte[] buf) { 
    char[] HEX_CHARS = "abcdef".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); 
} 

Результат IST:

  • Charset IBM-1047 поддерживается: истинный
  • EBCDIC: 3f8283c1c2c3
  • Charset ISO-8859-1 поддерживается: истинный
  • ASCII: 616263414243

Что-нибудь я могу сделать по этому поводу?

+1

Пожалуйста, добавьте соответствующий тег языка. –

ответ

2

Когда вы звоните

data.getBytes(ebcdic) 

Вы кодирующего текст данных в EBCDIC байт. Затем вы создаете строку из этих байтов, как если бы они стояли за некоторой строкой в ​​кодировке символов по умолчанию для вашей системы: это приводит к поломке, потому что байты не должны кодировать действительный текст в любой другой кодировке, чем EBCDIC.

Чтобы это исправить, сохранить байт в байт:

byte[] result= data.getBytes(ebcdic); 
System.out.printf("EBCDIC: %s\n",asHex(result)); 
+0

Вы правы. Изменение на byte [] result = data.getBytes (ebcdic); решил – Ulrich