在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);
}
结果
未修改之前:测试啊谁�?
修改之后:测试啊谁说
可以根据使用场景更改,当长度为偶数时不增加,我这里就不写了
上一篇: Swift中GBK编码转换