xml输出中的nolatin字符

编辑:我硬编码的字符,并使用repsonse作家写它,它仍然出来是K nigsberger

response.setCharacterEncoding("UTF-8");

            response.setContentType(contentType);
            //if(contentType!=null)response.setHeader("Content-Type",contentType);
            Writer writer = response.getWriter();//new OutputStreamWriter(response.getOutputStream(),"UTF-8");
            System.err.println("character encoding is "+response.getCharacterEncoding());


            writer.write("Königsberger ");
            writer.flush();

编辑:我在调用getWriter()之前尝试setContentType和setContentEncoding,在输出中仍然没有区别:

        if(res.length()>0){
            //pw.write(res);
            response.setCharacterEncoding("UTF-8");
            response.setContentType(contentType);
            //if(contentType!=null)response.setHeader("Content-Type",contentType);
            Writer writer = response.getWriter();//new OutputStreamWriter(response.getOutputStream(),"UTF-8");
            System.err.println("character encoding is "+response.getCharacterEncoding());


            writer.write(res);
            writer.flush();
        }

我正在阅读一些德语字符,然后从java servlet中以xml格式输出它们,以下是我如何使用UTF8读取它们:

int len=0;
        byte[]buffer=new byte[1024];
        OutputStream os = sock.getOutputStream();
        InputStream is = sock.getInputStream();
        query += "rn";
        os.write(query.getBytes("UTF8"));//iso8859_1"));

            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);
System.out.println(outstring);

System.out正确输出字符串:Königsberger

但是,当我从我的servletResponse中使用charset = UTF-8重新绑定这个字符串时,它变得狼吞虎咽:K nigsberger

private void outputResponse(String res, HttpServletRequest request,
            HttpServletResponse response) throws IOException {
        String outputFormat = getOutputFormat(request);
        String contentType=null;
        PrintWriter pw = response.getWriter();
        //response.setCharacterEncoding("UTF-8");
        System.err.println("output "+res);

        contentType= "text/xml; charset=UTF-8";
        res="<?xml version="1.0" encoding="utf-8"?>" + res;

        if(contentType!=null)response.setHeader("Content-Type",contentType);
        if(res.length()>0){
            pw.write(res);
        }
        pw.flush();

    }

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是一种可变宽度编码,因此字符需要存储1到4个字节。 如果它在工作,你就会幸运。 使用Reader / Writer类进行编码和解码更好(详情在这里)。

我相信你在调用getWriter之前需要调用setContentType或setCharacterEncoding。 我认为这不足以直接调用setHeader


这个servlet代码将正确编码和传输样本字符串作为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>Ku00F6nigsberger</data>");
    pw.flush();
    pw.close();
  }

请注意,我正在使用转义序列u00F6来发出字符U + 00F6( ö ),以确保我不会在我的文本编辑器中或编译过程中破坏字符(有关更多详细信息,请参阅此处)。

数据是否可能被客户误解? 用十六进制编辑器检查输出。

编码为UTF-8, "Ku00F6nigsberger"应该成为字节序列:

4b c3 b6 6e 69 67 73 62 65 72 67 65 72

...字符U + 00F6( ö )变成c3 b6 。 你可以使用这样的代码来检查你的值:

  public static void main(String[] args) throws IOException {
    String konigsberger = "Ku00F6nigsberger";
    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();
  }

您应该遵循该示例并使servlet response了解要遵循哪个端点编码:

response.setContentType("text/html; charset=UTF-8");
response.setCharacterEncoding("UTF-8");
ServletOutputStream out =response.getOutputStream();
out.write(output.getBytes("UTF-8"));    

你总是可以使用这样的实体:

<test>
&#228;
&#252;
&#229;
</test>

要得到:

<test>
ä
ü
å
</test>

也许不完全是你想要的,但一个很好的解决方法。 您可以使用像utf8-chartable.de这样的网站来查找所需的值。

链接地址: http://www.djcxy.com/p/34889.html

上一篇: nolatin characters in xml output

下一篇: Convert InputStream to byte array in Java