0

Essayer de lire un XML généré à partir d'un MS WebserviceMauvais encodage avec Java HttpURLConnection

URL page = new URL(address); 
StringBuffer text = new StringBuffer(); 
HttpURLConnection conn = (HttpURLConnection) page.openConnection(); 
conn.connect(); 
InputStreamReader in = new InputStreamReader((InputStream) conn.getContent()); 
BufferedReader buff = new BufferedReader(in); 
box.setText("Getting data ..."); 
String line; 
do { 
    line = buff.readLine(); 
    text.append(line + "\n"); 
} while (line != null); 
box.setText(text.toString()); 

ou

URL u = new URL(address); 
URLConnection uc = u.openConnection(); 
BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream())); 
String inputLine; 
while ((inputLine = in.readLine()) != null) { 

    inputLine = java.net.URLDecoder.decode(inputLine, "UTF-8"); 
    System.out.println(inputLine); 
} 
in.close(); 

Toute page se lit bien, sauf la sortie de service Web il lit le plus grand et moins signes étrangement

il a lu < à "& lt;" et> à "& gt;" sans espaces, mais si je les taper ici sans espaces stackoverflow les rend < et>

S'il vous plaît aider grâce

+0

Pour moi, il semble que le webservice envoie les données de manière incorrecte. –

+0

J'ai travaillé autour de lui en utilisant text.toString(). Replace ("<", "<"). Replace (">", ">") l mais je ne sais pas pourquoi il le fait. Je voulais savoir –

Répondre

0

Mark Rotteveel est correct, le webservice est le coupable ici, il est pour une raison d'envoyer le plus long et signe inférieur à la & lt et & Format gt

Merci Martin Algesten mais je l'ai dit je CONTOURNÉS Je cherchais juste pourquoi c'était comme ça.

0

D'abord, il semble y avoir une confusion sur cette ligne:

inputLine = java.net.URLDecoder.decode(inputLine, "UTF-8"); 

Cela dit efficace que vous attendez que chaque ligne du document fourni par votre serveur soit codée en URL. Le codage de l'URL n'est pas le même que le codage du document.

http://en.wikipedia.org/wiki/Percent-encoding

http://en.wikipedia.org/wiki/Character_encoding

Regarder l'extrait de code, je pense que le codage URL (pour cent de l'encodage) n'est pas ce que vous êtes après.

En termes de document codage de caractères. Vous faites une conversion sur cette ligne:

InputStreamReader in = new InputStreamReader((InputStream) conn.getContent()); 

conn.getContent() retourne un InputStream qui fonctionne sur des octets, tandis que le lecteur fonctionne sur les caractères - le caractère d'encodage se fait ici. Checkout les autres constructeurs de InputStreamReader qui prend le codage comme second argument. Sans le second argument, vous retombez sur ce qui est votre plate-forme par défaut dans Java.

InputStreamReader(InputStream in, String charsetName) 

par exemple, vous permet de changer votre code: « ce codage est votre serveur fournissant le contenu »

InputStreamReader in = new InputStreamReader((InputStream) conn.getContent(), "utf-8"); 

Mais la vraie question sera être Si vous possédez également le code du serveur, vous pouvez le coder en dur pour quelque chose de raisonnable tel que utf-8. Mais si cela peut varier, vous devez regarder l'en-tête http Content-Type pour le comprendre.

String contentType = conn.getHeaderField("Content-Type"); 

Le contenu de contentType ressembleront

text/plain; charset=utf-8 

Une façon de sténographie d'obtenir ce champ est:

String contentEncoding = conn.getContentEncoding(); 

Notez qu'il est tout à fait possible qu'aucun charset est fourni, ou Content-Type En-tête, auquel cas vous devez vous replier sur des valeurs par défaut raisonnables.

+0

j'ai oublié de mentionner que les 2 premiers en-têtes xml ont <> normalement, mais tout ce qui est à côté est lt gt ... –