1. 程式人生 > >在GBK與UTF-8互轉時遇到問題,及解決方案

在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);

    }

結果
未修改之前:測試啊誰�?
修改之後:測試啊誰說

可以根據使用場景更改,當長度為偶數時不增加,我這裡就不寫了