Spring MVC 为例,从前台—>后台—>前台的编解码过程及出现乱码的案例

本文探讨了Java中出现乱码的原因及解决方法,通过三个实际案例解释了不同编码方式下如何避免乱码问题,包括Java源文件、资源文件及Excel解析时的常见错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    把String Encode 成 bytes 后,Decode 必须使用相同的编码集,否则可能出现乱码。

    因为Java字符总是Unicode字符,所以在后文中,如果不加说明,“字符”或“char”都是指16位的Unicode字符,而“字节”或“byte”都是指8位字节。





案例一:为什么Java类中最好不要出现中文?

        若将中文用 utf-8 写入 .java 文件中,编译后为 .class 文件,若一个中文操作系统(如中文XP)的JVM读取该 .class 文件,因为没有“谁”像Freemarker那样告诉JVM用什么编码集来decode,所以JVM会使用默认的GBK,此时出现乱码。


案例二:为什么用native2ascii处理过的资源文件 xxx.properties ,在被读取时不会出现中文乱码?

(参考人气博客:http://blog.youkuaiyun.com/sfdev/article/details/3770706

      所有的英文字母都对应到一个数字编码,这就是ASCII码(American Standard Code for Information Interchange)。ASCII码是最古老的字符编码,它总共只定义了7位共128个字母、数字和符号。但它是其它所有字符编码的基础。Unicode常用UTF-8和UTF-16来表示。7位的ASCII码不用作任何变化,就已经是UTF-8了。但UTF-8需要用3个字节来表示一个汉字。

      GBK: 是双字节编码,是GB2312-80的扩充,在码位上和GB2312-80兼容。

      UTF-8和GBK都是将unicode压缩后来使用的,而native2ascii将中文都转换成了unicode。


案例三:工作中解析Excel时遇到的问题,去除中文字符串中的特殊空格。

      “施 兵”,实际情况中该string中间为一个特殊的空格。由nameStr.getBytes("utf-8")可知该空格的字节表示为{-62,-96}。


String nameStr = getCell(row.getCell(2));
byte []b = {-62,-96};
String blank = "";
try {
    blank = new String(b, "UTF-8");
} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
}
String userName = nameStr.replaceAll(blank, "");


若 new String() 时不指定utf-8,则JVM会使用默认编码集,如GBK来decode。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值