HELP !! Source html, caractère hexa, xml

cs_krole Messages postés 12 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 21 octobre 2004 - 26 août 2004 à 12:11
WarLocG Messages postés 22 Date d'inscription vendredi 6 janvier 2006 Statut Membre Dernière intervention 8 décembre 2007 - 6 janv. 2006 à 16:55
Bonjour,

J'ai un gros soucis. Je fais un url.openConnection() par exemple sur http://search.yahoo.com/search?fr=FP-tab-web-t&cop=mss&tab=&n=40&p=gucci%2Bbamboo%2Bwatch+-replica,
1) je récupère la source de la page par la méthode :

InputStream iStream = connection.getInputStream();
connection.connect();
ByteArrayOutputStream body = new ByteArrayOutputStream();
int c;
while ( (c = iStream.read()) != -1) {
body.write(c);
}
iStream.close();
body.flush();
String contentPage = body.toString();
body.close();

2) je crée un fichier xml avec certains éléments du code source html

3) j'utilise un xml transform pour afficher le xml créé en html.

Mon problème est que, dans certaine source html, je dois récupérer des caractères spéciaux car, dans la source de la page html j'ai bien le caractère spécial (dans ce cas là un ' ) mais dans la source récupére avec ma méthode, le caractère a disparu (et est remplacé par un esape) mais si j'utilise ultraedit et affiche en hexa, le caractère a été remplacé par un � et c'est ce caractère que mon transformer xml ne reconnaît pas.

Etant donnée que je ne suis pas très à l'aise avec les encodages, j'aimerai bien votre avis pour pouvoir soit transformer ce caractère en decimal, par exemple une fois le code récupéré dans mon string soit le transformer directement lors de ma méthode
while ( (c = iStream.read()) != -1) {
body.write(c);
}

Merci à tous, je sais pas si j'ai été assez claire ?!?
Carole

15 réponses

Frouf85 Messages postés 106 Date d'inscription mardi 6 mai 2003 Statut Membre Dernière intervention 7 octobre 2004
26 août 2004 à 12:27
Je pense que c'est un problème au niveau de l'XML transform.
Utilises-tu UTF-8 pour le codage?
Frouf
0
cs_krole Messages postés 12 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 21 octobre 2004
26 août 2004 à 13:08
Non j'utilise ISO-8859-1 et je n'ai pas très envie d'en changer car tous mes xsl sont en ISO-8859-1.

Petite précision, si je vais online voir la source de la page j'ai bien un apostrophe ('), une fois le html récupéré par ma méthode (je l'ai écrit aussi dans un fichier texte pour debugger) je n'ai plus cet apostrophe mais un espace et en éditer hexa un 00.
Je pense que ce problème pourrait être résolu lors de ma méthode pour récupérer la source car c'est vraiement que sur certaines page que cela pose problème.

Merci,
Carole
0
Frouf85 Messages postés 106 Date d'inscription mardi 6 mai 2003 Statut Membre Dernière intervention 7 octobre 2004
26 août 2004 à 13:38
Je ne comprend pas, une fois (') edité en hex est �, une autre fois c'est 00.
Si j'ai bien compris, lorsque tu récupère ta page et que tu l'écrit dans un fichier sans passer par un parseur, l'apostrophe s'est transformé en espace?
Cet espace dervait alors être reconnu par le parseur (même si je sais que tu veux un apostrophe).
Je ne comprends pas tout.

Frouf
0
cs_krole Messages postés 12 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 21 octobre 2004
26 août 2004 à 14:01
Moi non plus !!
Le code hexa qui devrait être récupéré, pour un apostrophe est 27 mais j'ai un 00.
Et l'erreur relevée par ma classe xml transform est : CaractÞre XML non valide : �.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Frouf85 Messages postés 106 Date d'inscription mardi 6 mai 2003 Statut Membre Dernière intervention 7 octobre 2004
26 août 2004 à 14:13
Je ne vois pas d'où peut venir l'erreur. Ce que je ferais c'est récupérer les caractères avec l'objet DataInputStream et en utilisant readChar(). ptêt que ça peut changer quelque chose. qui sait?

Frouf
0
wargre Messages postés 649 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 9 septembre 2004 7
26 août 2004 à 14:21
hum c'est pas du cp1252 en encodage?
0
cs_krole Messages postés 12 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 21 octobre 2004
26 août 2004 à 14:53
C'est quoi du cp1252 (c'est pas mon fort l'encodage).
Mais j'ai un début d'amélioration.
J'ai rajouter, pour ma connexion : connection.setRequestProperty("Accept-Charset", "iso-8859-1,utf-8");.

Du coup je n'ai plus de page blanche dûe à l'erreur de xml transfom, ce qui est une très bonne chose en soi, mais maintenant j'ai des caractères, dans mon string, du style â?? pour l'apostrophe ou é pour é.

Carole
0
Frouf85 Messages postés 106 Date d'inscription mardi 6 mai 2003 Statut Membre Dernière intervention 7 octobre 2004
26 août 2004 à 15:03
Dans ton entête du document XML, tu possèdes quel type d'encodage?
pour le configurer:

Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperty(OutputKeys.INDENT, "no");
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
transformer.transform(source,result);


ou UTF-8 si ça ne marche pas.
Frouf
0
cs_krole Messages postés 12 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 21 octobre 2004
26 août 2004 à 15:33
j'ai essayé mais ça ne change rien.
0
wargre Messages postés 649 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 9 septembre 2004 7
26 août 2004 à 15:34
a ben firebird me dit que c'est de l'UTF-8 :)

sinon cp1252 c'est les norme windows a la con.
0
Frouf85 Messages postés 106 Date d'inscription mardi 6 mai 2003 Statut Membre Dernière intervention 7 octobre 2004
26 août 2004 à 15:56
En HTML les é sont de &ecute; ou un truc comme ça.

ça ne peux pas venir de là? en partie?
Frouf
0
cs_krole Messages postés 12 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 21 octobre 2004
26 août 2004 à 16:30
Oui j'ai bien filtré et encoder tous les caractères spécaiux mais ceux dont je parlent sont spéciaux de chez spéciaux.

Par exemple, sur yahoo.fr, tu fais une recherches avec "gucci bamboo watch -replica", le premier résultat est : Les résultats annuels 2003 et l'accélération de l'activité. Et si regarde la source c'est : Les résultats annuels 2003 et lâ??accélération de lâ??activité

Carole
0
Frouf85 Messages postés 106 Date d'inscription mardi 6 mai 2003 Statut Membre Dernière intervention 7 octobre 2004
26 août 2004 à 16:42
Lorsque tu récupère ta page html, tu la récupère avec datainputStream?
Si c'est le cas, fait un System.out.print() pour chaque caractère que tu récupères, comme ça tu va voir précisemment ce que tu récupère à la place des ' et des é.
peut être que ça peut aider à trouver la solution.
Frouf
0
Akbarr Messages postés 15 Date d'inscription mercredi 15 juin 2005 Statut Membre Dernière intervention 23 juin 2005 1
15 juin 2005 à 17:13
Le problème des carctères spéciaux vient du fait que tu lis de l'UTF-8. En UTF-8 les caractères accentués sont codés sur 2 bytes (Ãx).

Or tu le lis sans conversion (en mode byte) dans ton ByteArrayOutputStream, puis tu demandes un toString() sans préciser l'encodage de ton ByteArray.

Tu dois préciser à un moment donné quel est l'encodage de ton ByteArray, par exemple si tu fais body.toString("UTF-8"), tu devrais avoir les caractères accentués lisibles.

Le problème est evidement que toutes les pages que tu lis ne sont pas en UTF-8, le mieux est donc d'extraire l'encoding du stream via le 'Content-Type'.
A priori, il est inutile de restraindre l'encoding via 'Accept-Charset'.

Ci-join un petit exemple qui extrait le contenu d'une page dans un String:

import java.net.URL;
import java.net.URLConnection;
import java.io.InputStream;
import java.io.ByteArrayOutputStream;


public class URLTest {


private static final String PROP_ENCONDING = "charset=";


public String readHTTPContent(String httpURL)
throws Exception
{
URL url = new URL(httpURL);
URLConnection connection = url.openConnection();


InputStream iStream = connection.getInputStream();
connection.connect();



ByteArrayOutputStream body = new ByteArrayOutputStream();
int c;
while ( (c = iStream.read()) != -1) {
body.write(c);
}


String encoding = null;
String contentType = connection.getHeaderField("Content-Type");
if (null != contentType)
{
int pos = contentType.indexOf(PROP_ENCONDING); if (pos >0) encoding contentType.substring(pos + PROP_ENCONDING.length());
}


iStream.close();


body.flush();
body.close();


return (null != encoding) ? body.toString(encoding) : body.toString();
}


public static void main(String args[])
{
URLTest helper = new URLTest();
try {
String result = helper.readHTTPContent("http://www.google.fr");


System.out.println(result);


} catch(Exception e) {
e.printStackTrace();
}
}
}
0
WarLocG Messages postés 22 Date d'inscription vendredi 6 janvier 2006 Statut Membre Dernière intervention 8 décembre 2007
6 janv. 2006 à 16:55
Je ne sais pas si ca peut t'aider mais j'ai déjà remarqué qu'en aspx, côté serveur, (c'est du vb, côté serveur) lorsque je code une string contenant des élément html (voir même de simple texte) pour les passer côté client (en vb, on utilise alors la commande response.write("texte", ou fonction() as string)). Eh bien si le texte contenais des caractères spéciaux (du genre: é, @, ...), ben il deviennent vraiment très spèciaux (du genre: tes caractères bizarres ) ! ;)
0
Rejoignez-nous