Java String.getBytes(字符集)对于EBCDIC字符集有错误

Java String.getBytes(字符集)对于EBCDIC字符集有错误,java,character-encoding,string-conversion,ebcdic,Java,Character Encoding,String Conversion,Ebcdic,通过String.getBytes(字符集)将字符串转换为EBCDIC至少会提供一个错误结果。字符“a”变为0x3f,但应为0x81 public static void convert() throws UnsupportedEncodingException { String data="abcABC"; String ebcdic = "IBM-1047"; String ascii = "ISO-8859-1"; System.out.printf(

通过String.getBytes(字符集)将字符串转换为EBCDIC至少会提供一个错误结果。字符“a”变为0x3f,但应为0x81

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 = "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);
}
public static void convert()引发UnsupportedEncodingException{
字符串数据=“abcABC”;
字符串ebcdic=“IBM-1047”;
字符串ascii=“ISO-8859-1”;
System.out.printf(“支持字符集%s:%s\n”,ebcdic,字符集.isSupported(ebcdic));
字符串结果=新字符串(data.getBytes(ebcdic));
System.out.printf(“EBCDIC:%s\n”,asHex(result.getBytes());
System.out.printf(“支持字符集%s:%s\n”,ascii,字符集.isSupported(ascii));
结果=新字符串(data.getBytes(ascii));
System.out.printf(“ASCII:%s\n”,asHex(result.getBytes());
}
公共静态字符串asHex(字节[]buf){
char[]HEX_CHARS=“0123456789abcdef”.toCharArray();
char[]chars=新字符[2*buf.长度];
对于(int i=0;i>>4];
字符[2*i+1]=十六进制字符[buf[i]&0x0F];
}
返回新字符串(字符);
}
结果是:

  • 支持字符集IBM-1047:true
  • EBCDIC:3F8283C1C1C3
  • 支持字符集ISO-8859-1:true
  • ASCII:616263414243
有什么我能做的吗?

当你打电话时

data.getBytes(ebcdic)
您正在将数据中的文本编码为EBCDIC字节。然后从这些字节创建一个字符串,就好像它们代表系统默认字符编码中的某个字符串一样:这会导致中断,因为这些字节不必用EBCDIC以外的任何其他编码对有效文本进行编码

要解决此问题,请将字节保留为字节:

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

请添加适当的语言标记。您是对的。更改为byte[]result=data.getBytes(ebcdic);解决了