来分析输入和输出流 test.txt 是以某种编码方式保存中文字符,比如 UTF-8。 2. BufferedReader 直接读取 test.txt 的字节内容并以默认方式构造字符 串。分析 BufferedReader 的代码,我们可以看到 BufferedReader 调用了 FileReader 的 read 方法, FileReader 又调用了 FileInputStream 的 native 的 而 read 方法。所谓 native 的方法,就是操作系统底层方法。那么我们操作系统是 中文
系统,所以 FileInputStream 默认用 GBK 方式读取 文件。因为我们保存 test.tx
t 用的是 UTF-8,所以在这里读取文件内容使用 GBK 是错误的编码。 3. <%=content%>其实就是 out.print(content),这里又用到了 HTTP 的输 出流 JspWriter,于是字符串 content 又被以 JSP 的 page 标签中指定的 UTF-8 方式编码成字节数组被发送到浏览器端。 4. 浏览器以 HTTP 头中指定的方式解码字符,这时无论是用 GBK 还是 UTF-8 解码,显示的都是乱码。
第 4 页 共 8 页
可见,我们字符编码转换在第二步时出错了,UTF-8 的字符串被当做 GBK 读 入了内存中。 解决这个乱码问题有两种方法,一是把 test.txt 用 GBK 保存,则 FileInputStream 能正确读入中文字符;二是使用 InputStreamReader 来转换字 符编码,如 InputStreamReader sr = new InputStreamReader(new FileInputStream("D:““test.txt"),"utf-8"); BufferedReader reader = new BufferedReader(sr); 这样,JAVA 就会用 utf-8 的方式来从文件中读取字符数据。 另外,我们可以通过在 java 命令后带上 Dfile.encoding 参数来指定虚拟 机读取文件使用的默认字符编码,例如 java -Dfile.encoding=utf-8 Test,这 样,我们在 JAVA 代码里用 System.getProperty("file.encoding")取到的值为 utf-8。 四、JSP 读取 request.getParameter 里的中文参数后,在页面显示为乱码。 在 JAVA 的 WEB 应用中, request 对象里的 parameters 的中文处理一直是 对 常见也最难搞的一只大怪兽。经常是刚搞定了这边,那 边又出了乱 码。而导致 这种复杂性的,主要是此过程中字符编解码次数非常多,而且无论是浏览器还是 WEB 服务器特别是 TOMCAT 总是不能给我们一个比较满意的支持。 首先我们来分析用 GET 方式上传参数的乱码情况。 例如我们在浏览器地址栏输入以下 URL: localhost:8080/test/test.jsp?param=大家好 我们的 JSP 代码如此处理 param 这个参数: 《% String text = request.getParameter(“param”); %》 《%=text%》 而就这么简单的两句代码,我们很有可能在页面上看到这样的乱码:? ó???? 网上对处理 request.getParamter 中的乱码有很多文章和方法, 也都是正确 的,只是方法太多让人一直不明白到底是为什么。这里给大家分析一下到底是怎 么一回事。 首先,我们来看看与 request 对象有哪些相关的编码设置: 1. JSP 文件的字符编码
第 5 页 共 8 页
2. 请求这个带参数 URL 的源页面的字符编码 3. IE 的高级设置中的选项“总以 utf-8 方式发送 URL 地址” 4. TOMCAT 的 server.
xml 中配置 URIEncoding 5. 函数 request.setCharacterEncoding() 6. JS 的 encodeURIComponent 函数与 JAVA 的 URLDecoder 类 这么多条相关编码设置,也难怪大家被搞得头晕了。这里给大家根据各种情 况给大家一一分析一下。 由这个表我们可以看到,IE 的“总以 utf-8 方式发送 URL 地址”设置并不影响
对 parameter 的解析, 而从页面请求 URL 和从地址栏输入 URL 居然也有不同的表 现。 根据这个表列出的现象,大家只要用 smartSniff 抓几个
网络包,并稍稍调 查一下 TOMCAT 的
源代码,就可以得出以下结论: 1. IE 设置中的“总以 utf-8 方式发送 URL 地址”只对 URL 的 PATH 部分起 作用,对查询字符串是不起作用的。也就是说,如果勾选了这个选项,那么类似 localhost:8080/test/大家好.jsp?param=大家好这种 URL,前一个 “大家好”将被转化成 utf-8 形式,而 后