最近项目中遇到很多与编码有关的问题,补下关于字符集和字符编码的知识
0.字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。
字符集是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,
常见字符集名称:ASCII字符集、GB2312字符集、Unicode字符集、BIG5字符集、 GB 18030字符集等。
计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。
1.ASCII 字符集 (American Standard Code for Information Interchange,美国信息互换标准代码)
特点: 1)主要用于显示现代英语和其他西欧语言;
2)7位(bits)表示一个字符,共128字符
举例: Bin Dec Hex 缩写/字符
01000001 65 41 A
01100001 97 61 a
2.GB2312 字符集 全称为《信息交换用汉字编码字符集·基本集》
特点: 1)GB2312是中国国家标准的简体中文字符集。它所收录的汉字已经覆盖99.75%的使用频率
2)分区表示、双字节表示
举例:
“高位字节”使用了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使用了0xA1-0xFE(把01-94加上0xA0)。
汉字 “啊”,它的区号16,位号01,则区位码是1601
计算公式是:0xB0=0xA0+16, 0xA1=0xA0+1,汉字处理编码结果为0xB0A1。
3.Unicode字符集(Universal Multiple-Octet Coded Character Set 通用多八位编码字符集)
特点: 1)Unicode是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码;
2)Unicode 标准始终使用十六进制数字;
3)UTF-8是Unicode的其中一个使用方式。 UTF是 Unicode Translation Format,即把Unicode转做某种格式的意思。
UTF-8的特点是对不同范围的字符使用不同长度的编码。
举例:“汉”字的Unicode编码是0x6C49,0x6C49在0x0800-0xFFFF之间,使用用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。
--------------------------------------------------------------------------------
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
tar[i] = (byte)(src[i]&0xFF);
ByteToCharConverter toChar = ByteToCharConverter.getConverter("gb2312");
return new String(toChar.convertAll(tar));
}
阅读(1781) | 评论(0) | 转发(0) |