在GBK與UTF-8互轉時遇到問題,及解決方案
阿新 • • 發佈:2019-01-31
當文字長度為奇數時轉為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);
}
結果
未修改之前:測試啊誰�?
修改之後:測試啊誰說
可以根據使用場景更改,當長度為偶數時不增加,我這裡就不寫了