【问题标题】:Greek characters display issue Tomcat 7希腊字符显示问题Tomcat 7
【发布时间】:2014-07-15 03:55:06
【问题描述】:

我在显示希腊字符时遇到问题。字符应显示为σ μυστικός αυτό?,但它们显示为ó ìõóôéêüò áõôü? 还有一些其他的希腊字符看起来很好,但上面的文字出现了乱码。

servlet 使用以下代码从 HTML 文件中读取内容:

public String getResponse() {
     StringBuffer sb = new StringBuffer();
             try {
               BufferedReader in = new BufferedReader((new InputStreamReader(new FileInputStream(fn), "8859_1")));
               String line=null;
               while ((line=in.readLine())!=null){
                  sb.append(line);
               }
               in.close();
               return sb.toString();
             }
            }

我在发回响应时将编码设置为UTF-8

       PrintWriter out;
       if ((encodings != null) && (encodings.indexOf("gzip") != 1)) {
          OutputStream out1 = response.getOutputStream();
          out = new PrintWriter(new GZIPOutputStream(out1), false);
          response.setHeader("Content-Encoding","gzip");
       }
       else {
          out = response.getWriter();
       }
       response.setCharacterEncoding("UTF-8");
       response.setContentType("text/html;charset=UTF-8");
       out.println(getResponse());

这些字符在我的本地开发机器(即 Windows)上看起来很好,但在部署在 CentOS 服务器上时出现乱码。两台机器都安装了 JDK7 和 Tomcat 7。

【问题讨论】:

  • 我能想到的一些原因:您确定您从“fn”获得了 ISO-8859-1 编码的字符吗?当你渲染这样的字符时,是在浏览器中吗?对于某些浏览器,您需要添加 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">,或者对于 HTML5:<meta charset="utf-8">,即使您在 HTTP 标头中发送编码。
  • @morgano 我已经使用file -bi 命令验证了 HTML 文件的编码确实是 ISO-8859-1。 HTML 文件也包含<meta http-equiv="Content-Type" content="text/html; charset=utf-8">。此外,如果直接打开 HTML 文件(而不是通过 servlet),字符会显示得很好。
  • file -bi 无法告诉您您的文件是 ISO-8859-1 还是 ISO-8859-7(这只是尽力估计),所以我认为 @JimGarrison 是对的

标签: java tomcat character-encoding


【解决方案1】:

我 99% 确定问题出在您的输入编码(当您读取数据时)。您将其解码为 ISO-8859-1,而它可能是 ISO-8859-7。这会导致您看到的症状。

最简单的检查方法是在十六进制编辑器中打开 HTML 并直接检查字符编码。如果希腊字符每个占用一个字节,那么它几乎肯定是 ISO-8859-7(不是 -1)。如果它们每个占用 2 个字节,那么它就是 UTF-8。

根据您发布的内容,它看起来像 ISO-8859-7。在该字符集中,小写的 sigma σ0xF3,而在 ISO-8859-1 中,相同的代码映射到 ó,这与您显示的数据相匹配。我敢肯定,如果您映射了所有剩余的字符,您会在代码中看到一对一的匹配。也许您的 Windows 系统的默认代码页是 ISO-8859-7?

【讨论】:

  • 我会检查编码。但如果问题出在字符集上,那为什么服务器在 Windows 机器上运行时它看起来很好?
  • 在我知道文件是 UTF-8 还是 ISO-8859-7 之前我无法猜测,但我现在 99.999% 确定是后者。查看我的编辑。
  • 我认为你是对的。我逐个字符匹配,并且似乎文本是ISO-8859-7 编码。现在我的问题是有几个 HTML 文件是ISO-8859-1。是否有任何“通用”方式来读取文件的内容,以便正确读取 ISO-8859-1ISO-8859-7 文件?
  • 没有。为了使单字节字符正确转换为 UTF-16(内部 Java 表示),您必须在打开每个文件时分别告诉系统每个文件的原始编码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 2014-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
相关资源
最近更新 更多