Chinaunix首页 | 论坛 | 博客
  • 博客访问: 423439
  • 博文数量: 79
  • 博客积分: 2886
  • 博客等级: 少校
  • 技术积分: 968
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-16 10:33
文章分类

全部博文(79)

文章存档

2013年(7)

2012年(17)

2011年(28)

2010年(25)

2009年(1)

2008年(1)

我的朋友

分类: Java

2010-09-10 18:01:19

最近项目中遇到很多与编码有关的问题,补下关于字符集和字符编码的知识

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));
}
阅读(1768) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~