在GBK与UTF-8互转时遇到问题,及解决方案

当文字长度为奇数时转为GBK再转回UTF-8时会出现末尾字符乱码的情况,在此特地记录一下解决方案

最近在写一个根据模板标签生成word的项目,在本地测试无问题但是放到服务器上会出现生成字符乱码的情况,
考虑到GBK转UTF-8使用getBytes只有在长度为奇数时才会出现精度丢失,想到给byte补全至偶数。

具体代码如下

/**
     * byte转16进制字符串
     * @param byteArray
     * @return
     */
    public static String printHex(byte[] byteArray){
        StringBuffer sb = new StringBuffer();
        for (byte b : byteArray) {
            sb.append(Integer.toHexString((b >> 4) & 0xF));
            sb.append(Integer.toHexString(b & 0xF));
        }
        return sb.toString();
    };

    /**
     * 16进制转byte
     * @param str
     * @return
     */
    public static byte[] hexStrToByteArray(String str) {
        if (str == null) {
            return null;
        }
        if (str.length() == 0) {
            return new byte[0];
        }
        byte[] byteArray = new byte[str.length() / 2];
        for (int i = 0; i < byteArray.length; i++) {
            String subStr = str.substring(2 * i, 2 * i + 2);
            byteArray[i] = ((byte) Integer.parseInt(subStr, 16));
        }
        return byteArray;
    }

测试

private final static String space = "eea092";//全角空格
    public static void main(String[] args) throws UnsupportedEncodingException {

        String gbk = "测试啊谁说";
        byte[] bytes = gbk.getBytes();
        String string1 = new String(bytes, "GBK");
        String string = new String(hexStrToByteArray(printHex(bytes)+space), "GBK");
        String string4 = new String(string.getBytes("GBK"), "UTF-8");
        String string41 = new String(string1.getBytes("GBK"), "UTF-8");
        System.out.println("未修改之前:"+string41);
        System.out.println("修改之后:"+string4);

    }

结果
未修改之前:测试啊谁�?
修改之后:测试啊谁说

可以根据使用场景更改,当长度为偶数时不增加,我这里就不写了

你可能感兴趣的:(在GBK与UTF-8互转时遇到问题,及解决方案)