使用PrintWriter,我在浏览器中获取中文垃圾字符

时间:2010-11-01 12:28:47

标签: java jsp unicode character-encoding printwriter

我使用PrintWriter按如下方式在浏览器中获取输出:

PrintWriter pw = response.getwriter();
StringBuffer sb = getTextFromDatabase();
pw.print(sb);

然而,这会打印以下中文垃圾字符:

  

格㸳潃浭湥獴⼼㍨~琼扡敬㰾牴戠捧汯牯✽䔣䔷䔷❆㰾摴倾獯整⁤湏>〱㈭ⴷ〲〱ㄠ㨴㌰㔺਱祂>教桳慷瑮丠祡欢⠊湹祡欢捀獩潣挮浯਩硅散汬湥㱴琯㹤⼼牴㰾牴戠捧汯牯✽䔣䔷䔷❆㰾摴㰾琯㹤⼼牴㰾牴戠捧汯牯✽䔣䔷䔷❆㰾摴倾獯整⁤湏>〱㈭ⴷ〲〱ㄠ㨴㐰ㄺ਱祂>教桳慷瑮丠祡欢⠊湹祡欢捀獩潣挮浯਩敶祲朠浔㱤琯㹤⼼牴㰾牴戠捧汯牯✽䔣䔷䔷❆㰾摴㰾琯㹤⼼牴㰾牴戠捧汯牯✽䔣䔷䔷❆㰾摴倾獯整⁤湏>〱㈭ⴷ〲〱ㄠ㨴㜱㌺ਸ਼祂>教桳慷瑮丠祡欢⠊湹祡欢捀獩潣挮浯਩桔獩椠⁳潴琠獥㱴琯㹤⼼牴㰾琯扡敬㰾牢⼠〜格㸳潐瑳够畯⁲潃浭湥㱴栯㸳㰠潦浲愠琐潩㵮䌢浯敭瑮即牥汶瑥•敭桴挚∽敧≴渠浡㵥挢浯敭瑮潆浲•汤畳浢莹∽爠瑥牵慖楬慤整潆浲⤨∻~琼扡敬†眠摩桴∽〳∰栠楥桧㵴㌢〰㸢ठ琼㹲琼㹤氼扡汥映牯∽虑敭㸢潃浭湥㩴猼汣獡㵳洢湡呤汃獡≳⨾⼼灳湡㰾氯扡汥㰾牢㸯琼硥慑敲⁡虑敭∽潣瑮湥≴椠㵤挢浯敭瑮硔䅴敲≡挠慬獳∽整瑸牡慥氠牡敧•潣獬∽㠲•潲犷∽:㸠⼼整瑸牡慥㰾琯㹤⼼牴㰾牴㰾摴㰾慬敢潦㵲沨浡≥举浡㩥猼慰汣獡㵳洢湡呤汃獡≳⨾⼼灳湡㰾氯扡汥㰾牢㸯椼灮瑵椠㵤沨浡≥琠灹㵥琢硥≴渠浡㵥沨浡≥挠慬獳∽虑敭•庆畲㵥∢洠硡敬杮桴∽㔲∵†楳驱∽㘳⼢㰾琯㹤⼼牴㰾牴㰾摴㰾慬敢潦㵲攒慭汩㸢ⵅ愠汩㰺灳湡挠慬獳∽慭摮䍔慬獳㸢㰪猯慰㹮⼼慬敢㹬戼⽲㰾湩异⁴摩∽浥楡≬琠灹㵥琢硥≴渠浡㵥攒慭汩•汣獡㵳攒慭汩•庆畲㵥∢洠硡敬杮桴∽㔲∵†楳驱∽㘳⼢㰾琯㹤⼼牴㰾牴㰾摴㰾湩异⁴琠灹㵥猢扵业≴†虑敭∽溃瑳•庆畲㵥倢獯≴㸯⼼摴㰾琯㹲⼼慑汢㹥⼼潦浲

我尝试使用String代替StringBuffer,但这没有帮助。我还尝试将内容类型标题设置如下

 response.setContentType("text/html;charset=UTF-8");

在收到回复作者之前,但这也没有帮助。

在数据库中,数据没有问题,因为我已经将相同的数据用于两个不同的目的。在一个我得到正确的输出,但在其他我得到上面的垃圾。我使用scriptlet在JSP中使用了上面的代码。我还给了JSP的内容类型。

2 个答案:

答案 0 :(得分:2)

将中文字符设为Mojibake表示您错误地将UTF-16LE数据显示为UTF-8。 UTF16-LE以4个字节存储每个字符。在UTF-8中,4字节面板通常包含CJK(中文/日文/韩文)字符。

要解决此问题,您需要将数据显示为UTF-16LE,或者从头开始将数据作为UTF-8存储在数据库中。由于您尝试将它们显示为UTF-8,我认为您的数据库必须重新配置/转换为使用UTF-8而不是UTF-16LE。


对于具体问题

无关,在数据库中存储HTML(这些字符最初代表的那些)确实是一个坏主意;)这是原始内容:

<h3>Comments</h3> <table><tr bgcolor='#E7E7EF'><td>Posted On: 10-27-2010 14:03:51
, By: Yeshwant Nayak
(ynayak@cisco.com)
Excellent</td></tr><tr bgcolor='#E7E7EF'><td></td></tr><tr bgcolor='#E7E7EF'><td>Posted On: 10-27-2010 14:04:11
, By: Yeshwant Nayak
(ynayak@cisco.com)
very good</td></tr><tr bgcolor='#E7E7EF'><td></td></tr><tr bgcolor='#E7E7EF'><td>Posted On: 10-27-2010 14:17:36
, By: Yeshwant Nayak
(ynayak@cisco.com)
This is to test</td></tr></table><br /> <h3>Post Your Comment</h3> <form action="CommentsServlet" method="get" name="commentForm" onsubmit=" return ValidateForm();"> <table   width="300" height="300">    <tr><td><label for="name">Comment:<span class="mandTClass">*</span></label><br/><textarea name="content" id="commentTxtArea" class="textarea large" cols="28" rows="6" ></textarea></td></tr><tr><td><label for="name">Name:<span class="mandTClass">*</span></label><br/><input id="name" type="text" name="name" class="name" value="" maxlength="255"  size="36"/></td></tr><tr><td><label for="email">E-Mail:<span class="mandTClass">*</span></label><br/><input id="email" type="text" name="email" class="email" value="" maxlength="255"  size="36"/></td></tr><tr><td><input  type="submit"  name="post" value="Post"/></td></tr></table></form

以下是将错误编码的中文翻译成普通字符的方法:

String incorrect = "格㸳潃浭湥獴⼼㍨‾琼扡敬㰾牴戠捧汯";
String original = new String(incorrect.getBytes("UTF-16LE"), "UTF-8");

请注意,这不应该用作解决方案!它只是作为问题根源的证据发布的。

答案 1 :(得分:0)

显然,你在这里遇到了某种编码问题,但我猜它是在服务器端或数据库端,而不是在浏览器中。

  

在数据库中没有数据问题,因为我已经为2个不同的选项使用了相同的数据,但在其中一个我在其他垃圾中得到正确的输出n。

我认为这个论点并不令人信服。事实上,我认为你可能忽略了问题的真正原因。

我认为您需要做的是添加一些服务器端日志记录,以捕获您要发送到StringBuffer

PrintWriter实际内容

另外,看看服务器端处理“2个不同选项”的方式有何不同。 (这句话是什么意思?)。

最后,请提供一些真实的代码,而不仅仅是不能编译的3行代码片段。