do{
len = is.read(buffer);
if (len>0) {
if(outstring==null) outstring=new StringBuffer();
outstring.append(new String(buffer,0,len, "UTF8"));
}
}while(len>0);
Это не очень хороший способ декодирования UTF-8, поскольку символы могут быть повреждены на границах буфера ( подробности здесь ). UTF-8 - это кодировка с переменной шириной , поэтому для хранения символов требуется от одного до четырех байтов. Если это работает, вам просто везет. Лучше кодировать и декодировать, используя классы Reader / Writer ( подробности здесь ).
Полагаю, вам нужно вызвать setContentType или setCharacterEncoding до вызова getWriter
. Я не думаю, что достаточно позвонить setHeader
напрямую.
Этот код сервлета будет правильно кодировать и передавать строку образца в виде данных UTF-8:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/xml; charset=UTF-8");
PrintWriter pw = response.getWriter();
pw.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
pw.write("<data>K\u00F6nigsberger</data>");
pw.flush();
pw.close();
}
Обратите внимание, что я использую escape-последовательность \u00F6
для вывода символа U + 00F6 ( & # x00F6; ), чтобы не повредить символ в моем текстовом редакторе или во время компиляции процесс ( см. подробнее ).
Возможно ли, что данные неправильно интерпретируются на клиенте? Проверьте вывод с помощью шестнадцатеричного редактора.
Кодированный как UTF-8, "K\u00F6nigsberger"
должен стать байтовой последовательностью:
4b c3 b6 6e 69 67 73 62 65 72 67 65 72
... где символ U + 00F6 ( & # x00F6; ) становится c3 b6
. Вы можете использовать такой код, чтобы проверить свои значения:
public static void main(String[] args) throws IOException {
String konigsberger = "K\u00F6nigsberger";
dumpHex(System.out, konigsberger.getBytes("UTF-8"));
}
private static void dumpHex(PrintStream out, byte[] data) {
for (byte b : data) {
out.format("%02x ", b);
}
out.println();
}