Java 中文字符串编码之GBK转UTF-8

一、乱码的原因

gbk的中文编码是一个汉字用【2】个字节表示,例如汉字“内部”的gbk编码16进制的显示为c4 da b2 bf

utf-8的中文编码是一个汉字用【3】个字节表示,例如汉字“内部”的utf-8编码16进制的显示为e5 86 85 e9 83 a8

很显然,gbk是无法直接转换成utf-8,少字节变为多字节,谁知道缺少的字节是什么啊?!

二、转换的办法

有办法实现“有损”转换吗?答案是肯定的。

1.首先将gbk字符串getBytes()得到两个原始字节,转换成二进制字符流,共16位。

2.根据UTF-8的汉字编码规则,首字节以1110开头,次字节以10开头,第3字节以10开头。在原始的2进制字符串中插入标志位。最终的长度从16—>16+4+2+2=24。

3.转换完成,实际情况需要考虑更多因素,例如字符串是汉字和数字的混合体,需要识别处理数字。

三、不要重复发明轮子

这段代码测试可用还很好用,需要的可以参考。

public static byte[] getUTF8BytesFromGBKString(String gbkStr) {  
    int n = gbkStr.length();  
    byte[] utfBytes = new byte[3 * n];  
    int k = 0;  
    for (int i = 0; i < n; i++) {  
        int m = gbkStr.charAt(i);  
        if (m < 128 && m >= 0) {  
            utfBytes[k++] = (byte) m;  
            continue;  
        }  
        utfBytes[k++] = (byte) (0xe0 | (m >> 12));  
        utfBytes[k++] = (byte) (0x80 | ((m >> 6) & 0x3f));  
        utfBytes[k++] = (byte) (0x80 | (m & 0x3f));  
    }  
    if (k < utfBytes.length) {  
        byte[] tmp = new byte[k];  
        System.arraycopy(utfBytes, 0, tmp, 0, k);  
        return tmp;  
    }  
    return utfBytes;  
}
public static String getUTF8StringFromGBKString(String gbkStr) {  
    try {  
        return new String(getUTF8BytesFromGBKString(gbkStr), "UTF-8");  
    } catch (UnsupportedEncodingException e) {  
        throw new InternalError();  
    }  
}  

参考于: Java 中文字符串编码之GBK转UTF-8

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值