在java中显示具有构建模式的UTF8字符串时出错

时间:2013-09-25 04:13:02

标签: java utf-8

我有一个十六进制字符串(sA)从UTF8字符串转换。 当我将十六进制字符串sA转换为UTF8字符串时,我无法在具有构建模式的表单UI中显示它(运行文件.jar)但是当我以运行模式或调试模式运行时,UTF8字符串可以在表单UI中显示。 我使用netbeans IDE 7.3.1。 我的代码如下:

public String hexToString(String txtInHex) {
    byte[] txtInByte = new byte[txtInHex.length() / 2];
    int j = 0;
    for (int i = 0; i < txtInHex.length(); i += 2) {
        txtInByte[j++] = Byte.parseByte(txtInHex.substring(i, i + 2), 16);
    }
    return new String(txtInByte);
}

private String asHex(byte[] buf) {
    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);
}

2 个答案:

答案 0 :(得分:1)

此代码存在多个问题。

字节值的有效范围是-128到127,或十六进制为-807FByte.parseByte强制执行此操作。如果您的asHex方法必须处理第二个字节大于127的字符,它将生成一个无法由toHexString解码的字符串。

asHex方法仅处理输入字符的第二个字节,因此它仅对前256个Unicode字符正常工作,并为其余字符生成伪造输出。

toHexString方法从字节数组中解码一个字符串,假设某些特定于平台的默认编码,如果数据被假定为以UTF-8编码并且默认编码是其他内容,则会产生不正确的结果。

为什么要尝试创建自己的方法来编码和解码十六进制字符串,而不是使用一个众所周知且经过测试的库?

答案 1 :(得分:0)

new String(txtInByte, "UTF-8");

如果没有编码,则采用平台编码,例如Windows-1252。反之亦然:String.getBytes -

String s = "....";
byte[] b = s.getBytes("UTF-8");