深入分析Java Web中的中文编码问题

发表于:2015-7-31 09:26

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:逝宇、    来源:51Testing软件测试网采编

  要对Java Web项目进行编码原因:
  1、在计算机中存储信息的最小单位是1个字节,即8个bit,所以能表示的字符范围是0~255个。
  2、电脑需要表示的符号太多、无法用1个字节完全表示。
  要解决这个问题,必须要有一个新的数据结构char,而从bit到char就要进行编码。
  常见的编码格式:
  1、ASCII码
  总共128个,用1个字符的低7位表示,0~31是控制字符,如换行、回车、删除等。32~126是打印字符,可以通过键盘输入并且表示出来
  2、ISO-8859-1
  ISO组织在ASCII的基础上又制定了一系列标准来就、扩展ASCII编码,他们是ISO-8859-1和ISO-8859-15。其中前者涵盖了大多数西欧语言字符,所以运用得比较广泛。ISO-8859-1仍然是单字节编码,它总共能表示256个字符.
  因为ISO-8859-1是单字节的,所以很多中文字符(两个字节)在编码时用ISO-8859-1表示时,因超出表示范围,所以出现??很多情况是将中文字符用ISO-8859-1表示。我们称之为“黑洞”(它会将不认识的字符吸收掉)。
  由于现在大部分基础的Java框架或系统默认的字符集编码都是ISO-8859-1,所以很容易出现乱码问题。
  3、GB2312
  GB2312是双字节编码,总的编码范围是A1-F7,其中A1-A9是符号区,总共有682个符号,B0-F7是汉字区,包含6763个汉字。
  4、GBK
  GBK全称是 汉字内码扩展规范,是中国国家技术监督局开发出来扩展GB2312,并加入了更多的汉字,它的编码范围是8140~FEFE,能表示21003个汉字。它与GB2312是兼容的。
  5、GB18030
  Gb18030全称是 信息技术中文编码字符集,是我国的强制标准,它可能是单字节的、双字节或者是四字节编码。它的编码与GB2312编码兼容。
  6、UTF-16
  ISO试图创建一个全新的超语言字典,世界上的语言都能使用这个字典进行翻译。UTF-16具体定义了Unicode字符在计算机中的存取方法,UTF-16用两个字节来表示Unicode的转化格式,它采用定长的表示方法,即无论什么字符都可以用两个字节表示。两个字节就是16个bit,所以叫做UTF-16。Java以UTF-16作为内存中字符存储格式。
  7、UTF-8
  UTF-8采用变长的方法,克服了UTF-16中定长的浪费资源的缺点。每个编码区域都有自己不用的字码长度,不同类型的字符可以由1~6个字节组成。
  UTF-8对单字节范围内的字符仍然用1个字节表示,对汉字采用3个字节表示。
  UTF-8的编码规则:当是1个字节的时候,最高位为0,则表示这是一个ASCII字符,由此可见,所有ASCII编码已经是UTF-8.
  当是1个字节,以11开头,则连续的1的个数暗示这个字符的字节数,如110XXXXX表示它是双字节UTF-8字符的首字节。
  当是1个字节,以10开头,表示它不是首字节。则需要向前查找才能得到它的首字节。
  上述几种编码格式的比较:
  GBK能处理所有的汉字字符,所以将GB2312和GBK进行比较时,应该选择GBK。
  UTF-8与UTF-16都是处理Unicode编码,尽管他们的编码格式不相同,但相对来说,UTF-16的编码效率较高,从字符到字节的转换更简单,进行字符串操作也更好,适合磁盘和内存之间使用,所以Java的内存编码采用UTF-16来编码。但是在网络传输的时候,应使用UTF-8,因为网络传输比较容易损坏字节流,而UTF-8对ASCII字符采用了单字节编码,另外单个字节损坏不会影响到后面的其他字符,在编码效率中介于GBK和UTF-16之间,所以,UTF-8在编码效率和编码安全性方面都做了平衡,是理想的中文编码方式。
  在Java中需要编码的场景:涉及到字符到字节或者字节到字符的转换上。分为下面两类:
  在I/O操作中存在的编码
  在内存操作中的编码
  在Java中编解码,如
  String name = "today 天气真好";
  byte[] iso8859 = name.getBytes("ISO-8859-1");
  byte[] gb2312 =name.getBytes("GB2312");
  将字符串按照相应的编码格式进行编码,转换为byte数组。
  String。getBytes(charsetName)编码过程:根据charsetName找到Charset类,然后根据这个字符集编码生成CharserEncoder,这个类是所有字符编码的父类,针对不同的字符编码集在其子类中定义了如何实现编码,有了CharserEncode对象后就可以条用encode方法实现编码了。
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号