2

PrintWriterブラウザで出力を取得するために次のように使用しています。

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

ただし、これは次の中国語のジャンク文字を出力します。

格㸳潃浭湥獴⼼㍨‾琼扡敬㰾牴戠奉納汯牯✽䔣䔷䔷❆㰾摴倾獯整⁤湏›〱㈭ⴷ〲〱ㄠ㨴㌰㌔㨡祂›教桳楮縠歡⠊湹祡歡捀獩潣挮浯਩硅散汬湥㱴琯㹤⼼牴㰾牴戠奉納汯牯✽䔣䔷䔷❆㰾摴㰾琯㹤⼼牴㰾牴户䱣户䱔䯔且且且且且且且且且䯔且且䯔且乔摴倾獯整⁤湏›〱㈭ⴷ〲〱ㄠ㨴㐰ㄺ਱祂›教桳慷瑮丠祡歡⠊湹祡歡捀獩潣挮浯਩敶祲朠潯㱤琯羰㹉㹼汯牯✽䔣䔷䔷❆㰾摴㰾琯㹤⼼牴㰾牴戠奉献汯牯✽䔣䔷䔷❆㰾摴倾獯整⁤湏›〱㈭ⴷ〲〱ㄠ㨴㜱挺稸਼教楂›丠祡歡⠊湹祡歡捀獩潣挮浯਩桔獩椠⁳潴琠獥㱴琯㹤⼼牴㰾琯扡敬㰾牢⼠‾格㸳潐瑳夠畯⁲潃浠湸楠㹤瑣潩㵮䌢浯敭瑮即牥汶瑥•敭桴素直∽敧≴渠浡㵥敬挢浯敭瑮潆浲•湯畳浢瑩∽爠瑥牵慖楬慤整潆浲⤨∼†眠摩桴∽〳∰栠楥桧㵴㌢〰㸢ठ琼㹲琼㹤氼扡汥映牯∽θ敭㸢潃浭湥㩴猼慰霊汣獡㵳洢湡呤汃獉瞳⨾⼼汥㰾牢㸯琼硥慴敲⁡θ敭∽潣瑮湥≴椠㵤挢浯敭瑮硔䅴敲≡挠慬獳∽整瑸牡蠣慥氠牡蠣敧•潣獬∽㠲•潲獷∽整∼∼∼瑸牡蠣慥㰾琯㹤⼼牴㰾牴㰾摴㰾慬敢潦㵲渢浡≥举浡㩥猼慰霊汣獡㵳洢湡呤汃獡≳⨾⼼灳湡㉑灳湡㉑灳港港港椠㵤渢浡≥琠灹㵥琢硥≴渠浡㵥渢浡≥挠慬獳∽θ敭•慶畬㵥∢洠硡敬杮桴∽㔲∵†楳敺∽㘳⼢㰾琯羰㉼摴㰾慬敢潦㵲攢慭汩㸢ⵅ慍汩㰺灳湡挠慬獳∽慭摮䍔慬獳㸢㰪猯慰謝㹮⼼慬㹬戼⽲㰾湩異≴摩絡絥楠≡絥楠硥≴渠浡㵥攢慭汩•汣獡㵳攢慭汩•慶畬㵥∢洠硡敬杮桴∽㔲∵†楳敺∽㘳⼢㰾琯㹤⼼牴㵰牴㹾攢慭汩㹠琁㰁繠㹠猢扵業≴†θ敭∽潰瑳•慶畬㵥倢獯≴㸯⼼摴㰾琯㹲⼼慴汢㹥⼼潦浲

Stringの代わりに使用しようとしましStringBufferたが、役に立ちませんでした。また、次のようにコンテンツタイプヘッダーを設定しようとしました

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

応答ライターを取得する前に、それも役に立ちませんでした。

DBでは、同じデータを2つの異なる目的で使用したため、データに問題はありません。ある場合は正しい出力が得られますが、他の場合は上記のジャンクが得られます。スクリプトレットを使用して、JSP で上記のコードを使用しました。また、JSP のコンテンツ タイプも指定しました。

4

2 に答える 2

2

漢字をモジバケとして取得すると、UTF-16LE データが誤って UTF-8 として表示されていることがわかります。UTF16-LE は、各文字を 4 バイトで格納します。UTF-8 では、通常、4 バイトのパネルに CJK (中国語/日本語/韓国語) 文字が含まれます。

これを修正するには、データを UTF-16LE として表示するか、データを最初から UTF-8 として DB に保存する必要があります。それらをUTF-8として表示しようとしているので、UTF-16LEの代わりにUTF-8を使用するようにDBを再構成/変換する必要があると思います。


具体的な問題とは関係ありませんが、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

明らかに、ここでなんらかのエンコーディングの問題がありますが、ブラウザではなく、サーバーまたはデータベース側に問題があると思います。

DBでは、2つの異なるオプションに同じデータを使用したため、データに問題はありませんが、1つは他のジャンクで正しい出力nを取得します。

私はその議論に説得力があるとは思わない。実際、問題の本当の原因を見落としている可能性があると思います。

あなたがする必要があると思うのは、サーバー側のログを追加して、実際に何StringBufferを送信しているのかをキャプチャすることですPrintWriter

また、サーバー側が「2 つの異なるオプション」を処理する方法について、何が違うのかを見てください。(そのフレーズはどういう意味ですか?)。

最後に、コンパイルできない 3 行のスニペットだけでなく、実際のコードを提供してください。

于 2010-11-03T07:36:46.730 に答える