2009-11-01 6 views
2

Edit: Je codait le charcter et utiliser écrivain repsonse pour l'écrire, il est encore avéré être Knigsbergernolatin caractères en sortie xml

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

Edit: J'ai essayé setContentType et setContentEncoding avant d'appeler getWriter(), toujours pas de différence dans la production:

 
     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(); 
     } 

Je lis certains caractères allemands puis sortie en XML de servlet java, voici comment je les lis en UTF8:

 
int len=0; 
     byte[]buffer=new byte[1024]; 
     OutputStream os = sock.getOutputStream(); 
     InputStream is = sock.getInputStream(); 
     query += "\r\n"; 
     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 émet la chaîne correctement: Königsberger

Cependant quand je cette chaîne de nouvelle tuyauterie mon ServletResponse aussi en utilisant charset = UTF-8 il devient engloutie: Knigsberger

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

    } 
+0

spécifier OS/plate-forme. Qu'est-ce que c'est et comment "repapez"? – devio

+0

os est la fenêtre. par repipe je veux simplement dire le sortir du servlet – user121196

Répondre

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

Ce n'est pas un bon moyen de décoder UTF-8 car les caractères peuvent être endommagés sur les limites de la mémoire tampon (details here). UTF-8 est un codage de largeur variable, les caractères nécessitent donc entre un et quatre octets pour stocker. Si cela fonctionne, vous êtes juste chanceux. Il est préférable de coder et de décoder en utilisant les classes Reader/Writer (details here). Je crois que vous devez appeler setContentType ou setCharacterEncoding avant d'appeler le getWriter. Je ne pense pas qu'il soit suffisant d'appeler directement le setHeader.


Ce code de servlet coder correctement et transmettre la chaîne de l'échantillon sous forme de données 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(); 
    } 

Notez que j'utilise la séquence d'échappement \u00F6 pour émettre le caractère U + 00F6 (& # x00F6;) afin de ne pas corrompre le caractère dans mon éditeur de texte ou pendant le processus de compilation (see here for more details).

Est-il possible que les données soient mal interprétées sur le client? Vérifiez la sortie avec un éditeur hexadécimal.

codé comme UTF-8, "K\u00F6nigsberger" devrait devenir la séquence d'octets:

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

... où le caractère U + 00F6 (& # x00F6;) devient c3 b6. Vous pouvez utiliser le code comme ceci pour vérifier vos valeurs:

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(); 
    } 
+0

Je suppose que c'est un problème de formatage XML plutôt que le codage Unicode. J'ai utilisé le code pw.write (" K \ u00F6nigsberger"); et quand je l'affiche dans le navigateur, le personnage est toujours corrompu ... – user121196

0

Vous AllWays pouvez utiliser des entités comme ceci:

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

pour obtenir:

<test> 
ä 
ü 
å 
</test> 

Peut-être pas exactement ce que vous voulez, mais une bonne solution de contournement.Vous pouvez utiliser des sites tels que utf8-chartable.de pour rechercher la valeur requise.

+0

cela affiche bien les caractères, est-il possible de convertir ces caractères en ces codes xml? – user121196

+0

Je veux dire qu'il y a une API Java pour faire la conversion directement en Java? – user121196

+0

@unknown (google): Il n'y a pas d'API Java qui va créer ces entités de façon automagique. Voir cette réponse pour un exemple de la façon de le faire: http://stackoverflow.com/questions/1273986/converting-utf-8-to-iso-8859-1-in-java/1274830#1274830 – McDowell

1

Vous devez suivre l'exemple et faire comprendre servlet response qui endcoding à suivre:

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

J'ai aussi fait face au même problème. Je viens de faire les choses suivantes et cela fonctionne bien:

byte[] k =xml.getBytes(UTF8_CHARSET); // xml is the string with unicode content. getBytes("UTF-16") encodes given String into a sequence of bytes and returns an array of bytes. you can use xml.getBytes(UTF-16); for utf-16 encoding 

response.setContentType("text/xml"); 
response.setContentLength(k.length); 
response.getOutputStream().write(k); 
response.getOutputStream().flush(); 
response.getOutputStream().close(); 
Questions connexes