【问题标题】:Turkish characters are not shown properly on the HTML土耳其语字符未在 HTML 上正确显示
【发布时间】:2021-03-16 15:09:38
【问题描述】:

我正在尝试使用 servlet 代码将某些内容打印到 HTML 网页。 我使用 UTF-8 编码,但土耳其语字符在网页上显示不充分。

我如何定义 UTF-8 编码:

  String htmlStart =  "<html>\n" +
                    "<head>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />
 <title>" + title + "</title>
</head>\n" +
                    "<body bgcolor = \"#f0f0f0\">\n" +
                       "<h1 align = \"center\">" + title + "</h1>\n" +
                       "<ul>\n" + "  <li><b>"+url + "</b>" +  "</ul>\n"; 

我如何在 html 中打印单词:

 for (String token : parsed) {
                med+= "<p>" +  token + "</p>\n"; 
                System.out.println(token);
            }   

以上代码向Eclipse控制台写入了什么:

Muğla Sıtkı Koçman Üniversitesi

我在生成的 HTML 中看到的内容:

Mu?la S?tk? Koçman Üniversitesi

【问题讨论】:

  • 您是否尝试在浏览器中阅读它?在我看来,您的控制台似乎不支持 Unicode 字符。将其写入文件并使用浏览器或编辑器(支持 UTF-8)读取。不要相信控制台会显示正确的字符
  • 好的,看来您正在使用 Eclipse 控制台。我已将 Eclipse 标记添加到您的问题中。
  • 我确实尝试了几种浏览器,例如 Firefox、Chrome 和 Opera,但没有任何改变。我认为问题不在于浏览,我们必须专注于如何在 Java 中编码 HTML。
  • 由于您的问题与在 Java 中指定编码有关,我将您的 html 标记替换为 java

标签: java eclipse encoding utf-8 turkish


【解决方案1】:

您已经为生成的 HTML 指定了 "charset=utf-8",因此在浏览器中读取/呈现数据应该不是问题(正如您所建议的那样)。

但是您的控制台示例代码不正确,因为它没有指定要使用 UTF-8。默认行为是在创建数据时使用您平台的默认编码,这可能不是您想要的。

在示例代码中解决此问题的最简单方法是通过调用 setOut()System.out 重新分配给使用 UTF-8 的 PrintStream

String text = "Muğla Sıtkı Koçman Üniversitesi";
System.out.println(text + " (default PrintStream)");         
System.setOut(new PrintStream(System.out, true, "UTF8"));
System.out.println(text + " (UTF-8 PrintStream)");  

但是,如果我从 Windows 命令提示符运行该代码,我会得到这样的混乱:

Mu?la S?tk? Koçman Üniversitesi (default PrintStream)

Muğla Sıtkı Koçman Üniversitesi (UTF-8 PrintStream)

第一行失败(就像你的一样),因为数据是使用默认编码写入和读取的,在我的机器上是 Cp437。第二行失败,因为虽然数据被正确写入为 UTF-8,但仍然使用 Cp437 呈现。

要解决此问题,请在运行代码之前(至少在 Windows 上)通过在控制台中指定 chcp 65001 将控制台的代码页显式设置为 UTF-8。然后你会看到第二行正确渲染了,因为它被写入和读取为 UTF-8:

Mu?la S?tk? Koman niversitesi (default PrintStream)

Muğla Sıtkı Koçman Üniversitesi (UTF-8 PrintStream)

注意事项:

  • 您没有显示生成的 HTML 是如何在您的 servlet 中创建的,但如果您确保它被编写为 UTF-8,您应该没问题。
  • 如果您仍然卡住,请更新您的问题以显示您的 servlet 的完整源代码,如果它太大 create a Minimal, Reproducible Example
  • 我认为 Eclipse 在后台执行操作以允许输出在其控制台中正确呈现是没有帮助的。我不确定 Eclipse 团队为什么决定这样做,因为它掩盖了代码中的一个潜在问题。

【讨论】:

  • 关于 Eclipse 非常有用的优点。对生产没有帮助。
【解决方案2】:

感谢您的回复,帮助我解决了这个问题。正如我在修复错误时遇到的大多数挑战一样,努力创建一个最小的、可重复的示例再次有所帮助。我找到了罪魁祸首,删除它后,我的代码按我的意愿工作,尽管我仍然不知道它如何影响 UTF-8 编码:

response.getWriter().append("Served at: ").append(request.getContextPath()); 

您可以在下面看到所有最小的、可重现的 servlet 代码:

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.PrintWriter;

import javax.print.attribute.standard.Severity;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
   
/**
 * Servlet implementation class MyServlet
 */
@WebServlet("/Minimal")
public class Minimal extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Minimal() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        // TODO Auto-generated method stub
         
        System.setOut(new PrintStream(System.out, true, "UTF8"));
        
        
        // The culprit code part which effects UTF-8's proper working 
        //response.getWriter().append("Served at: ").append(request.getContextPath());
        
        response.setContentType("text/html; charset=utf-8");
        response.setCharacterEncoding("UTF-8");
        PrintWriter out = response.getWriter();
         
          String title = "GEMED Software Requirements";
          String docType =  "<!doctype html public \"-//w3c//dtd html 4.0 " +
             "transitional//tr\">\n";
             
          String url = request.getParameter("site11");  
         
          String htmlStart =  docType + "<html>\n" +
                    "<head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /> <title>" + title + "</title></head>\n" +
                    "<body bgcolor = \"#f0f0f0\">\n" +
                       "<h1 align = \"center\">" + title + "</h1>\n" +
                       "<ul>\n" + "  <li><b>"+url + "</b>" +  "</ul>\n"; 
          
         String med2 = "Türkçe: Muğla Sıtkı Koçman Üniversitesi Rektörü Çalışmayan Öğrencilerden Şikayetçi......" ;
          String htmlEnd =  "</body>" +  "</html>";
    
          out.println( htmlStart + med2 +  htmlEnd); 
    
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

【讨论】:

  • 几点:[1]你不需要在你的servlet代码中调用System.setOut(),所以去掉它。这仅与您问题中的控制台应用程序代码相关。 [2] 你也不需要打电话给setCharacterEncoding()。这是多余的,因为您已经调用了setContentType()。见Encoding and Servlet API: setContentType or setCharacterEncoding。 [3] 你的问题是你打电话给response.getWriter().... 之前 setContentType()。如果它被放置在 setContentType() 的调用之后,它应该可以工作。
猜你喜欢
  • 1970-01-01
  • 2017-09-29
  • 2015-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-07
相关资源
最近更新 更多