- 浏览: 156272 次
- 性别:
- 来自: 徐州
文章分类
- 全部博客 (94)
- 电脑小技巧 (6)
- 工具 (5)
- html javascript ajax (14)
- 面试题目 (1)
- 数据库 (13)
- linux (3)
- java (21)
- spring 中的bean 大小写 (1)
- lucene compass (1)
- windows7安装 (2)
- 使用WinPE安装Windows 7 (1)
- delphi (1)
- spring3 mvc ,aop ,spring security (0)
- spring3 mvc (3)
- aop (3)
- spring security (2)
- InetAddress (1)
- ipv6 (1)
- video 视频 (0)
- 地址 (1)
- collabnet (1)
- spring (1)
- phonegap (1)
- JRebel (1)
- ionic (1)
- scriptx (1)
- flex (1)
最新评论
-
snihcel:
expression="execution(* or ...
spring3 mvc 添加aop支持(Spring MVC 注解下Controller 的AOP) -
xuxiangpan888:
weaponhuang 写道确定AOP能对conttoler进 ...
spring3 mvc 添加aop支持(Spring MVC 注解下Controller 的AOP) -
weaponhuang:
确定AOP能对conttoler进行拦截????这个我搞了好几 ...
spring3 mvc 添加aop支持(Spring MVC 注解下Controller 的AOP) -
huangyunbin:
你在你的项目中试验过吗?我在我的项目中试了下,不行啊。然后我是 ...
spring3 mvc 添加aop支持(Spring MVC 注解下Controller 的AOP) -
梅花簪:
方法斯蒂芬
spring3 mvc 添加aop支持(Spring MVC 注解下Controller 的AOP)
Java中的ASCII,Unicode和UTF-8字符编码2008年08月14日 星期四 15:09首先讲一下几种字符的编码方式:
1. ASCII码
我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。
上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。
ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。
2、非ASCII编码
英语用128个符号编码就够了,但是用来表示其他语言,128个符号是不够的。比如,在法语中,字母上方有注音符号,它就无法用ASCII码表示。于是,一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号。比如,法语中的é的编码为130(二进制10000010)。这样一来,这些欧洲国家使用的编码体系,可以表示最多256个符号。
但是,这里又出现了新的问题。不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。比如,130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel (ג),在俄语编码中又会代表另一个符号。但是不管怎样,所有这些编码方式中,0—127表示的符号是一样的,不一样的只是128—255的这一段。
至于亚洲国家的文字,使用的符号就更多了,汉字就多达10万左右。一个字节只能表示256种符号,肯定是不够的,就必须使用多个字节表达一个符号。比如,简体中文常见的编码方式是GB2312,使用两个字节表示一个汉字,所以理论上最多可以表示256x256=65536个符号。
中文编码的问题需要专文讨论,这篇笔记不涉及。这里只指出,虽然都是用多个字节表示一个符号,但是GB类的汉字编码与后文的Unicode和UTF-8是毫无关系的。
3.Unicode
正如上一节所说,世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。为什么电子邮件常常出现乱码?就是因为发信人和收信人使用的编码方式不一样。
可以想象,如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是Unicode,就像它的名字都表示的,这是一种所有符号的编码。
Unicode当然是一个很大的集合,现在的规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,U+4E25表示汉字“严”。具体的符号对应表,可以查询unicode.org,或者专门的汉字对应表。
4. Unicode的问题
需要注意的是,Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
比如,汉字“严”的unicode是十六进制数4E25,转换成二进制数足足有15位(100111000100101),也就是说这个符号的表示至少需要2个字节。表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多。
这里就有两个严重的问题,第一个问题是,如何才能区别unicode和ascii?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。
它们造成的结果是:1)出现了unicode的多种存储方式,也就是说有许多种不同的二进制格式,可以用来表示unicode。2)unicode在很长一段时间内无法推广,直到互联网的出现。
5.UTF-8
互联网的普及,强烈要求出现一种统一的编码方式。UTF-8就是在互联网上使用最广的一种unicode的实现方式。其他实现方式还包括UTF-16和UTF-32,不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8是Unicode的实现方式之一。
UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
UTF-8的编码规则很简单,只有二条:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
下表总结了编码规则,字母x表示可用编码的位。
Unicode符号范围 | UTF-8编码方式
UTF字节数 (十六进制) | (二进制)
--------------------+---------------------------------------------
一个字节 0000 0000-0000 007F | 0xxxxxxx
两个字节 0000 0080-0000 07FF | 110xxxxx 10xxxxxx
三个字节 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
四个字节 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
下面, 还是以汉字“严”为例,演示如何实现UTF-8编码。
已知“严”的unicode是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800-0000 FFFF),因此“严”的UTF-8编码需要三个字节,即格式是“1110xxxx 10xxxxxx 10xxxxxx”。然后,从“严”的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,“严”的UTF-8编码是“11100100 10111000 10100101”,转换成十六进制就是E4B8A5。
6. Unicode与UTF-8之间的转换
通过上一节的例子,可以看到“严”的Unicode码是4E25,UTF-8编码是E4B8A5,两者是不一样的。它们之间的转换可以通过程序实现。
在Windows平台下,有一个最简单的转化方法,就是使用内置的记事本小程序Notepad.exe。打开文件后,点击“文件”菜单中的“另存为”命令,会跳出一个对话框,在最底部有一个“编码”的下拉条。
7. iso8859-1编码
属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。比如,字母a的编码为0×61=97.很明显,iso8859-1编码表示的字符范围很窄,无法表示中文字符。但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用iso8859-1编码来表示。而且在很多协议上,默认使用该编码。比如,虽然"中文"两个字不存在iso8859-1编码,以gb2312编码为例,应该是"d6d0 cec4"两个字符,使用iso8859-1编码的时候则将它拆开为4个字节来表示:"d6 d0 ce c4"(事实上,在进行存储的时候,也是以字节为单位处理的)。而如果是UTF编码,则是6个字节"e4 b8 ad e6 96 87".很明显,这种表示方法还需要以另一种编码为基础。
java对字符的处理
在java应用软件中,会有多处涉及到字符集编码,有些地方需要进行正确的设置,有些地方需要进行一定程度的处理。
1. getBytes(charset)
这是java字符串处理的一个标准函数,其作用是将字符串所表示的字符按照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"(两个问号)。
java .class类的编码为:unicode;
windows 默认的编码为:中文:gb2312; 英文:iso8859;
String str = "张三" ;
byte[] jiema= str.getBytes("gb2312") ; //解码
String bianma = new String(jiema,"UTF-8");//编码 如果上面的解码不对 可能出现问题
2. new String(charset)
这是java字符串处理的另一个标准函数,和上一个函数的作用相反,将字节数组按照charset编码进行组合识别,最后转换为unicode存储。参考上述getBytes的例子,"gbk" 和"utf8"都可以得出正确的结果"4e2d 6587",但iso8859-1最后变成了"003f 003f"(两个问号)。
因为utf8可以用来表示/编码所有字符,所以new String( str.getBytes( "utf8" ), "utf8" ) === str,即完全可逆。
3. setCharacterEncoding()
该函数用来设置http请求或者相应的编码。
对于request,是指提交内容的编码,指定后可以通过getParameter()则直接获得正确的字符串,如果不指定,则默认使用iso8859-1编码,需要进一步处理。参见下述"表单输入".值得注意的是在执行setCharacterEncoding()之前,不能执行任何getParameter()。java doc上说明:This method must be called prior to reading request parameters or reading input using getReader()。而且,该指定只对POST方法有效,对GET方法无效。分析原因,应该是在执行第一个getParameter()的时候,java将会按照编码分析所有的提交内容,而后续的getParameter()不再进行分析,所以setCharacterEncoding()无效。而对于GET方法提交表单是,提交的内容在URL中,一开始就已经按照编码分析所有的提交内容,setCharacterEncoding()自然就无效。
对于response,则是指定输出内容的编码,同时,该设置会传递给浏览器,告诉浏览器输出内容所采用的编码。
4. 处理过程
下面分析两个有代表性的例子,说明java对编码有关问题的处理方法。
4.1. 表单输入
User input *(gbk:d6d0 cec4) browser *(gbk:d6d0 cec4) web server iso8859-1(00d6 00d 000ce 00c4) class,需要在class中进行处理:getbytes("iso8859-1")为d6 d0 ce c4,new String("gbk")为d6d0 cec4,内存中以unicode编码则为4e2d 6587.
l 用户输入的编码方式和页面指定的编码有关,也和用户的操作系统有关,所以是不确定的,上例以gbk为例。
l 从browser到web server,可以在表单中指定提交内容时使用的字符集,否则会使用页面指定的编码。而如果在url中直接用?的方式输入参数,则其编码往往是操作系统本身的编码,因为这时和页面无关。上述仍旧以gbk编码为例。
l Web server接收到的是字节流,默认时(getParameter)会以iso8859-1编码处理之,结果是不正确的,所以需要进行处理。但如果预先设置了编码(通过request. setCharacterEncoding ()),则能够直接获取到正确的结果。
l 在页面中指定编码是个好习惯,否则可能失去控制,无法指定正确的编码。
4.2. 文件编译
假设文件是gbk编码保存的,而编译有两种编码选择:gbk或者iso8859-1,前者是中文windows的默认编码,后者是linux的默认编码,当然也可以在编译时指定编码。
Jsp *(gbk:d6d0 cec4) java file *(gbk:d6d0 cec4) compiler read uincode(gbk: 4e2d 6587; iso8859-1: 00d6 00d 000ce 00c4) compiler write utf(gbk: e4b8ad e69687; iso8859-1: *) compiled file unicode(gbk: 4e2d 6587; iso8859-1: 00d6 00d 000ce 00c4) class.所以用gbk编码保存,而用iso8859-1编译的结果是不正确的。
class unicode(4e2d 6587) system.out / jsp.out gbk(d6d0 cec4) os console / browser.
l 文件可以以多种编码方式保存,中文windows下,默认为ansi/gbk.
l 编译器读取文件时,需要得到文件的编码,如果未指定,则使用系统默认编码。一般class文件,是以系统默认编码保存的,所以编译不会出问题,但对于jsp文件,如果在中文windows下编辑保存,而部署在英文linux下运行/编译,则会出现问题。所以需要在jsp文件中用pageEncoding指定编码。
l Java编译的时候会转换成统一的unicode编码处理,最后保存的时候再转换为utf编码。
l 当系统输出字符的时候,会按指定编码输出,对于中文windows下,System.out将使用gbk编码,而对于response(浏览器),则使用jsp文件头指定的contentType,或者可以直接为response指定编码。同时,会告诉browser网页的编码。如果未指定,则会使用iso8859-1编码。对于中文,应该为browser指定输出字符串的编码。
l browser显示网页的时候,首先使用response中指定的编码(jsp文件头指定的contentType最终也反映在response上),如果未指定,则会使用网页中meta项指定中的contentType.
5. 几处设置
对于web应用程序,和编码有关的设置或者函数如下。
5.1. jsp编译
指定文件的存储编码,很明显,该设置应该置于文件的开头。例如:。另外,对于一般class文件,可以在编译的时候指定编码。
5.2. jsp输出
指定文件输出到browser是使用的编码,该设置也应该置于文件的开头。例如:。该设置和response.setCharacterEncoding("GBK")等效。
5.3. meta设置
指定网页使用的编码,该设置对静态网页尤其有作用。因为静态网页无法采用jsp的设置,而且也无法执行response.setCharacterEncoding()。例如:
如果同时采用了jsp输出和meta设置两种编码指定方式,则jsp指定的优先。因为jsp指定的直接体现在response中。
需要注意的是,apache有一个设置可以给无编码指定的网页指定编码,该指定等同于jsp的编码指定方式,所以会覆盖静态网页中的meta指定。所以有人建议关闭该设置。
5.4. form设置
当浏览器提交表单的时候,可以指定相应的编码。例如:。一般不必不使用该设置,浏览器会直接使用网页的编码。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
首先介绍两种字符集 gb2312 和 gbk
。gb2312 简体中文编码
。gbk 中文字符编码 包括繁体中文
1. 指定jsp文件里内容的的编码方式
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
2. 指定html文件里内容的编码方式
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
3. 当响应用户的请求时,输出到用户浏览器上的编码方式
<%@ page contentType="text/html"; charset="gb2312"%>
相当于生成的代码 response.setContentType("text/html; charset=gb2312");
4. 把用户传递过来的参数作为指定的编码
request.setCharacterEncoding("gb2312");
5. 对比
request.setCharacterEncoding("gb2312"); //设置输入编码格式
response.setContentType("text/html; charset=gb2312"); //设置输出编码格式
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
一个关于中文字符转换的程序:
package com.company.util.charset;
import sun.io.CharToByteConverter;
import sun.io.ByteToCharConverter;
import com.company.util.common.Configure;
/**
* 创建日期:(2008-7-6 13:51:16) 解决sybase数据库查询不能显示中文的问题
*
* @author:like_dark
*/
public class UnicodeToAscii
{
/**
* UnicodeToAscii 构造子注解。
*/
public UnicodeToAscii ()
{
super ();
}
/**
* 将Ascii转换成中文字符串
*/
public static String AsciiToChineseString ( String s )
{
if ( s == null )
return s;
char[] orig = s.toCharArray ();
byte[] dest = new byte[ orig.length ];
for ( int i = 0; i < orig.length; i++ )
dest[ i ] = ( byte ) ( orig[ i ] & 0xFF );
try
{
ByteToCharConverter toChar = ByteToCharConverter.getConverter ( "gb2312" );
return new String ( toChar.convertAll ( dest ) );
}
catch ( Exception e )
{
System.out.println ( e );
return s;
}
}
/**
* 将中文字符串转换成Ascii
*/
public static String ChineseStringToAscii ( String s )
{
if ( s == null )
return s;
try
{
CharToByteConverter toByte = CharToByteConverter.getConverter ( "gb2312" );
byte[] orig = toByte.convertAll ( s.toCharArray () );
char[] dest = new char[ orig.length ];
for ( int i = 0; i < orig.length; i++ )
dest[ i ] = ( char ) ( orig[ i ] & 0xFF );
return new String ( dest );
}
catch ( Exception e )
{
System.out.println ( e );
return s;
}
}
/**
* 中文转ascii
*
* @param s
* 要进行转换的字符串
* @param bl
* 是否进行转换,一个开关控制 , true代表需要转换。
* @return 转换后的字符串
*/
public static String ChineseStringToAscii ( String s, boolean bl )
{
if ( !bl )
return s;
else
return ChineseStringToAscii ( s );
}
/**
* ascii转字符串
*
* @param s
* @param bl
* @return
*/
public static String AsciiToChineseString ( String s, boolean bl )
{
if ( !bl )
return s;
else
return AsciiToChineseString ( s );
}
/**
* 根据输入的源串(中文或中西文混合)返回其拼音首字母,以小写返回,如果首字符非拼音字母,则统一返回*号
*
* @param str
* 源串(中文或中西文混合)
* @return 返回str的拼音首字母,以小写返回,如果首字符非拼音字母,则统一返回*号
*/
public static String getFirstCharOfString ( String str )
{
String firstChar = "*";
if ( str == null || str.length () <= 0 )
return firstChar;
try
{
byte firstCharBytes[] = new byte[ 2 ];
int gbcode;
firstCharBytes[ 0 ] = str.getBytes ( "gb2312" )[ 0 ];
gbcode = firstCharBytes[ 0 ] & 0x000000ff;
if ( str.length () > 1 || gbcode >= 0xb0 )
{
firstCharBytes[ 1 ] = str.getBytes ( "gb2312" )[ 1 ];
gbcode = ( firstCharBytes[ 0 ] & 0x000000ff ) * 0x100 + ( firstCharBytes[ 1 ] & 0x000000ff );
}
if ( gbcode >= 0xb0a1 && gbcode <= 0xb0c4 )
firstChar = "a";
else if ( gbcode >= 0xb0c5 && gbcode <= 0xb2c0 )
firstChar = "b";
else if ( gbcode >= 0xb2c1 && gbcode <= 0xb4ed )
firstChar = "c";
else if ( gbcode >= 0xb4ee && gbcode <= 0xb6e9 )
firstChar = "d";
else if ( gbcode >= 0xb6ea && gbcode <= 0xb7a1 )
firstChar = "e";
else if ( gbcode >= 0xb7a2 && gbcode <= 0xb8c0 )
firstChar = "f";
else if ( gbcode >= 0xb8c1 && gbcode <= 0xb9fd )
firstChar = "g";
else if ( gbcode >= 0xb9fe && gbcode <= 0xbbf6 )
firstChar = "h";
else if ( gbcode >= 0xbbf7 && gbcode <= 0xbfa5 )
firstChar = "j";
else if ( gbcode >= 0xbfa6 && gbcode <= 0xc0ab )
firstChar = "k";
else if ( gbcode >= 0xc0ac && gbcode <= 0xc2e7 )
firstChar = "l";
else if ( gbcode >= 0xc2e8 && gbcode <= 0xc4c2 )
firstChar = "m";
else if ( gbcode >= 0xc4c3 && gbcode <= 0xc5b5 )
firstChar = "n";
else if ( gbcode >= 0xc5b6 && gbcode <= 0xc5bd )
firstChar = "o";
else if ( gbcode >= 0xc5be && gbcode <= 0xc6d9 )
firstChar = "p";
else if ( gbcode >= 0xc6da && gbcode <= 0xc8ba )
firstChar = "q";
else if ( gbcode >= 0xc8bb && gbcode <= 0xc8f5 )
firstChar = "r";
else if ( gbcode >= 0xc8f6 && gbcode <= 0xcbf9 )
firstChar = "s";
else if ( gbcode >= 0xcbfa && gbcode <= 0xcdd9 )
firstChar = "t";
else if ( gbcode >= 0xcdda && gbcode <= 0xcef3 )
firstChar = "w";
else if ( gbcode >= 0xcef4 && gbcode <= 0xd1b8 )
firstChar = "x";
else if ( gbcode >= 0xd1b9 && gbcode <= 0xd4d0 )
firstChar = "y";
else if ( gbcode >= 0xd4d1 && gbcode <= 0xd7f9 )
firstChar = "z";
else
gbcode = firstCharBytes[ 0 ];
if ( gbcode >= 'A' && gbcode <= 'Z' )
gbcode += 32;
if ( gbcode >= 'a' && gbcode <= 'z' )
firstChar = String.valueOf ( ( char ) gbcode );
}
catch ( Exception e )
{
System.out.println ( "getFirstCharOfString Exception: " + e.getMessage () );
}
return firstChar;
}
}
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
看看那句能打印出中文。说明解码编码正确
String str = values[i];
System.out.println("1:" + new String(str.getBytes("GBK"),"ISO8859_1"));
System.out.println("2:" +new String(str.getBytes("GBK"),"utf-8"));
System.out.println("3:" +new String(str.getBytes("GBK"),"GB2312"));
System.out.println("4:" +new String(str.getBytes("GBK"),"GBK"));
System.out.println("5:" +new String(str.getBytes("ISO8859_1"),"GBK"));
System.out.println("6:" +new String(str.getBytes("ISO8859_1"),"ISO8859_1"));
System.out.println("7:" +new String(str.getBytes("ISO8859_1"),"GB2312"));
System.out.println("8:" +new String(str.getBytes("ISO8859_1"),"utf-8"));
System.out.println("9:" +new String(str.getBytes("utf-8"),"GBK"));
System.out.println("10:" +new String(str.getBytes("utf-8"),"utf-8"));
System.out.println("11:" +new String(str.getBytes("utf-8"),"GB2312"));
System.out.println("12:" +new String(str.getBytes("utf-8"),"ISO8859_1"));
System.out.println("13:" +new String(str.getBytes("GB2312"),"GB2312"));
System.out.println("14:" +new String(str.getBytes("GB2312"),"ISO8859_1"));
System.out.println("15:" +new String(str.getBytes("GB2312"),"utf-8"));
System.out.println("16:" +new String(str.getBytes("GB2312"),"GBK"));
1. ASCII码
我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。
上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。
ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。
2、非ASCII编码
英语用128个符号编码就够了,但是用来表示其他语言,128个符号是不够的。比如,在法语中,字母上方有注音符号,它就无法用ASCII码表示。于是,一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号。比如,法语中的é的编码为130(二进制10000010)。这样一来,这些欧洲国家使用的编码体系,可以表示最多256个符号。
但是,这里又出现了新的问题。不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。比如,130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel (ג),在俄语编码中又会代表另一个符号。但是不管怎样,所有这些编码方式中,0—127表示的符号是一样的,不一样的只是128—255的这一段。
至于亚洲国家的文字,使用的符号就更多了,汉字就多达10万左右。一个字节只能表示256种符号,肯定是不够的,就必须使用多个字节表达一个符号。比如,简体中文常见的编码方式是GB2312,使用两个字节表示一个汉字,所以理论上最多可以表示256x256=65536个符号。
中文编码的问题需要专文讨论,这篇笔记不涉及。这里只指出,虽然都是用多个字节表示一个符号,但是GB类的汉字编码与后文的Unicode和UTF-8是毫无关系的。
3.Unicode
正如上一节所说,世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。为什么电子邮件常常出现乱码?就是因为发信人和收信人使用的编码方式不一样。
可以想象,如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是Unicode,就像它的名字都表示的,这是一种所有符号的编码。
Unicode当然是一个很大的集合,现在的规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,U+4E25表示汉字“严”。具体的符号对应表,可以查询unicode.org,或者专门的汉字对应表。
4. Unicode的问题
需要注意的是,Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
比如,汉字“严”的unicode是十六进制数4E25,转换成二进制数足足有15位(100111000100101),也就是说这个符号的表示至少需要2个字节。表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多。
这里就有两个严重的问题,第一个问题是,如何才能区别unicode和ascii?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。
它们造成的结果是:1)出现了unicode的多种存储方式,也就是说有许多种不同的二进制格式,可以用来表示unicode。2)unicode在很长一段时间内无法推广,直到互联网的出现。
5.UTF-8
互联网的普及,强烈要求出现一种统一的编码方式。UTF-8就是在互联网上使用最广的一种unicode的实现方式。其他实现方式还包括UTF-16和UTF-32,不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8是Unicode的实现方式之一。
UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
UTF-8的编码规则很简单,只有二条:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
下表总结了编码规则,字母x表示可用编码的位。
Unicode符号范围 | UTF-8编码方式
UTF字节数 (十六进制) | (二进制)
--------------------+---------------------------------------------
一个字节 0000 0000-0000 007F | 0xxxxxxx
两个字节 0000 0080-0000 07FF | 110xxxxx 10xxxxxx
三个字节 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
四个字节 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
下面, 还是以汉字“严”为例,演示如何实现UTF-8编码。
已知“严”的unicode是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800-0000 FFFF),因此“严”的UTF-8编码需要三个字节,即格式是“1110xxxx 10xxxxxx 10xxxxxx”。然后,从“严”的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,“严”的UTF-8编码是“11100100 10111000 10100101”,转换成十六进制就是E4B8A5。
6. Unicode与UTF-8之间的转换
通过上一节的例子,可以看到“严”的Unicode码是4E25,UTF-8编码是E4B8A5,两者是不一样的。它们之间的转换可以通过程序实现。
在Windows平台下,有一个最简单的转化方法,就是使用内置的记事本小程序Notepad.exe。打开文件后,点击“文件”菜单中的“另存为”命令,会跳出一个对话框,在最底部有一个“编码”的下拉条。
7. iso8859-1编码
属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。比如,字母a的编码为0×61=97.很明显,iso8859-1编码表示的字符范围很窄,无法表示中文字符。但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用iso8859-1编码来表示。而且在很多协议上,默认使用该编码。比如,虽然"中文"两个字不存在iso8859-1编码,以gb2312编码为例,应该是"d6d0 cec4"两个字符,使用iso8859-1编码的时候则将它拆开为4个字节来表示:"d6 d0 ce c4"(事实上,在进行存储的时候,也是以字节为单位处理的)。而如果是UTF编码,则是6个字节"e4 b8 ad e6 96 87".很明显,这种表示方法还需要以另一种编码为基础。
java对字符的处理
在java应用软件中,会有多处涉及到字符集编码,有些地方需要进行正确的设置,有些地方需要进行一定程度的处理。
1. getBytes(charset)
这是java字符串处理的一个标准函数,其作用是将字符串所表示的字符按照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"(两个问号)。
java .class类的编码为:unicode;
windows 默认的编码为:中文:gb2312; 英文:iso8859;
String str = "张三" ;
byte[] jiema= str.getBytes("gb2312") ; //解码
String bianma = new String(jiema,"UTF-8");//编码 如果上面的解码不对 可能出现问题
2. new String(charset)
这是java字符串处理的另一个标准函数,和上一个函数的作用相反,将字节数组按照charset编码进行组合识别,最后转换为unicode存储。参考上述getBytes的例子,"gbk" 和"utf8"都可以得出正确的结果"4e2d 6587",但iso8859-1最后变成了"003f 003f"(两个问号)。
因为utf8可以用来表示/编码所有字符,所以new String( str.getBytes( "utf8" ), "utf8" ) === str,即完全可逆。
3. setCharacterEncoding()
该函数用来设置http请求或者相应的编码。
对于request,是指提交内容的编码,指定后可以通过getParameter()则直接获得正确的字符串,如果不指定,则默认使用iso8859-1编码,需要进一步处理。参见下述"表单输入".值得注意的是在执行setCharacterEncoding()之前,不能执行任何getParameter()。java doc上说明:This method must be called prior to reading request parameters or reading input using getReader()。而且,该指定只对POST方法有效,对GET方法无效。分析原因,应该是在执行第一个getParameter()的时候,java将会按照编码分析所有的提交内容,而后续的getParameter()不再进行分析,所以setCharacterEncoding()无效。而对于GET方法提交表单是,提交的内容在URL中,一开始就已经按照编码分析所有的提交内容,setCharacterEncoding()自然就无效。
对于response,则是指定输出内容的编码,同时,该设置会传递给浏览器,告诉浏览器输出内容所采用的编码。
4. 处理过程
下面分析两个有代表性的例子,说明java对编码有关问题的处理方法。
4.1. 表单输入
User input *(gbk:d6d0 cec4) browser *(gbk:d6d0 cec4) web server iso8859-1(00d6 00d 000ce 00c4) class,需要在class中进行处理:getbytes("iso8859-1")为d6 d0 ce c4,new String("gbk")为d6d0 cec4,内存中以unicode编码则为4e2d 6587.
l 用户输入的编码方式和页面指定的编码有关,也和用户的操作系统有关,所以是不确定的,上例以gbk为例。
l 从browser到web server,可以在表单中指定提交内容时使用的字符集,否则会使用页面指定的编码。而如果在url中直接用?的方式输入参数,则其编码往往是操作系统本身的编码,因为这时和页面无关。上述仍旧以gbk编码为例。
l Web server接收到的是字节流,默认时(getParameter)会以iso8859-1编码处理之,结果是不正确的,所以需要进行处理。但如果预先设置了编码(通过request. setCharacterEncoding ()),则能够直接获取到正确的结果。
l 在页面中指定编码是个好习惯,否则可能失去控制,无法指定正确的编码。
4.2. 文件编译
假设文件是gbk编码保存的,而编译有两种编码选择:gbk或者iso8859-1,前者是中文windows的默认编码,后者是linux的默认编码,当然也可以在编译时指定编码。
Jsp *(gbk:d6d0 cec4) java file *(gbk:d6d0 cec4) compiler read uincode(gbk: 4e2d 6587; iso8859-1: 00d6 00d 000ce 00c4) compiler write utf(gbk: e4b8ad e69687; iso8859-1: *) compiled file unicode(gbk: 4e2d 6587; iso8859-1: 00d6 00d 000ce 00c4) class.所以用gbk编码保存,而用iso8859-1编译的结果是不正确的。
class unicode(4e2d 6587) system.out / jsp.out gbk(d6d0 cec4) os console / browser.
l 文件可以以多种编码方式保存,中文windows下,默认为ansi/gbk.
l 编译器读取文件时,需要得到文件的编码,如果未指定,则使用系统默认编码。一般class文件,是以系统默认编码保存的,所以编译不会出问题,但对于jsp文件,如果在中文windows下编辑保存,而部署在英文linux下运行/编译,则会出现问题。所以需要在jsp文件中用pageEncoding指定编码。
l Java编译的时候会转换成统一的unicode编码处理,最后保存的时候再转换为utf编码。
l 当系统输出字符的时候,会按指定编码输出,对于中文windows下,System.out将使用gbk编码,而对于response(浏览器),则使用jsp文件头指定的contentType,或者可以直接为response指定编码。同时,会告诉browser网页的编码。如果未指定,则会使用iso8859-1编码。对于中文,应该为browser指定输出字符串的编码。
l browser显示网页的时候,首先使用response中指定的编码(jsp文件头指定的contentType最终也反映在response上),如果未指定,则会使用网页中meta项指定中的contentType.
5. 几处设置
对于web应用程序,和编码有关的设置或者函数如下。
5.1. jsp编译
指定文件的存储编码,很明显,该设置应该置于文件的开头。例如:。另外,对于一般class文件,可以在编译的时候指定编码。
5.2. jsp输出
指定文件输出到browser是使用的编码,该设置也应该置于文件的开头。例如:。该设置和response.setCharacterEncoding("GBK")等效。
5.3. meta设置
指定网页使用的编码,该设置对静态网页尤其有作用。因为静态网页无法采用jsp的设置,而且也无法执行response.setCharacterEncoding()。例如:
如果同时采用了jsp输出和meta设置两种编码指定方式,则jsp指定的优先。因为jsp指定的直接体现在response中。
需要注意的是,apache有一个设置可以给无编码指定的网页指定编码,该指定等同于jsp的编码指定方式,所以会覆盖静态网页中的meta指定。所以有人建议关闭该设置。
5.4. form设置
当浏览器提交表单的时候,可以指定相应的编码。例如:。一般不必不使用该设置,浏览器会直接使用网页的编码。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
首先介绍两种字符集 gb2312 和 gbk
。gb2312 简体中文编码
。gbk 中文字符编码 包括繁体中文
1. 指定jsp文件里内容的的编码方式
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
2. 指定html文件里内容的编码方式
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
3. 当响应用户的请求时,输出到用户浏览器上的编码方式
<%@ page contentType="text/html"; charset="gb2312"%>
相当于生成的代码 response.setContentType("text/html; charset=gb2312");
4. 把用户传递过来的参数作为指定的编码
request.setCharacterEncoding("gb2312");
5. 对比
request.setCharacterEncoding("gb2312"); //设置输入编码格式
response.setContentType("text/html; charset=gb2312"); //设置输出编码格式
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
一个关于中文字符转换的程序:
package com.company.util.charset;
import sun.io.CharToByteConverter;
import sun.io.ByteToCharConverter;
import com.company.util.common.Configure;
/**
* 创建日期:(2008-7-6 13:51:16) 解决sybase数据库查询不能显示中文的问题
*
* @author:like_dark
*/
public class UnicodeToAscii
{
/**
* UnicodeToAscii 构造子注解。
*/
public UnicodeToAscii ()
{
super ();
}
/**
* 将Ascii转换成中文字符串
*/
public static String AsciiToChineseString ( String s )
{
if ( s == null )
return s;
char[] orig = s.toCharArray ();
byte[] dest = new byte[ orig.length ];
for ( int i = 0; i < orig.length; i++ )
dest[ i ] = ( byte ) ( orig[ i ] & 0xFF );
try
{
ByteToCharConverter toChar = ByteToCharConverter.getConverter ( "gb2312" );
return new String ( toChar.convertAll ( dest ) );
}
catch ( Exception e )
{
System.out.println ( e );
return s;
}
}
/**
* 将中文字符串转换成Ascii
*/
public static String ChineseStringToAscii ( String s )
{
if ( s == null )
return s;
try
{
CharToByteConverter toByte = CharToByteConverter.getConverter ( "gb2312" );
byte[] orig = toByte.convertAll ( s.toCharArray () );
char[] dest = new char[ orig.length ];
for ( int i = 0; i < orig.length; i++ )
dest[ i ] = ( char ) ( orig[ i ] & 0xFF );
return new String ( dest );
}
catch ( Exception e )
{
System.out.println ( e );
return s;
}
}
/**
* 中文转ascii
*
* @param s
* 要进行转换的字符串
* @param bl
* 是否进行转换,一个开关控制 , true代表需要转换。
* @return 转换后的字符串
*/
public static String ChineseStringToAscii ( String s, boolean bl )
{
if ( !bl )
return s;
else
return ChineseStringToAscii ( s );
}
/**
* ascii转字符串
*
* @param s
* @param bl
* @return
*/
public static String AsciiToChineseString ( String s, boolean bl )
{
if ( !bl )
return s;
else
return AsciiToChineseString ( s );
}
/**
* 根据输入的源串(中文或中西文混合)返回其拼音首字母,以小写返回,如果首字符非拼音字母,则统一返回*号
*
* @param str
* 源串(中文或中西文混合)
* @return 返回str的拼音首字母,以小写返回,如果首字符非拼音字母,则统一返回*号
*/
public static String getFirstCharOfString ( String str )
{
String firstChar = "*";
if ( str == null || str.length () <= 0 )
return firstChar;
try
{
byte firstCharBytes[] = new byte[ 2 ];
int gbcode;
firstCharBytes[ 0 ] = str.getBytes ( "gb2312" )[ 0 ];
gbcode = firstCharBytes[ 0 ] & 0x000000ff;
if ( str.length () > 1 || gbcode >= 0xb0 )
{
firstCharBytes[ 1 ] = str.getBytes ( "gb2312" )[ 1 ];
gbcode = ( firstCharBytes[ 0 ] & 0x000000ff ) * 0x100 + ( firstCharBytes[ 1 ] & 0x000000ff );
}
if ( gbcode >= 0xb0a1 && gbcode <= 0xb0c4 )
firstChar = "a";
else if ( gbcode >= 0xb0c5 && gbcode <= 0xb2c0 )
firstChar = "b";
else if ( gbcode >= 0xb2c1 && gbcode <= 0xb4ed )
firstChar = "c";
else if ( gbcode >= 0xb4ee && gbcode <= 0xb6e9 )
firstChar = "d";
else if ( gbcode >= 0xb6ea && gbcode <= 0xb7a1 )
firstChar = "e";
else if ( gbcode >= 0xb7a2 && gbcode <= 0xb8c0 )
firstChar = "f";
else if ( gbcode >= 0xb8c1 && gbcode <= 0xb9fd )
firstChar = "g";
else if ( gbcode >= 0xb9fe && gbcode <= 0xbbf6 )
firstChar = "h";
else if ( gbcode >= 0xbbf7 && gbcode <= 0xbfa5 )
firstChar = "j";
else if ( gbcode >= 0xbfa6 && gbcode <= 0xc0ab )
firstChar = "k";
else if ( gbcode >= 0xc0ac && gbcode <= 0xc2e7 )
firstChar = "l";
else if ( gbcode >= 0xc2e8 && gbcode <= 0xc4c2 )
firstChar = "m";
else if ( gbcode >= 0xc4c3 && gbcode <= 0xc5b5 )
firstChar = "n";
else if ( gbcode >= 0xc5b6 && gbcode <= 0xc5bd )
firstChar = "o";
else if ( gbcode >= 0xc5be && gbcode <= 0xc6d9 )
firstChar = "p";
else if ( gbcode >= 0xc6da && gbcode <= 0xc8ba )
firstChar = "q";
else if ( gbcode >= 0xc8bb && gbcode <= 0xc8f5 )
firstChar = "r";
else if ( gbcode >= 0xc8f6 && gbcode <= 0xcbf9 )
firstChar = "s";
else if ( gbcode >= 0xcbfa && gbcode <= 0xcdd9 )
firstChar = "t";
else if ( gbcode >= 0xcdda && gbcode <= 0xcef3 )
firstChar = "w";
else if ( gbcode >= 0xcef4 && gbcode <= 0xd1b8 )
firstChar = "x";
else if ( gbcode >= 0xd1b9 && gbcode <= 0xd4d0 )
firstChar = "y";
else if ( gbcode >= 0xd4d1 && gbcode <= 0xd7f9 )
firstChar = "z";
else
gbcode = firstCharBytes[ 0 ];
if ( gbcode >= 'A' && gbcode <= 'Z' )
gbcode += 32;
if ( gbcode >= 'a' && gbcode <= 'z' )
firstChar = String.valueOf ( ( char ) gbcode );
}
catch ( Exception e )
{
System.out.println ( "getFirstCharOfString Exception: " + e.getMessage () );
}
return firstChar;
}
}
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
看看那句能打印出中文。说明解码编码正确
String str = values[i];
System.out.println("1:" + new String(str.getBytes("GBK"),"ISO8859_1"));
System.out.println("2:" +new String(str.getBytes("GBK"),"utf-8"));
System.out.println("3:" +new String(str.getBytes("GBK"),"GB2312"));
System.out.println("4:" +new String(str.getBytes("GBK"),"GBK"));
System.out.println("5:" +new String(str.getBytes("ISO8859_1"),"GBK"));
System.out.println("6:" +new String(str.getBytes("ISO8859_1"),"ISO8859_1"));
System.out.println("7:" +new String(str.getBytes("ISO8859_1"),"GB2312"));
System.out.println("8:" +new String(str.getBytes("ISO8859_1"),"utf-8"));
System.out.println("9:" +new String(str.getBytes("utf-8"),"GBK"));
System.out.println("10:" +new String(str.getBytes("utf-8"),"utf-8"));
System.out.println("11:" +new String(str.getBytes("utf-8"),"GB2312"));
System.out.println("12:" +new String(str.getBytes("utf-8"),"ISO8859_1"));
System.out.println("13:" +new String(str.getBytes("GB2312"),"GB2312"));
System.out.println("14:" +new String(str.getBytes("GB2312"),"ISO8859_1"));
System.out.println("15:" +new String(str.getBytes("GB2312"),"utf-8"));
System.out.println("16:" +new String(str.getBytes("GB2312"),"GBK"));
发表评论
-
JRebel
2016-06-02 10:14 5152. 单独使用JRebel.jar破解版(如在64位下WIND ... -
android
2016-05-10 14:53 269对于 LinearLayout 当 android:ori ... -
db2学习
2014-06-23 11:47 957LOAD CLIENT FROM 'E:\1\data\EC ... -
html 里的回车换行,制表符 引号,\ 等符号的转化
2014-06-22 17:17 1048/* * To change this license h ... -
netbeans插件
2013-12-10 22:42 372Text Popup Menu 在 Windows 7 ... -
ipv6
2013-11-24 20:23 460Window--Preferences--JAVA--Inst ... -
java编码转化
2013-11-09 16:46 546@Test public void test ... -
eclipse打开插件
2013-11-06 16:24 527openExplorer 一个eclipse小插件——打开当前 ... -
在Windows上与MySQL服务器的连接失败(大数据量) For Windows-based platforms, see Microsoft Knowle
2013-07-16 09:11 1210发生的异常: The driver was unable ... -
java 公用库
2013-03-13 10:24 776转载 本文主要介绍自己在开发过程中总结的一些Java工具类,主 ... -
InetAddress
2013-03-04 13:59 551String ip = ""; ... -
转文件编码格式
2012-06-19 19:55 867转@Test public void testConver ... -
myeclipse 9 property svn 插件
2011-10-07 18:04 12411、下载最新的SVN包(我下的是1.0.6版): http: ... -
lucene compass
2011-09-25 17:39 870PaodingAnalyzer analy ... -
spring 中的bean 大小写
2011-07-19 16:45 2352使用spring注释形式注入bean,通过@Component ... -
sooba xpdf lucene
2010-11-30 11:26 1127XPDF使用文档 XPDF版本 3.0.2 日期 2008 ... -
struts2
2010-09-17 11:48 592<s:if test="%{#session. ... -
jBPM4.0中文文档.pdf
2009-07-23 10:16 1816jBPM4.0中文文档 -
Java中获取指定URL的输出
2009-07-21 19:38 1428import java.io.ByteArrayOutputS ... -
location.href 和session的问题
2009-05-21 18:52 1861一个页面有两个 iframe 在其中一个iframe页面内访问 ...
相关推荐
际 标 准 , 其 制 订 的 通 讯 协 议 栈 就 采 用 了 ASN.1来 描 述 和 编 解 码 的 , ASN.1是 实 现 数 字 化 变 电 站 的 核 心 技 术 之 一 。 关 键 词 : 抽 象 语 法 标 记 ; IEC61850; 数 字 化 变 电 站 ; ...
编 码 器 知 识 讲 座doc,编 码 器 知 识 讲 座
编 码 器 (encoder)选型参数简介rar,编 码 器 (encoder)选型参数简介
【unicode汉字编码表】,列分别是:汉字,全拼,五笔,郑码,UNICODE,GBK,笔画数,部首,笔顺编号,没有多音字的对照,如有错误请评论反馈,以便进行更正,谢谢
在编写程序,尤其是java程序时,我们经常会遇到乱码问题,这个编码表有利于学习编码,有利于理解乱码问题
JAVA编码规范。详细描述了如何进行编码的规范
这是数码管显示编码软件,可以根据自己的数码管的不同顺序,快速直观的看出各个数字的显示编码。
Java编码规范,Java编码规范,Java编码规范,Java编码规范
VB的程序设计基础 VB编码规则 1. 语言元素 VB的语言基础是BASIC语言,VB程序的语言元素主要由: 关键字(如: Dim、Print、Cls) 函数(如:Sin()、Cos()Sqr()) 表达式(如:Abs(-23.5)+45*20/3 ) ...
本规范提供一个C#语言编码的统一标准,目的在于在软件开发过程中基于C#语言的代码能够始终在整个开发团队中保持一致。
研究了 Q R 码不同模式下的数据编 码规则和识别解码方法, 采用 了 B M 迭代译码算法进行纠错译码; 分 析了在 W i nC E 下 U SB 摄像头采集图像的实现方法 , 研究 了图像预处 理方法 , 采用 了 O T SU 算法选择 阑值...
汉字 全拼 五笔 郑码 UNICODE GBK 笔画数 部首笔顺编号 一 yi ggll A 4E00 D2BB 1 一 1 丁 ding sgh AI 4E01 B6A1 2 一 12 丂 yu gnv AZVV 4E02 8140 2 一 15 七 qi agn HD 4E03 C6DF 2 一 15 丄 shang hgd IAVV 4E...
IBOC标准采用删除卷积码( CPPC)作为其纠错码,本文提供了一种更先进的编码方式—编织码( woven code) 作为删除卷积码的理想替代。编织码将卷积码按照特殊的“编织”形式组织起来,成为另一种能够接近 Shannon界限的好...
4.6 BCJR算法 第五章Turbo码 5.1 Turbo码的编码 5.2 Turbo码的迭代译码 5.3 Turbo码的性能界 5.4 交织器设计 5.5 分量码的优化 第六章编织码 6.1 编织码编码基本原理...
能自动根据需要设定生成条形码,并打印和识别条形码。附源代码
创奇会计档案管理软件 V3.0 系统配置要求 微机:CPU: 奔腾PⅡ300以上 内存:32M以上 显示器:分辨率800*600以上 软件: Windows98以上(推荐Win2000、WinXP) 系统安装方法 首先运行安装程序,方法是用鼠标双击...
本科毕业论文的一个格式模版,里面设定了一个多级目录和自动编号
一些编码是由机构码或者组合码加上流水号组成,数据多了,时常会出现断码的断号的情况,要查找出来很麻烦,而我写了一个方法来查出这些断码、断码。
PT2262/2272 是一种 CMOS 工艺制造的低功耗低价位通用编解码电路,PT2262/2272 最多可有 12 位(A0- A11)三态地址端管脚(悬空,接高电平,接低电平),任意组合可提供 531441 地址码,PT2262 最多可有 6 位(D0-D5)数据端...