菜鸟笔记
提升您的技术认知

java 字符串的编码解码-ag真人游戏

结合别人的内容和自己的理解规范地整理出,做以笔记

一、认识编码

.编码:规定每个“字符”分别用一个字节还是多个字节存储,用哪些字节来存储,这个规定就叫做“编码” 平常我们所说的“字符集”,比如:gb2312, gbk, jis 等;

二、java中常用的字符串的编码解码

1.将字符串转换成byte数组再恢复:

byte[] getbytes(string charsetname)

string(byte[] bytes, string charsetname)

或getbytes()

string(byte[] bytes)

2.使用string sun.misc.base64encode.encode(byte[] b)

byte[] string sun.misc.base64decode.decodebuffer(string str)

将字符串转换成byte[],再转换成ascii码;恢复时做逆操作。

在字符串转换成byte[]时,尽量用byte[] getbytes(string charsetname)方法,解码时也用相同的charsetname做参数,如果都不charsetname可能会导致一些中文字符不能正确解码。

3.使用java.net.urlencoder类和java.net.urldecoder类

它有static方法将字符串转换成‘pplication/x-www-form-urlencoded'格式便于在网络中传播

形如‘ 5'。

三、系统的了解java对字符串的编码和解码

 1. getbytes(charset) 这是 java 字符串处理的一个标准函数,其作用是将字符串所表示的字符按照 charset 编码,并以字节方式表示。注意字符串在 java 内存中总是按 unicode 编码存储的。当java程序从输入流、文件或字符文字量等途径获得字符串时,均会做字符编码的转换,例如inputstreamreader 的构造函数中就需要指定编码方式,而对于从文件和字符文字量中获得字符串时,均采用系统默认的编码方式对字符数据进行解码。考虑下面一段代码: string str=”中”;

 

① byte[] bytes = str.getbytes();

 

② bytes = str.getbytes(“iso-8859-1”);

③ 语句①:将一个只含有一个字符“中”的字符串文字量赋给 string 类的一个对象 str,字符文字量“中”是按照操作系统默认编码方式进行编码,在中文 windows 系统中通常是“gbk”,“中”在gbk编码中是0xd6d0,在将该字符赋给str时,java会对该字符串进行编码转换,即将gbk编码方式的“中”转换成unicode编码方式的“中”,unicode编码方式“中”的编码是0x4e2d,所以str在程序运行期间在内存中的二进制表示成16进制就是0x4e2d。语句②:获得str字符串的二进制形式。getbytes(string encoding)方法需要指定编码方式,表示获得该字符串在何种编码方式中的二进制形式。此语句中没有设置参数,表示采用操作系统默认的编码方式,即此处获得的bytes是“中”在gbk编码中的二进制形式,即bytes[0]=0xd6, bytes[1]=0xd0。语句③:该语句与语句②的区别就是指定了编码方式,此处指定的是iso-8859-1,即通常所说的latin-1,该编码采用8bit对字符编码,所以编码空间中只有256个字符。该编码中只包含了基本的ascii码和一些扩展的其它西欧字符,所以该字符集中不可能包含中文的“中”字,也就是说java虚拟机无法在iso-8859-1编码集中找到“中”字对应的编码,针对这种情况,就只返回一个问号(?,0x3f)字符,所以此时bytes.length只有1,且bytes[0]=0x3f。

 

2.new string(byte[] bytes, string encoding) getbytes()方法从字符串获得二进制的字节数组。如果要从二进制的字节数组获得字符串,则就需要使用new string(byte[] bytes, string encoding)方法,该方法按照encoding编码方法对字节数组bytes中的二进制数组进行解析,生成一个新的字符串对象。

 

byte[] bytes = {(byte)0xd6, (byte)0xd0, (byte)0x31};

 

① string str = new string(bytes);

 

② str = new string(bytes,”iso-8859-1”);

 

 ③ 语句①:定义一个字节数组。语句②:将该字节数组中的二进制数据按照默认的编码方式(gbk)编码成字符串,我们知道gbk中0xd6 0xd0表示“中”,0x31表示字符“1”(gbk兼容ascii,但不兼容iso-8859-1除ascii之外的部分),所以str得到的值是“中1”。语句③:该句用iso-8859-1编码方式对该字节数据进行编码,由于在iso-8859-1编码方式中一个字节会被解析成一个字符,所以该字节数组会被解释成包含三个字符的字符串,但由于在iso-8859-1编码方式中没有对应0xd6和0xd0的字符,所以前两个字符会产生两个问号,由于0x31在iso-8859-1编码中对应字符“1”(iso-8859-1也兼容ascii),所以此语句得到str的值是“??1”。

 3.setcharacterencoding() 该函数用来设置http请求或者相应的编码。对于request,是指提交内容的编码,指定后可以通过getparameter()直接获得正确的字符串,如果不指定,则默认使用iso8859-1 编码,需要进一步处理。值得注意的是在执行setcharacterencoding()之前,不能执行任何 getparameter()。而且,该指定只对post方法有效,对get方法无效。分析原因,应该是在执行第一个getparameter()的时候,java将会按照编码分析所有的提交内容,而后续的getparameter()不再进行分析,所以setcharacterencoding()无效。而对于get方法提交表单时,提交的内容在url中,一开始就已经按照编码分析所有的提交内容,setcharacterencoding()自然就无效。对于response,则是指定输出内容的编码,同时,该设置会传递给浏览器,告诉浏览器输出内容所采用的编码。

 四、页面编码页面编码

页面的编码格式可以从两方面来说明:

  • 一是页面本身的编码格式,即以什么编码方式保存;
  • 二是客户端浏览器以什么编码格式显示页面。

1. 页面保存编码格式

 

1). html 页面的编码要看你保存文件时的编码选项,多数的网页编辑软件可以让你选择编码的类型,默认为本地编码,为了使网页减少编码的问题,最好保存为 utf-8 编码格式。

 

 2). jsp 页面使用下列标签指定 jsp 源文件的编码格式,具体来说,我们在jsp源文件头上加入下面的一句即可: %@page[/email] pageencoding="xxx"%>,xxx可以为gb2312,gbk,utf-8(和mysql不同,mysql是 utf8)等等,其默认值为iso-8859-1。保存文件时的编码应该与xxx 一致。

2. 页面显示编码(通知客户端浏览器用什么字符集编码显示页面)

 

 1). 在 html 中设置页面显示编码方式 使用标签设置页面显示编码

 

2). 在 servlet 中设置页面显示编码方式 使用 response.setcontenttype("text/html; charset=xxx");来指定生成的页面编码。

 

 3).在 jsp 中设置页面显示编码方式 使用设置页面显示编码。字符集的默认值为iso-8859-1。

五、jsp 编译过程(以tomcat为例)

 

1.tomcat 先将整个jsp页面的代码读取出来,写到一个新的java文件中。在读取jsp文件时,tomcat会先去读取jsp文件的pageencoding属性,然后按照pageencoding指定的编码来读取jsp文件。如果pageencoding没有指定,tomcat会使用contenttype指定的字符集编码,如果contenttype也没有指定,就使用默认的iso-8859-1编码。

 

2.tomcat读取完jsp文件后,会用utf-8编码将这些内容写道一个新的文件中,然后编译。

 

3.当jsp文件显示的时候,会使用contenttype中指定的mime类型和charset。如果charset没有指定,就使用pageencoding中指定的编码,如果pageencoding也没有指定,就使用默认的iso-8859-1编码。

六、这样使我想起之前犯的错误 原来是各自使用的编码集不相同导致的;

网站地图