2

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

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

但是,这会打印以下中文垃圾字符:

格潃潃捵稵筴整渥獴⼥獴⼉牨购整戠扡敬㰨牴戠扡敬㰨牴戠扡敬㰨牴戠扡敬㰨牴戠扡敬㰨牴戠扡扡敬㰨牴戠扦扡敬㰨牴戠扦扡敬㰨牴戠摴倾獴牉䔣䔷丽䔣䔷丕湏›〱㍷牨贷⡌〲〱ㄠ稲桌㡌〲〱ㄠ牴㡌〲〱ㄠ牴㡌㡌㡰㔺਱›欢⠊湹祡欢捀獩潣挮浯਩硅散汬湥㱴琯㹤⼼牴㰾牴戠捧汯牯✽䔣䔷䔷❆㰾摴㰾琯㹤⼼牴㰾牝戠捧汯牔✽㈠捧汯牯✽摴倾獯整⠊湹祡整⠊湹祡捀獩潣祡浯਩敶祲扜浔浔浔㉠ㄺ਱扪扷桠㠀ㄺ਱洍扷桳桳类瑮丠硥欢⠊湹祡欢⠊湹祡浯਩敶祡洵浔਩敶祲洵浔浔浔㱤琮洉洠浔浔㱤琮洲浔浔⼼汯牯✆㽜丣䔷䔷❆罜䰾⑴㰾琯扴教戠捧汯牯✤氾摴倾獯✤湏›〱㑈㈤湏›〱㑈扪戠戠捧汯牯✤氾摴倾獯ਁ湏›〱㈮つ湏›〱㈑丠祡欢⠊湹祡欢捀獩潣挮浯਩桔獩椠⁳潴琠獥㱴琯㹤⼼牴㰾琯扡敬㰾牢⼠‾格㸳潐瑳够畯⁲潃浭湥㽴潴浯㸳㰰潩㵮琼䌢浯敭瑮即牥汶瑥•敭桴牵挚∽敧≴渠浡㵥挢浯敭瑮潆浲•汤畳浢莹∽爠瑥慖楬慤整潆浲⤨∻‾扡敬†眠摩桴∽〳∰栠楥桧㵴㌢〰㸢ठ琼㹲琼㹤氼扡汥牯∽映虑敭㸢潃浭湥㩴猼慰湥㩴猼慰汣獡㵳洢湡声道汃硳洢湡声道汃硳洢湡声道汃硳扳⾾⼼桢汥㰾牢㸯琼硥敲击⁡虑敭∽潣瑮湥≴椠㵤挢浯敭瑮硔䅴敲≡挠慬獳∽整瑸牡慥氠牡敧•潣獬∽㠲•潲犷∽㸠∶⼼整瑸牡慥㰾琯㹤⼼牴㰾牴㰾摴㰾慬夸潦㵲沨浡≥举浡㩥猼慰汣獡㵳洢湡湿地汃獡≳⨾⼼灳湡㰾扡扡漥㰾㸯椠㵤沨浡≥琴灹㵥琢硥≴浡㵥沨浠≥挠慬獳∽虑敭•庆畲㵥∢洠硡敬杮桴∽㔲∵†楳驱∽㘳⼢㰾琯㹤⼼牴㰾牳摴㰾慬敢潦㵲攒慭汩㸢ⵅ愠汩㰺灳湡挠慬獳∽慭摮䍔慬獳㸢㰪猯慰㹮⼠慬㹬戼⽲㰾湩⁴摩∽浥楡≬硥≴渠浡㵥攒慭汩•汣獡㵳攒慭汩•庆畲㵥∢洠硡敬杮桴∽㔲∵†楳驱∽㘳⼢㰾琯㹤⼼牴㰾祴㰾摴㰾㹩⁴琠牴猢扵业≴†虑敭∽溃瑳•庆畲㵥倢獯≴㸯⼼摴㰾琯㹲⼼避汢㹥⼼潦浲

我尝试使用String而不是StringBuffer,但这没有帮助。我还尝试将内容类型标头设置如下

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

在得到响应作者之前,但这也没有帮助。

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

4

2 回答 2

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");

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

于 2010-11-03T12:17:14.920 回答
0

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

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

我觉得这个论点没有说服力。事实上,我认为你可能忽略了问题的真正原因。

我认为您需要做的是添加一些服务器端日志记录来捕获StringBuffer您发送到的实际内容PrintWriter

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

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

于 2010-11-03T07:36:46.730 回答