Java中文编码小结

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

2. Java String 采用 UTF-16 编码方式存储所有字符。unicode体系采用唯一的码点表示唯一的字符信息, 码点的存储方式有UFT-16、UTF-8 等等。:  AStringrepresents a string in the UTF-16 format in whichsupplementary charactersare represented bysurrogate pairs(see the sectionUnicode Character Representationsin theCharacterclass for more information). Index values refer tocharcode units, so a supplementary character uses two positions in aString.  TheStringclass provides methods for dealing with Unicode code points (i.e., characters), in addition to those for dealing with Unicode code units (i.e.,charvalues).

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 的

12. QueryString(GET 查询参数) 的解码字符集要么是 Header 中 ContentType 中定义的 Charset 要么就是默认的 ISO-8859-1,要使用 ContentType 中定义的编码就要设置 connector 的 中的 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 的 中的 charset 来解码。如果也没有定义的话,那么浏览器将使用默认的编码来解码。。该设置和response.setCharacterEncoding("GBK")等效。

示例代码

/***@authorzhenjing

*

* @date 2013-9-7*/

public classcnCodeTest {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 voidencode() {

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 voidmain(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中文编码小结相关推荐

  1. 汉字的编码与字模点阵小结

    汉字的编码与字模点阵小结 作者: laomai url:  http://blog.csdn.net/laomai 转载时请注明出处 一.引言 今天是三八节,为了祝一个mm节日快乐, 自己动手写了一个 ...

  2. java 内部编码_Java 中文编码分析

    一.charAt 与 codePonitAt 我们知道 Java 内部使用的是 utf-16 作为它的 char.String 的字符编码方式,这里我们叫它内部字符集.而 utf-16 是变长编码,一 ...

  3. java菱形乱码 编码_JAVA:编码与乱码问题

    一.为什么要编码? 由于人类的语言太多,因而表示这些语言的符号太多,无法用计算机的一个基本的存储单元----byte来表示,因而必须要经过拆分或一些翻译工作,才能让计算机能理解. byte一个字节即8 ...

  4. java获取文件编码_java如何获取文件编码格式

    1:简单判断是UTF-8或不是UTF-8,因为一般除了UTF-8之外就是GBK,所以就设置默认为GBK. 按照给定的字符集存储文件时,在文件的最开头的三个字节中就有可能存储着编码信息,所以,基本的原理 ...

  5. java 汉字拼音排序_Java汉字排序(2)按拼音排序

    1.前言 对于包含汉字的字符串来说,排序的方式主要有两种: 一种是拼音,一种是笔画. 本文就讲述如何实现按拼音排序的比较器(Comparator). 作者:Jeff 发表于:2007年12月21日 1 ...

  6. java jdbc url编码_java中jdbc/sql出现编码问题

    com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Unknown column '???è??é"?è??' in 'field li ...

  7. java httpurlconnection 设置编码_java – 通过HttpURLConnection发送UTF-8字符失败

    我现在已经花了一半星期天,我现在需要帮助: 我想使用Java HttpURLConnection将包含特殊字符UTF-8编码的字符串发送到服务器.字符的正确编码失败. 例: strToSend: ä ...

  8. java设置语言编码_Java多语言编码问题解析

    1.Java编译器在对源文件编译前,会先把源文件转换为unicode编码,因为这个原因,我们在编译时一定要把源文件用的是什么编码方式正确无误的"告诉"编译器. 例如:我们的源文件是 ...

  9. java取出unicode编码_Java获取字符的Unicode编码以及如何过滤特殊字符ZWNJ

    获取Unicode编码 package com.xs.test; public class Test { public static void main(String[] args) throws E ...

  10. java 二进制 base64编码_java 按字节读写二进制文件(Base64编码解码)

    最近在做项目时遇到这样一个需求:依次读取本地文件夹里所有文件的内容,转为JSON,发送到ActiveMQ的消息队列, 然后从MQ的消息队列上获取文件的信息,依次写到本地.常见的文件类型,比如.txt ...

最新文章

  1. 详解Asp.net MVC DropDownLists
  2. 在SAP BW中使用ABAP
  3. swift_026(Swift 的类型转换)
  4. java 图片分段上传_java文件分片上传,断点续传
  5. Linux学习资料-万用字符与特殊符号
  6. Android SDK Manager 在win8.1上的闪退问题【转载】
  7. 分类器构筑_为组织构筑基于区块链的未来做准备
  8. Qt保留小数点后两位
  9. Win Phone 8 Emulator启动错误:提示无法创建虚拟机,Xde找不到主机的IPv4地址
  10. Spring Data REST PATCH请求远程代码执行漏洞(CVE-2017-8046) 本地复现方法
  11. java 经纬度 地图_基于JAVA的地图经纬度坐标查询api调用代码实例
  12. html设置字体 圆体,css font-family字体大合集
  13. 关于在Google Earth中动态加载地标问题
  14. Aho-Corasick算法学习
  15. IDEA TOP TIPS
  16. matlab 贪吃的蛇,贪吃的蛇教案
  17. Xshell暴漏内网端口
  18. 一个由服务器时区引发的Bug
  19. vulnhub靶场——THE PLANETS:EARTH
  20. 从人工智能到物联网……这些公司如何改变农业与食品工业

热门文章

  1. Windows 10 Install SQL Server 2005
  2. 主题抽取的核心——主题词表
  3. Linux中root安装microsoft R open(MRO),普通用户如何使用?
  4. node.js安装详细教程
  5. VS2010格式化快捷键
  6. QQ配置文件解密(转)
  7. 李华锦叔叔:追女生该如何正确的花钱?
  8. 【三石jQuery视频教程】02.创建 FontAwesome 复选框和单选框
  9. unity SDK/NDK的下载
  10. java冒险岛_JAVA开发类似冒险岛的游戏Part1