java中编码与解码分别指什么?

JavaScript034

java中编码与解码分别指什么?,第1张

java中编码:URLEncoder.encode(strUri,"utf-8")

java中解码码:URLDecoder.decode(strUri,"utf-8")

java编码和解码        

流读取文件,具有转换编码功能的有:OutputStreamWriter和InputStreamReader,

构造器有如:

InputStreamReader(InputStream in, String charsetName)

创建使用指定字符集的 InputStreamReader。

OutputStreamWriter(OutputStream out, String charsetName)

创建使用指定字符集的 OutputStreamWriter。

处理字符串编码问题:

重新对获取的字符串进行编码:Byte[] bytes = str.getBytes(String encodeCharsetNam)

重新对bytes进行解码,创建新的字符串对象:str = new String(Byte[] bytes,String decodeCharsetName)

一般结合使用:str = new String(str.getBytes(String encodeCharsetName),String decodeCharsetName)

例如:resultName=new String(username.getBytes("ISO-8859-1"),"UTF-8")

还可以加入判断:

if(!Charset.forName("gbk").newEncoder().canEncode(str)){str = new Strin(str.getBytes("ISO-8859-1"),"UTF-8")}else{str = new String(str.getBytes("ISO-8859-1"),"gbk")}

处理请求参数传递编码问题:

java中编码:URLEncoder.encode(strUri,"utf-8")

java中解码码:URLDecoder.decode(strUri,"utf-8")

js中编码:encodeURIComponent(strUri)encodeURI(strUri)escape(str)

js中解码:decodeURIComponent(strUri)decodeURI(strUri)unescape(str)

补充概念

URI组件:主机、端口、路径、查询参数、片段等。

URI组件分隔符::/?#&[]@,冒号用于分隔协议和主机,/用于分隔主机和 路径,?用于分隔路径和查询参数,&用于分隔多个查询参数等。

URI中的不安全字符或保留字符: ! * ‘ ( ) : @ &= + $ , / ? # [ ] 他们具有特殊作用,例如上面的分隔作用。

URI允许出现的字符:只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符,其他字符均需要经过编码之后才能出现在Url中,比如使用保留字符的原意,而不是特殊作用。

js向java/jsp的编码与解码:

js中编码:encodeURI(encodeURI(strUri))decodeURIComponent(decodeURIComponent(strUri))

java/jsp中解码: java.net.URLDecoder.decode(strUri,"UTF-8")

js中编码两次的问题:如果使用一次编码,在浏览器地址栏里,浏览器认为%是个转义字符,浏览器会把%与%之间的编码值,两位两位取出后进行解码。

然后再传递给处理页面,然后由处理页面进行再次解码,这样前面就缺少了一次编码过程,所以前面需要连续两次编码。

地址栏中出现汉字的情况有两种,一种是汉字出现在URL的路径部分,一种是汉字出现在URL的传参的部分,第二种情况的时候必须采用编码后传参,接受时解码的方式完成传参。js中编码有escape(),encodeURI(),encodeURIComponent()三个常用的方法,escape()常常用在提交页面和处理页面的编码格式相同的情况下(比如它们都是GB2312),encodeURI()和encodeURIComponent()的用法基本相同,区别在于encodeURIComponent()也对"?"等特殊字符进行编码。

一开始遇到中文参数的时候,使用encodeURI()进行了一遍编码,传过去后,发现解码出现问题,于是想到可能是编码方法使用错误,于是使用escape()方法,这时发现解码时抛出isHexDigit异常。借助百度搜索isHexDigit异常,

发现原来,是escape()方法造成了异常,同时了解了浏览器传递地址的一些原理,在浏览器地址栏里,浏览器认为%是个转义字符,浏览器会把%与%之间的编码,两位两位取出后进行解码,然后再传递给处理页面,

然后由处理页面进行再次解码。由此我想到一直使用encodeURI方法是正确的,只是需要使用两次encodeURI方法,例如encodeURI(encodeURI("中文"))第一次是把中文编码成%xy的格式,

第二次是对%xy中的%进行编码,%籂亥焚酵莳寂锋檄福漏编码成%。整个传参过程大体应该是:提交页面使用encodeURI(encodeURI("中文"))编码,把最后的编码结果%xy传递给处理页面的过程中,浏览器获取URL地址

(注意openModelDialog方法,浏览器获取不到参数编码)后解码成%xy,然后把%xy传递给处理页面,处理页面使用URLDecoder.decode(request.getParameter("参数名"),"UTF-8")完成解码。

总结:1、汉字出现在URL路径部分的时候不需要编码解码

js用两次编码encodeURIComponent(encodeURIComponent(str))后台一次解码str=java.net.URLDecoder.decode(name,"UTF-8")

或者js编码不变,后台解码用s = new String(str.getBytes("ISO8859-1"), "UTF-8")