Используя PrintWriter, я получаю китайские ненужные символы в браузере - PullRequest
2 голосов
/ 01 ноября 2010

Я использую PrintWriter следующим образом, чтобы получить вывод в браузере:

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

Однако, это печатает следующие китайские ненужные символы:

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

Я пытался использовать String вместо StringBuffer, но это не помогло.Я также попытался установить заголовок типа контента следующим образом

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

до получения средства записи ответов, но это также не помогло.

В БД нет проблем с данными, какЯ использовал одни и те же данные для 2 разных целей.В одном я получаю правильный вывод, а в другом я получаю вышеуказанный мусор.Я использовал приведенный выше код в JSP с использованием скриптлетов.Я также дал тип контента для JSP.

Ответы [ 2 ]

2 голосов
/ 03 ноября 2010

Получение китайских символов как Моджибаке означает, что вы неправильно отображаете данные 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");

Обратите внимание, что это не должно использоваться в качестве решения!Это было просто опубликовано в качестве доказательства основной причины проблемы.

0 голосов
/ 03 ноября 2010

Ясно, что у вас есть какая-то проблема с кодировкой, но я предполагаю, что это на стороне сервера или базы данных, а не в браузере.

В БД нет проблем сданные, поскольку я использовал одни и те же данные для 2 разных вариантов, но в одном я получаю правильный вывод n в другом мусоре.

Я не считаю этот аргумент убедительным.На самом деле, я думаю, что вы, возможно, упускаете из виду реальную причину проблемы.

Я думаю, что вам нужно сделать, это добавить некоторую регистрацию на стороне сервера, чтобы захватить то, что в действительности находится в том StringBuffer, который вы отправляетек PrintWriter

Кроме того, посмотрите, что отличается в том, как на стороне сервера обрабатываются «2 разные опции».(Что вы подразумеваете под этой фразой?).

Наконец, предоставьте немного РЕАЛЬНОГО кода, а не только 3 строчных фрагмента, которые не будут компилироваться.

...