式,并送到了操作系 统的输出服务中。因为我们操作系统是中文系 统,所以往终端显示设备上打印 字符时使用的也是 GBK 编码。如果到这一步,我们的字符其实不再是 GBK 编码的 话,终端就会显示出乱码。 那么,在 eclipse 运行带中文字符的 JAVA 文件,控制台显示了乱码,是在 哪一步转换错误呢?我们一步步来分析。 - 保存 JAVA 文件成 UTF-8 后,如果再次打开你没有看到乱码,说明这步是 正确的。 - 用 eclipse 本身来编译运行 JAVA 文件,应该没有问题。 - System.out.println 会把内存中正确的 UNICODE 字符编码成 GBK,然后 发到 eclipse 的控制台去。 等等, 我们看到在 Run Configuration 对话框的 Common 标签里,控制台的字符编码被设置成了 UTF-8!
问题就在这里。 System.out.println 已 经把字符编码成了 GBK,而控制台仍然以 UTF-8 的格式 读取字符,自然会出现乱码。 将控制台的字符编码设置为 GBK,乱码问题解决。 (这里补充一点:eclipse 的控制台编码是继承了 workspace 的设置的, 通常控制台编码里没有 GBK 的选项而且不能输入。我们可以先在 workspace 的
第 2 页 共 8 页
编码设置中输入 GBK,然后在控制台的设置中就可以看到 GBK 的选项了,设置好 后再把 workspace 的字符编码设置改回 utf- 8 就是。) 二、JSP 文件中硬编码中文字符,在浏览器上显示乱码。 我们用 eclipse 编写一个 JSP 页面,使用 tomcat 浏览这个页面时,整个页 面的中文字符都是乱码。这是什么原因呢? JSP 页面从编写到在浏览器上
浏览,总共有四次字符编解码。 以某种字符编码保存 JSP 文件 2. Tomcat 以指定编码来读取 JSP 文件并编译 3. Tomcat 向浏览器以指定编码来发送 HTML 内容 4. 浏览器以指定编码解析 HTML 内容 这里的四次字符编解码,有一次发生错误最终显示的就会是乱码。我们依次 来分析各次的字符编码是如何设置的。 - 保存 JSP 文件,这是在编辑器中设置的,比如 eclipse 中,设置文件字符 类型为 utf-8。 - JSP 文件开头的<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>, 其中 pageEncoding 用来告诉 tomcat 此文件所用的字符编码。这个编码应该与 eclipse 保存文件用的编码一致。 Tomcat 以此编码方式来读取 JSP 文件并编译。 - page 标签中的 contentType 用来设置 tomcat 往浏览器发送 HTML 内容所 使用的编码。这个编码会在 HTTP 响应头中指定以通知浏览器。 - 浏览器根据 HTTP 响应头中指定的字符编码来解析
HTML 内容。如 HTTP/1.1 200 OK Date: Mon, 01 Sep 2008 23:13:31 GMT Server: Apache/2.2.4 (Win32) mod_jk/1.2.26 Vary: Host,Accept-Encoding Set-Cookie: JAVA2000_STYLE_ID=1; Domain=java2000.net; Expires=Thu, 03-Nov-2011 09:00:10 GMT; Path=/ Content-Encoding: gzip Transfer-Encoding: chunked
第 3 页 共 8 页
Content-Type: text/html;charset=UTF-8 另外,HTML 中有个标签
中也指定了 charset。不过这个字符编 码只有在当网页保存在本地作为静态网页时有效,因为没有 HTTP 头,所以 浏览 器根据此标签来识别 HTML 内容的编码方式。 现在在 JSP 文件中硬编码出现乱码的机会比较小了,因为大家都用了如 eclipse 的编辑器,基本上可以自动保证这几个编码设置的正确性。现在更多碰 到的是在
JSP 文件中从其他数据源中读取中文字符所产生的乱码问题。 三、在 JSP 文件中读取字符文件并在页面中显示,中文字符显示为乱码。 比如,我们在 JSP 文件中使用以下代码 <% BufferedReader reader = new BufferedReader(new FileReader("D:““test.txt")); String content = reader.readLine(); reader.close(); %> <%=content%> test.txt 里保存的是中文字符,但在浏览器上看到的乱码。这是个经常见 到的问题。我们继续用之前的方法一步步