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

来源:互联网 发布:mac版炒股软件 编辑:程序博客网 时间:2024/05/21 01:32

    把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.csdn.net/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。


0 0
原创粉丝点击