第一:流读取文件,具有转换编码功能的有:OutputStreamWriter和InputStreamReader,构造器有如:
InputStreamReader(InputStream in, String charsetName)
创建使用指定字符集的 InputStreamReader。
OutputStreamWriter(OutputStream out, String charsetName)
创建使用指定字符集的 OutputStreamWriter。
第二:处理字符串编码问题:
1、重新对获取的字符串进行编码:Byte[] bytes = str.getBytes(String encodeCharsetName);
2、重新对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 String(str.getBytes("ISO-8859-1"),"UTF-8");
}else{
str = new String(str.getBytes("ISO-8859-1"),"gbk");
}
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中,比如使用保留字符的原意,而不是特殊作用。
综上,如果想让保留字符出现在URI中但不起分隔作用就需要对该字符进行编码,比如中文也需要编码才能出现在URI中,编码函数如下:
encodeURIComponent(strUri):安全字符(71个) !’()*-._~0-9a-zA-Z,会对分隔 URI 组件的标点符号(;/?:@&=+$,#)进行转义编码,编码的字符范围大,被用作对URI的单个组件进行编码
encodeURI(strUri):安全字符(82个) !#$&’()*+,/:;=?@-._~0-9a-zA-Z,不会对分隔 URI 组件的标点符号(;/?:@&=+$,#)进行转义编码,编码的字符范围小,被用作对一个完整的URI进行编码
escape(str):安全字符(69个) */@+-._0-9a-zA-Z,建议尽可能的使用这两个函数替代escape进行编码。
但是在ECMA-262标准中仍然保留着 escape的这种编码语法。
encodeURI和encodeURIComponent则使用UTF-8对非ASCII字符进行编码,然后再进行百分号编码。
这是RFC推荐的。因此建议尽可能的使用这两个函数替代escape进行编码。
在js中对应的解码函数为:
decodeURIComponent(strUri);
decodeURI(strUri);
unescape(str);
然后再传递给处理页面,然后由处理页面进行再次解码,这样前面就缺少了一次编码过程,所以前面需要连续两次编码
例外:注意openModelDialog方法(模态窗口),浏览器获取不到参数编码,js中一次编码即可
部分参考:
http://blog.163.com/yaoping1986@126/blog/static/17141746620111155357404/
http://www.cnblogs.com/andiki/articles/1399720.html
InputStreamReader(InputStream in, String charsetName)
创建使用指定字符集的 InputStreamReader。
OutputStreamWriter(OutputStream out, String charsetName)
创建使用指定字符集的 OutputStreamWriter。
第二:处理字符串编码问题:
1、重新对获取的字符串进行编码:Byte[] bytes = str.getBytes(String encodeCharsetName);
2、重新对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 String(str.getBytes("ISO-8859-1"),"UTF-8");
}else{
str = new String(str.getBytes("ISO-8859-1"),"gbk");
}
第三:处理请求参数传递编码问题:
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中,比如使用保留字符的原意,而不是特殊作用。
综上,如果想让保留字符出现在URI中但不起分隔作用就需要对该字符进行编码,比如中文也需要编码才能出现在URI中,编码函数如下:
encodeURIComponent(strUri):安全字符(71个) !’()*-._~0-9a-zA-Z,会对分隔 URI 组件的标点符号(;/?:@&=+$,#)进行转义编码,编码的字符范围大,被用作对URI的单个组件进行编码
encodeURI(strUri):安全字符(82个) !#$&’()*+,/:;=?@-._~0-9a-zA-Z,不会对分隔 URI 组件的标点符号(;/?:@&=+$,#)进行转义编码,编码的字符范围小,被用作对一个完整的URI进行编码
escape(str):安全字符(69个) */@+-._0-9a-zA-Z,建议尽可能的使用这两个函数替代escape进行编码。
PS:
这三个函数对于ASCII字符的编码方式相同,均是使用百分号+两位十六进制字符来表示。
但是对于Unicode字符,escape的编码方式 是%uxxxx,其中的xxxx是用来表示unicode字符的4位十六进制字符。这种方式已经被W3C废弃了。但是在ECMA-262标准中仍然保留着 escape的这种编码语法。
encodeURI和encodeURIComponent则使用UTF-8对非ASCII字符进行编码,然后再进行百分号编码。
这是RFC推荐的。因此建议尽可能的使用这两个函数替代escape进行编码。
在js中对应的解码函数为:
decodeURIComponent(strUri);
decodeURI(strUri);
unescape(str);
js向java/jsp的编码与解码:
js中编码:encodeURI(encodeURI(strUri));decodeURIComponent(decodeURIComponent(strUri));
java/jsp中解码: java.net.URLDecoder.decode(strUri,"UTF-8");
然后再传递给处理页面,然后由处理页面进行再次解码,这样前面就缺少了一次编码过程,所以前面需要连续两次编码
例外:注意openModelDialog方法(模态窗口),浏览器获取不到参数编码,js中一次编码即可
部分参考:
http://blog.163.com/yaoping1986@126/blog/static/17141746620111155357404/
http://www.cnblogs.com/andiki/articles/1399720.html