编码 web
在JSP页面获取表单的值时会出现乱码,有两种解决方法:
1.在调用getParameter之前通过request.setCharacterEncoding设置字符编码
2.调用new String(str.getBytes("iso8859-1"), "UTF-8");编码后解码
0.字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。
码指的是二进制 编码方法,或称码制
解码:字符集<---字符编码----字符<--------字节<-------位
字符集是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,
常见字符集名称:ASCII字符集、GB2312字符集、Unicode字符集、BIG5字符集、 GB 18030字符集等。
计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。
最早的编码是iso8859-1,和ascii编码相似。但为了方便表示各种各样的语言,逐渐出现了很多标准编码,重要的有如下几个。
规律:
utf-8编码可以用gbk和iso8859-1解码后编回去
gbk编码后只能用iso8859-1解码后编回去
1.首先确定工程以及其中文件的编码:
工程编码:
在MyEclipse的属性里,有几个地方可以改编码设置:
更改工作空间编码:window-->preference-->general-->worspace
更改特定类型文件编码:window-->preference-->general-->content type
MyEclipse-->window-->perferences--->myeclipse--->Files and Editor -->JSP--->Encoding
2.设定jsp页面的编码
<%@page pageEncoding="gb2312" contentType="text/html; charset=utf-8"%>
contentType的charset是指服务器发送给客户端时的内容编码
pageEncoding是jsp文件本身的编码
JSP要经过两次的“编码”,第一阶段会用pageEncoding,第二阶段会用utf-8至utf-8,第三阶段就是由Tomcat出来的网页, 用的是contentType。
第一阶段是jsp编译成.java,它会根据pageEncoding的设定读取jsp,结果是由指定的编码方案翻译成统一的UTF-8 JAVA源码(即.java),如果pageEncoding设定错了,或没有设
定,出来的就是中文乱码。
第二阶段是由JAVAC的JAVA源码至java byteCode的编译,不论JSP编写时候用的是什么编码方案,经过这个阶段的结果全部是UTF-8的encoding的java源码。
JAVAC用UTF-8的encoding读取java源码,编译成UTF-8 encoding的二进制码(即.class),这是JVM对常数字串在二进制码(java encoding)内表达的规范。
第三阶段是Tomcat(或其的application container)载入和执行阶段二的来的JAVA二进制码,输出的结果,也就是在客户端见到的,这时隐藏在阶段一和阶段二的参数
contentType就发挥了功效
Tomcat默认使用ISO-8859-1方式去读取
--------------------------------------------------------------------------------
3.servlet中设置输出页面的编码格式:
response.setContentType("text/xml");
response.setCharacterEncoding("gb2312");
4.数据库的编码
(1) 数据库使用UTF-16
如果String中是UNICODE字符,写入读出时不需要转码
(2) 数据库使用ISO8859_1
如果String中是UNICODE字符,写入读出时需要转码
写入:String newStr = new String(oldStr.getByte(“GB2312”), “ISO8859_1”);
5.资源文件的编码方式和编辑平台相关。
WINDOWS平台下编写的资源文件,以GB2312方式编码。在编译时需要转码,以确保在各个平台上的正确性;
public String Asc2CNStringLang(String s)
{
char[] src = s.toCharArray();
byte[] tar = new byte[src.length];
for (int i=0;i<src.length;i++)< span="">
tar[i] = (byte)(src[i]&0xFF);
ByteToCharConverter toChar = ByteToCharConverter.getConverter("gb2312");
return new String(toChar.convertAll(tar));
}