Java中文编码小结

1. 只有 字符到字节 或者 字节到字符 的转换才存在编码转码;

2. Java String 采用 UTF-16 编码方式存储所有字符。unicode体系采用唯一的码点表示唯一的字符信息, 码点的存储方式有UFT-16、UTF-8 等等。:  A String represents a string in the UTF-16 format in which supplementary characters are represented bysurrogate pairs (see the section Unicode Character Representations in the Character class for more information). Index values refer to char code units, so a supplementary character uses two positions in a String.  The String class provides methods for dealing with Unicode code points (i.e., characters), in addition to those for dealing with Unicode code units (i.e., char values).

3. String只有一种格式,可认为String是独立于编码系统的,通过  getBytes(String charsetName) 可实现编码转换。

4. String对象是内存数据,string之间不存在编码变换问题。

5. 编码转换场景主要在 I/O , I/O 包括磁盘 I/O 和网络 I/O:文件输入输出、屏幕、数据库、浏览器、服务器。

6. 在内存中倒腾String数据是编码无关的,比如压缩编码。

7. 编码误区: new String(str.getBytes("ISO-8859-1"), "GB18030") 这种用法是无意义的,甚至是错误的。这种用法是用GB18030编码将ISO-8859-1编码格式的字节数据强制转换成unicode码点,不乱码是运气!

9. 数据库JDBC能够处理 数据库数据 <=> String 的正确互换。

9. OutputStreamWriter 和 InputStreamWriter 应该指定编码格式,避免程序依赖操作系统默认编码。

10. 用户从浏览器端发起一个 HTTP 请求,需要存在编码的地方是 URL、Cookie、Parameter。服务器端接受到 HTTP 请求后要解析 HTTP 协议,其中 URI、Cookie 和 POST 表单参数需要解码,服务器端可能还需要读取数据库中的数据,本地或网络中其它地方的文本文件,这些数据都可能存在编码问题,当 Servlet 处理完所有请求的数据后,需要将这些数据再编码通过 Socket 发送到用户请求的浏览器里,再经过浏览器解码成为文本。

11. tomcat: URL 的 URI 部分进行解码的字符集是在 connector 的 <Connector URIEncoding=”UTF-8”/>

12. QueryString(GET 查询参数) 的解码字符集要么是 Header 中 ContentType 中定义的 Charset 要么就是默认的 ISO-8859-1,要使用 ContentType 中定义的编码就要设置 connector 的 <Connector URIEncoding=”UTF-8” useBodyEncodingForURI=”true”/> 中的 useBodyEncodingForURI 设置为 true。

13. 不要在 Header 中传递非 ASCII 字符,如果一定要传递的话,我们可以先将这些字符用 org.apache.catalina.util.URLEncoder 编码然后再添加到 Header 中,这样在浏览器到服务器的传递过程中就不会丢失信息了,如果我们要访问这些项时再按照相应的字符集解码就好了。

14. POST 表单的编解码: 通过 HTTP 的 BODY 传递到服务端的。当我们在页面上点击 submit 按钮时浏览器首先将根据 ContentType 的 Charset 编码格式对表单填的参数进行编码然后提交到服务器端,在服务器端同样也是用 ContentType 中字符集进行解码。所以通过 POST 表单提交的参数一般不会出现问题,而且这个字符集编码是我们自己设置的,可以通过 request.setCharacterEncoding(charset) 来设置。

15. HTTP BODY 的编解码: 当用户请求的资源已经成功获取后,这些内容将通过 Response 返回给客户端浏览器,这个过程先要经过编码再到浏览器进行解码。这个过程的编解码字符集可以通过 response.setCharacterEncoding 来设置,它将会覆盖 request.getCharacterEncoding 的值,并且通过 Header 的 Content-Type 返回客户端,浏览器接受到返回的 socket 流时将通过 Content-Type 的 charset 来解码,如果返回的 HTTP Header 中 Content-Type 没有设置 charset,那么浏览器将根据 Html 的 <meta HTTP-equiv="Content-Type" content="text/html; charset=GBK" /> 中的 charset 来解码。如果也没有定义的话,那么浏览器将使用默认的编码来解码。<%@ page contentType="text/html; charset= GBK" %>。该设置和response.setCharacterEncoding("GBK")等效。

示例代码

/*** @author zhenjing* * @date 2013-9-7*/
public class cnCodeTest {public static void toHex(char[] b) {for (int i = 0; i < b.length; i++) {System.out.printf("%x " , (int)b[i]);}System.out.println();}public static void toHex(byte[] b) {for (int i = 0; i < b.length; i++) {System.out.printf("%x " , b[i]);}System.out.println();}public static void encode() {String name = "I am 中文编码";toHex(name.toCharArray());try {byte[] iso8859 = name.getBytes("ISO-8859-1");toHex(iso8859);byte[] gb2312 = name.getBytes("GB2312");toHex(gb2312);byte[] gbk = name.getBytes("GBK");toHex(gbk);byte[] utf16 = name.getBytes("UTF-16");toHex(utf16);byte[] utf8 = name.getBytes("UTF-8");toHex(utf8);} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {String cn = "中文编码";  // 这里存在编码转换: 将文件存储字节转成unicode存入String对象内存. 采用文件编码char[] charArray = cn.toCharArray();byte[] data = cn.getBytes();System.out.println("print char array : " + cn);toHex(cn.toCharArray());cn = "���ı���"; // 这里存在编码转换: 将文件存储字节转成unicode存入String对象内存. 采用文件编码。 // 显示乱码是由于文件采用的编码无法解码文件存储字节数据。故存到String的unicode也是乱码的charArray = cn.toCharArray();System.out.println("print char array: " + cn);toHex(cn.toCharArray());encode();}
}

参考文章

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

JAVA字符编码系列三:Java应用中的编码问题

转载于:https://www.cnblogs.com/zhenjing/p/java_code.html

Java中文编码小结相关推荐

  1. java 中文编码乱码_Java编码问题复习

    java 中文编码乱码 我最近购买了Anghel Leonard的Java Coding Problems,因为本书中涉及的主题使我成为一名Java培训师很感兴趣. 在这里看到目录后,我决定购买它. ...

  2. java开发小结:(2006.10.12-future)

    java开发小结:(2006.10.12-future) ================================================ log.debug(StringUtils. ...

  3. 深入Java中文编码乱码问题及最优解决方法

    说明:原创作者联系地址为:josserchai@yahoo.com . 由于Java编程中的中文问题是一个老生常谈的问题,在阅读了许多关于Java中文问题解决方法之后,结合作者的编程实践,我发现过去谈 ...

  4. Java创建对象小结

    Java SE中必可避免的会学到new关键字(用以创建对象),之后又了解到了克隆以及反射都可以创建对象..今天又学到了静态工厂以及构建器,所以呢,在此做一个小结. 下面我先以创建对象的几种方式开始讲起 ...

  5. zk java数据交互 实例_zookeeper与java交互小结实现示例

    对于学习java的小伙伴们来说,zookeeper一定是不陌生的,你们知道要如何在java中与zookeeper交互小结吗?这次小编就通过一个示例来带大家了解一下吧.import org.apache ...

  6. JAVA捕获异常小结

    上一节的小结: 1.已检查异常一定要处理,即除了RunTimeExceoption之外的异常子类. 2.一种消极的方法是一直向上抛出异常,不在函数本阶段处理,throws给主函数给JVM. 3.一种积 ...

  7. Java阶段小结_1

    Java学习阶段小结_1 1.了解Java 1:为什么要学习Java 2:Java能干嘛 2.基础 1:标识符与变量 2:数据类型: 3:键盘录入 4:类型转换 5:运算符: 3.程序流程说明 1) ...

  8. jsp 调用java_jsp中调用java代码小结

    原封不动的传送给客户端有两个小例外: 1. 如果想传送 , 由于它跟jsp的特殊符号一致, 所以必须使用转义字符转义, 2. 如果想传送注释, 在 jsp 编辑页面中出现, 而在生成的html文档不出 ...

  9. Java竞赛目的_ACM竞赛 Java编程小结

    1.字符串的长度 String str = new String(" abcd");int length = str.length(); 2.数组的长度.排序 2.1对于 a[][ ...

最新文章

  1. 影像组学视频学习笔记(27)-SimpleITK包介绍、Li‘s have a solution and plan.
  2. 2021清北毕业生去向关键词:进体制、搞教育、国内深造
  3. linux 后台任务 运行 关闭 查看
  4. Hibernate中自动生成数据库表的两种方式
  5. 【数学与算法】【分段三次Hermite插值】和【分段三次样条插值】
  6. servlet和servlet-mapping的作用------转载于《简书》作者:简单的书写点
  7. Spring JdbcTemplate查询实例
  8. MySQL的事务与事务隔离
  9. title与h1标签的区别和联系
  10. 广度优先遍历类似于二叉树的_二叉树的各种遍历方法的简单解释
  11. 佛系程序员:什么bug不bug的,随缘吧
  12. Destroy与DestroyImmediate以及引发的bug
  13. The eighteen day
  14. 白话空间统计三十:地统计学(1)起源
  15. htlm5实习报告_Wa zhu ti网站html5搭建设计毕业论文+html源码+实习报告+答辩问题
  16. 学习笔记之极客时间《Java 核心技术面试精讲》
  17. 6款沙发背景墙装饰画 总有一幅你喜欢的
  18. quartz定时器简单使用
  19. 【生产力++】脚本自动化提取待复习内容 极大提高复习效率(下)
  20. RTX2060 Super和RTX2060 哪个好

热门文章

  1. vs2013常用快捷键
  2. 【XXX贷】2014年10月XX日发标预告
  3. MySQL-MMM实现MySQL高可用
  4. RHEL6.4换CentOS源
  5. Windows性能调优: Perfomn.exe 和Perfmon /res
  6. es6 Module语法
  7. Five Hundred Miles——The Innocence Mission
  8. 洛谷P1032 字串变换
  9. 最最基本的Git入门 -- 本地仓库操作
  10. Atitit.jpg png格式差别以及解决jpg图片不显示的问题