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中编码两次的问题:如果使用一次编码,在浏览器地址栏里,浏览器认为%是个转义字符,浏览器会把%与%之间的编码值,两位两位取出后进行解码。
然后再传递给处理页面,然后由处理页面进行再次解码,这样前面就缺少了一次编码过程,所以前面需要连续两次编码。
encodeURI 函数对 URI 进行完整的编码
encodeURIComponent 函数假定它的参数是 URI 的一部分(比如协议、主机名、路径或查询字符串)。因此 encodeURIComponent() 函数将转义用于分隔 URI 各个部分的标点符号。
如果 URI 组件中含有分隔符,比如 ? 和 #,则应当使用 encodeURIComponent() 方法分别对各组件进行编码。
所以encodeURIComponent比encodeURI编码的范围更大。
1、如果只是编码字符串,使用escape
2、如果需要编码整个URL,然后需要使用这个URL,使用encodeURl
3、如果需要编码URL中的参数,使用encodeURlComponent
1、string --->base-64转码
2、base64转码的对象只能是字符串,不能对unicode转码
对于汉字,这就要使用window.encodeURIComponent和window.decodeURIComponent