文章的内容是我通过看其他文章后摘抄和总结的,如有雷同,一定是抄的。
1 编码简介
1.1 ASCII/ISO-8859-1/Latin_1
单字节编码,可以表示256个不同的字符(英文字符、标点符号等)。
1.2 GB2312/GBK
双字节编码(不定长,英文时只用一个字节),兼容ISO-8859-1编码,即当其为ISO-8859-1时,只需用一个字节来表示,并且其值完全一样。GB2312只能表示简体字,GBK可以同时表示繁体字和简体字,并且兼容GB2312。
1.3 Unicode
定长双字节编码,不兼容任何编码,但可通过转换,表示任何编码。Java内部使用Unicode来进行操作。不过Unicode容易占用更多的空间,因为对于英文字母,Unicode也需要两个字节来表示。
1.4 UTF(UCS Transformation Format)
不定长编码,每一个字符的长度从1-6个字节不等,一般来讲,英文字母都是用一个字节表示,而汉字使用三个字节。其实UTF就是Unicode编码的传输和存储的格式。
2 Java对字符的处理
2.1 getBytes(charset)
将字符串所表示的字符按照charset编码,并以字节方式表示。注意字符串在java内存中总是按unicode编码存储的。比如"中文",存储为"4e2d 6587",如果charset为"gbk",则被编码为"d6d0 cec4",然后返回字节"d6 d0 ce c4"。如果charset为"utf8"则最后是"e4 b8 ad e6 96 87"。如果是"iso8859-1",则由于无法编码,最后返回 "3f 3f"(两个问号)。(应先考虑字符串所表示的字符编码,然后确定需转换的编码与现在字符串的编码是否兼容)
2.2 new String(charset)
将字节数组按照charset编码进行组合识别,最后转换为unicode存储。就是按照不同的编码,取不同的字节数,然后转换成unicode。
3 Java中各类型操作的字符处理
3.1 各类型处理
3.2 文件读写
外部数据如文件经过读写和转换两个步骤,转为jvm所使用字符。
1. InputStream/OutputStream用于读写原始外部数据,Reader/Writer执行读写和转换两个步骤,处理汉字不合适,应该首选使用Reader/Writer。
2. FileReader/FileWriter使用JVM当前编码读写文件.如果有其它编码格式,使用InputStreamReader/OutputStreamWriter
3. PrintStream有点特殊,它自动使用jvm缺省编码进行转换。
3.3 读取.properties文件
.propeties文件由Properties类以iso8859-1编码读取,因此不能在其中直接写汉字。
1. 使用JDK 的native2ascii工具转换汉字为\uXXXX格式。命令行:native2ascii –encoding GBK inputfile outputfile
2. 对读入的字符串进行转换:byte[] b = str.getBytest(“ISO-8859-1”); str = new String(b,”GBK”);
3.4 读取XML文件
XML文件读写同于文件读写,但应注意确保XML头中声明如<? xml version=”1.0” encoding=”gb2312”?>与文件编码保持一致。
3.5 WEB/Servlet/JSP
1. 对于JSP,确定头部加上 <%@ page contentType="text/html;charset=gbk"%>这样的标签。
2. 对于Servlet,确定 设置setContentType (“text/html; charset=gbk”),以上两条用于使得输出汉字没有问题。
3. 为输出HTML head中加一个 <meta http-equiv="Content-Type" content="text/html; charset=gbk"> ,让浏览器正确确定HTML编码。
4. 为Web应用加一个Filter,确保每个Request明确调用setCharacterEncoding方法,让输入汉字能够正确解析。