资源描述
字符编码
机器语言
机器语言是指一台计算机全部的指令集合
电子计算机所使用的是由"0"和"1"组成的二进制数,二进制是计算机的语言的基础。计算机发明之初,人们只能降贵纡尊,用计算机的语言去命令计算机干这干那,一句话,就是写出一串串由"0"和"1"组成的指令序列交由计算机执行,这种计算机能够认识的语言,就是机器语言。使用机器语言是十分痛苦的,特别是在程序有错需要修改时,更是如此。
因此程序就是一个个的二进制文件。一条机器语言成为一条指令。指令是不可分割的最小功能单元。而且,由于每台计算机的指令系统往往各不相同,所以,在一台计算机上执行的程序,要想在另一台计算机上执行,必须另编程序,造成了重复工作。但由于使用的是针对特定型号计算机的语言,故而运算效率是所有语言中最高的。机器语言,是第一代计算机语言。
汇编语言
为了减轻使用机器语言编程的痛苦,人们进行了一种有益的改进:用一些简洁的英文字母、符号串来替代一个特定的指令的二进制串,比如,用"ADD"代表加法,"MOV"代表数据传递等等,这样一来,人们很容易读懂并理解程序在干什么,纠错及维护都变得方便了,这种程序设计语言就称为汇编语言,即第二代计算机语言。然而计算机是不认识这些符号的,这就需要一个专门的程序,专门负责将这些符号翻译成二进制数的机器语言,这种翻译程序被称为汇编程序。
汇编语言同样十分依赖于机器硬件,移植性不好,但效率仍十分高,针对计算机特定硬件而编制的汇编语言程序,能准确发挥计算机硬件的功能和特长,程序精炼而质量高,所以至今仍是一种常用而强有力的软件开发工具。
高级语言
从最初与计算机交流的痛苦经历中,人们意识到,应该设计一种这样的语言,这种语言接近于数学语言或人的自然语言,同时又不依赖于计算机硬件,编出的程序能在所有机器上通用。经过努力,1954年,第一个完全脱离机器硬件的高级语言--FORTRAN问世了,40 多年来,共有几百种高级语言出现,有重要意义的有几十种,影响较大、使用较普遍的有FORTRAN、ALGOL、COBOL、BASIC、LISP、SNOBOL、PL/1、Pascal、C、PROLOG、Ada、C++、VC、VB、Delphi、JAVA等。
ASCII与二进制
英文字母和其它字符按一定的规则用二进制编码后在计算机上使用。目前在微型计算机中普通采用的编码是ASCII码。ASCII的机器内码为每个字符占8个二进制位,其中最高位用作奇偶校验,剩下7位用于编码,如b表示为1100010,这8个二进制位合叫一个字节。 即8个二进制表示一个ASCII码,一个ASCII码就是代表一个字节。
特点:
主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统ASCII码
包含内容:
ASCII码共能表示128个字符,其中包括数字字符(0~9)、大小写英文字母、西文符号、
回车键、退格、换行键等。
附图:7位ASCII编码表
ISO-8859-1
ASCII码是针对英语设计的,当处理带有音调标号(形如汉语的拼音)的欧洲文字时就会出现问题。为了表示更多的欧洲常用字符,原ASCII码最高位用来参与表示字符。这样ASCII码就能表示256个字符。多出的128个字符用来表示表格符号、计算符号、希腊字母和特殊的拉丁符号。即ISO-8859-1是ASCII码的扩展
UNICODE
对所有语言的文字进行了统一编码,对每一个字符都用2个字节来表示,对于单字节字符如英文字符采取前面加“0”字节的策略实现等长兼容。
例: “a” 的ASCII码为0x61,UNICODE就为0x00,0x61。
1.名称的由来
Unicode 字符集编码是Universal Multiple-Octet Coded Character Set 通用多八位编码字符集的简称,是由一个名为 Unicode 学术学会(Unicode Consortium)的机构制订的字符编码系统,支持现今世界各种不同语言的书面文本的交换、处理及显示。该编码于1990年开始研发,1994年正式 公布,最新版本是2005年3月31日的Unicode 4.1.0。
2.特征
Unicode是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
UTF-8
UTF-8是Unicode的其中一个使用方式。 UTF是 Unicode Translation Format,即把Unicode转做某种格式的意思。 Unicode还有其它一些使用方式,如UTF-16、UTF-32等。
背景:
由于Unicode编码采用双字节存储,因而对于英文等存储空间浪费较大,在这种情况下变长字节存储成为需要,于是UTF系列编码出现。
特点:
UTF-8便于不同的计算机之间使用网络传输不同语言和编码的文字,使得双字节的
Unicode能够在现存的处理单字节的系统上正确传输。
字节存储:
UTF-8使用可变长度字节来储存 Unicode字符,例如ASCII字母继续使用1字节储存,重
音文字、希腊字母或西里尔字母等使用2字节来储存,而常用的汉字就要使用3字节。辅助
平面字符则使用4字节。
GB2312
GB2312又称为GB2312-80字符集,全称为《信息交换用汉字编码字符集·基本集》,由原中国国家标准总局发布,1981年5月1日实施。
特点 :
GB2312是中国国家标准的简体中文字符集。它所收录的汉字已经覆盖99.75%的使用频率,基本满足了汉字的计算机处理需要。在中国大陆和新加坡获广泛使用。
包含内容 :
收录简化汉字及一般符号、序号、数字、拉丁字母、日文假名、希腊字母、俄文字母、汉语拼音符号、汉语注音字母,共 7445 个图形字符。其中包括6763个汉字,其中一级汉字3755个,二级汉字3008个;包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在 内的682个全角字符。
GBK
为了对更多的字符进行编码,国家又发布了新的编码系统GBK(GBK的K是“扩展”的汉语拼音第一个字母)。在新的编码系统里,除了完全兼容GB2312 外,还对繁体中文、一些不常用的汉字和许多符号进行了编码。
IE字符编码的设置
1、 编码强制转换
在某个URL访问时,按下图操作可以改变当前URL显示的编码
2、 默认IE编码
IE默认编码是根据网页源代码中指定的编码进行判断的,无法修改!
<%@ page contentType="text/html; charset=gb2312或其它"%>
编码转换
ü GBK可以顺利转换为UTF-8。
ü UTF-8转码为GBK时可能会引起数据丢失。因为UTF-8有些数据采用3或4个字节存
储,而GBK只采用2字节存储。
因此:所以多字节向小字节转换引起一些字节数据丢失!
ü 编码之间转换处理(国际化IN8)
例String result;
1、 result = new String(result.getBytes())
使用平台默认字符集将 String串解码为字节序列,并将结果存储到一个新的字节数组中。
最后再将字节数组解码转成String串,此String串的编码即为当前平台编码!
假如当前平台默认编码为ISO-8859-1,即result串最后编码为当前平台编码
2、 result = new String (result.getBytes(String charsetName))
使用指定的字符集将 String 串解码为字节序列,并将结果存储到一个新的字节数组中。
最后再将字节数组解码转成String串,此String串的编码即为指定的字符集编码!
假如指定的编码为GBK,即result串最后的解码为GBK编码
3、 result = new String(result .getBytes(String charsetName),String endCharsetName)
即result=new String(byte bytes[],String endCharsetName)
用指定的字符集解码字节数组,然后组成一个String串,最后此String串的编码即为指定的字符集编码!
假如result = new String(result .getBytes(“ISO-8859-1”),”GBK”)
表示先将result解码成ISO-8859-1编码的字节数组,然后再解码组成GBK编码的字符串。最后的result串编码是GBK。
常见乱码集锦
编码基础必备
首先最好保证每个工程应用都使用一个编码过滤器。用来设定所有的请求及响应的编码。
采用setCharacterEncoding完成,如果不设置IE请求与响应的编码,则默认使用ISO-8859-1。
同时注意,请求与响应的编码设置最好与页面的charset、pageEncoding编码相同。
页面编码设置
在JSP标准的语法中,如果pageEncoding属性存在,那么JSP页面的字符编码方式就由pageEncoding决定,否则就由contentType属性中的charset决定,如果charset也不存在,JSP页面的字符编码方式就采用默认的ISO-8859-1。
即pageEncoding>charset>ISO-8859-1
编码过滤器
只对post提交方式起作用
编码过滤器分二步进行,首先配置web.xml过滤元素,先后再实现过滤器(必须继承 javax.servlet.Filter接口)。
web.xml配置
<filter>
<filter-name>CharacterEncoding</filter-name>
<filter-class>
com.icitic.lightning.base.webapp.filter.CharsetFilter
</filter-class>
<init-param>
<param-name>Charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
实现过滤器
采用setCharacterEncoding设置编码。
对request 是指提交内容的编码,指定后可以通过getParameter()则直接获得正确的字符串
对response 是指定输出内容的编码,同时,该设置会传递给浏览器,告诉浏览器输出内容
所采用的编码
public class CharsetFilter implements Filter {
private FilterConfig config = null;
private String defaultEncode = "UTF-8";
public void init(FilterConfig arg0) throws ServletException {
//FilterConfig映射到web.xml的的filter配置
this.config = arg0;
//读取web.xml的init-parma配置
if (config.getInitParameter("Charset") != null) {
defaultEncode = config.getInitParameter("Charset");
}
}
public void destroy() {
this.config = null;
}
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException{
HttpServletResponse response = (HttpServletResponse)arg1;
//设置响应数据编码
response.setCharacterEncoding(defaultEncode);
//设置请求数据编码
arg0.setCharacterEncoding(defaultEncode);
//获得请求的URL
StringBuffer url=((HttpServletRequest)arg0).getRequestURL();
//如果请求的URL包含.action、.do、.jsp、.htm则设置缓存等
if (url.indexOf(".action")!=-1 || url.indexOf(".htm")!=-1
|| url.indexOf(".jsp")!=-1 || url.indexOf(".do")!=-1){
//强制缓存从服务器上获取该页面的最新拷贝
response.setHeader("Cache-Control", "no-cache");
//在任何情况下缓存不保存该页面
response.setHeader( "Cache-Control" , "no-store");
//设置页面不缓存数据
response.setDateHeader("Expires", 0);
response.setHeader("Pragma", "no-cache");
}
arg2.doFilter(arg0, arg1);
}//end mothod
}
奇数中文末汉字乱码
现象
当汉字为偶数时不乱码,奇数时最后一个汉字乱码。且不管末汉字是什么字都是同一乱码符。
分析
许多协议使用ISO-8859-1来编码,网页中的数据提交及响应默认也是采用ISO-8859-1编码。
待续。。。。
解决
页面跳转情况
如果是由一个页面直接跳转到另一个页面,如
window.open('<%=request.getContextPath()%>
/ibpmsFlow/flow_chart/flow.jsp?processName='+processName,'','width=1100,height=550,left=0,top=0,location,alwaysRaised,scrollbars=yes,status=yes,resizable');
由页面跳转到页面时默认为get方式提交,或者form提交没有注明提交方式也默认为get 方式。过滤器对get方式无效。get方式则使用IE默认的ISO-8859-1编码。因此页面跳转后还要增加转码语句
String processName = request.getParameter("processName");
//转码语句
processName=newString(processName.getBytes("ISO-8859-1"),"UTF-8");
上面如果出现末汉字乱码,需要在请求的页面处理一下请求的数据。改为
var encodeProcessName = encodeURIComponent(processName);
window.open('<%=request.getContextPath()%>
/ibpmsFlow/flow_chart/flow.jsp?processName='+encodeProcessName,
'','width=1100,height=550,left=0,top=0,location,alwaysRaised,scrollbars=yes,status=yes,resizable');
说明:
encodeURIComponent是javascript自带的方法,将数据作为URL编码。
Action跳转情况
如果页面请求后跳转到一个action后再转到某个页面出现末汉字乱码,处理如下
action类中使用.URLEncoder.encode(String s, String enc) 将s字串编码为URL,
然后在页面request.getParamter得到字串后再用.URLDecoder.decode(String s, String enc) 进行字串URL反编码
1、 如何获取当前字符所属编码
2、 如何获取当前平台编码
展开阅读全文