欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-31 19:17:41
...

当文字长度为奇数时转为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);

    }

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

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

相关标签: byte GBK