我使用下面的代码来使用printwriter在浏览器上获取输出。
String b= new String(a.getBytes("UTF-16LE"),"UTF-8");
输出对IE很好,但在Firefox中我得到了
< h 3 > C o m m e n t s < / h 3 > < t a b l e > < t r b g c o l o r = ' # E 7 E 7 E F ' > < t d > P o s t e d O n : 1 2 - 1 3 - 2 0 1 0 1 0 : 3 8 : 2 4 , B y :
这是面临的问题的示例输出。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"w3.org/TR/html4/loose.dtd">;
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"
CONTENT="no-cache">
</head>
<body>
<form name="form" method="post">
<%
String theString = null;
PrintWriter pw = null;
String cmntbox = "";
ServletOutputStream outStream = null;
try {
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = null;
InputStream sImage;
con = DBConnection.getConnection();
sql = SELECT statement
pstmt = con.prepareStatement(sql);
rs = pstmt.executeQuery();
while (rs.next()) {
byte bytearray[] = new byte[1048576];
String newLine = System.getProperty("line.separator");
sImage = rs.getBinaryStream(1);
StringWriter writer = new StringWriter();
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
pw =response.getWriter();
IOUtils.copy(sImage, writer);
theString = writer.toString();
pw.write(theString);
pw.flush();
cmntbox = Utility.getCommentPage(id,prcs_area);
String comment = new String(cmntbox.getBytes("UTF-16LE"),"UTF-8");
pw.write(comment);
pw.flush();
pw.close();
}
答案 0 :(得分:2)
String comment = new String(cmntbox.getBytes("UTF-16LE"),"UTF-8");
几乎肯定是错的。您从Utility.getCommentPage
获得的字符串应包含您想要的字符。使用一种编码将这些字符转换为字节,然后使用另一种编码将字节转换回字符,将导致您看到的内容。
特别是,典型HTML的UTF-16编码中的每个其他字节都为零。零是一个完全有效的字节,可编码为UTF-8中的单个NUL字符。 IE可能会想,“显然这是错误的,所以我会尽力提供帮助并做我认为你的意思”;而Firefox只是显示你想要的内容。
如果您跳过转换并执行
会发生什么pw.write(cmntbox);
直接?在您执行response.setContentType
之前,您已使用charset=
执行了response.getWriter
。当你然后write
一个字符串时,它应该为你做字符编码。
答案 1 :(得分:1)
我认为您的问题是firefox不知道您正在尝试显示unicode。您是否尝试过输入正确的doctype和内容类型?
内容类型应为&lt; meta http-equiv =“Content-Type”content =“text / html; charset = utf-8”&gt;