Java 土耳其语字符在HTML上显示不正确
我正在尝试使用servlet代码将某些内容打印到HTML网页。 我使用UTF-8编码,但网页上没有充分显示土耳其语字符 我如何定义UTF-8编码:Java 土耳其语字符在HTML上显示不正确,java,eclipse,encoding,utf-8,turkish,Java,Eclipse,Encoding,Utf 8,Turkish,我正在尝试使用servlet代码将某些内容打印到HTML网页。 我使用UTF-8编码,但网页上没有充分显示土耳其语字符 我如何定义UTF-8编码: String htmlStart = "<html>\n" + "<head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=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";
response.getWriter().append("Served at: ").append(request.getContextPath());
字符串htmlStart=“\n”+
"
“+标题+”
\n“+
“\n”+
“”+标题+“\n”+
“\n”+“- ”+url+“+”
\n”;
如何在html中打印单词:
for (String token : parsed) {
med+= "<p>" + token + "</p>\n";
System.out.println(token);
}
for(字符串标记:已解析){
med+=“”+令牌+”\n”;
System.out.println(令牌);
}
上面的代码写入Eclipse控制台的内容:
穆奥拉大学
我在生成的HTML中看到的内容:
穆拉斯蒂克?科曼大学
您已经为生成的HTML指定了
“charset=utf-8”
,因此在浏览器中读取/呈现数据应该不是问题(如您所建议的)
但是您的控制台示例代码不正确,因为它没有指定要使用UTF-8。默认行为是在创建数据时使用平台的默认编码,这可能不是您想要的
在示例代码中解决此问题的最简单方法是通过调用setOut()
将System.out
重新分配给使用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的完整源代码,如果这个源代码太大
- 我认为Eclipse在幕后做一些事情以允许输出在其控制台中正确渲染是没有帮助的。我不确定Eclipse团队为什么决定这么做,因为它掩盖了代码中的一个潜在问题
- 非常感谢您的回复,帮助我解决了这个案件。正如我在修复bug方面遇到的大多数挑战一样,努力创建一个最小的、可复制的示例再次起到了帮助作用。我找到了罪魁祸首,在删除它之后,我的代码按照我的意愿工作,尽管我仍然不知道它是如何影响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";
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);
}
}
import java.io.IOException;
导入java.io.OutputStreamWriter;
导入java.io.PrintStream;
导入java.io.PrintWriter;
导入javax.print.attribute.standard.Severity;
导入javax.servlet.ServletException;
导入javax.servlet.annotation.WebServlet;
导入javax.servlet.http.HttpServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
/**
*Servlet实现类MyServlet
*/
@WebServlet(“/Minimal”)
公共类最小扩展HttpServlet{
私有静态最终长serialVersionUID=1L;
/**
*@参见HttpServlet#HttpServlet()
*/
公共最低限额(){
超级();
//TODO自动生成的构造函数存根
}
/**
*@参见HttpServlet#doGet(HttpServletRequest请求,HttpServletResponse响应)
*/
受保护的void doGet(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException{
//TODO自动生成的方法存根
系统放样(新打印流(System.out,true,“UTF8”);
//影响UTF-8正常工作的罪犯代码部分
//response.getWriter().append(“服务于:”).append(request.getContextPath());
setContentType(“text/html;charset=utf-8”);
响应。setCharacterEncoding(“UTF-8”);
PrintWriter out=response.getWriter();
字符串title=“GEMED软件需求”;
字符串docType=“\n”;
字符串url=request.getParameter(“site11”);
字符串htmlStart=docType+“\n”+
“”+标题+“\n”+
“\n”+
“”+标题+“\n”+
“\n”+“- ”+url+“+”
\n”;
String med2=“Türkçe:Muğla SıtkıKoçmanÜniversitesi Rektörıalı351; mayanğrencilerdenŞikayetçi……”;
字符串htmlEnd=“”+”;
out.println(htmlStart+med2+htmlEnd);
}
/**
*@请参阅HttpServlet#doPost(HttpServletRequest请求,HttpServletResponse响应)
*/
受保护的void doPost(HttpServletRequest请求、HttpServletResponse响应)引发ServletException、IOException{
//TODO自动生成的方法存根
doGet(请求、响应);
}
}
您是否尝试在浏览器中阅读它?在我看来,您的控制台似乎不支持Unicode字符。将其写入文件并使用浏览器或编辑器(支持UTF-8)读取。不要信任控制台来显示正确的字符OK,看起来您正在使用Eclipse控制台。我在你的问题中添加了Eclipse标签。我在Firefox、Chrome和Opera等浏览器上进行了尝试,但没有任何改变。我认为问题不在于浏览,我们必须关注如何用Java编码HTML。因为您的问题与用Java指定编码有关,所以我将您的HTML
标记替换为ja