[Java] Textes à caractères spéciaux

Salut,

J’ai besoin de lire le code d’une page web à partir de java.
Il faut que le texte récupéré soit 100% fidèle au contenu du code.
Dans un premier temps j’ai fait un traitement pour remplacer les entity html par leur équivalent mais maintenant d’autres caractères me posent problème:

Par exemple :

l’e-commerce => ici l’apostrophe " ’ " qui n’est pas un bête " ’ "
Si je lis par exemple un fichier contenant cet apostrophe, java va m’afficher un " ? " à la place.

Après un petite recherche dans google, je remarque que java gère l’unicode: c’est cool mais alors pourquoi n’y arrive t’il pas ? :stuck_out_tongue:

je réessaie avec l/u0060e-commerce dans un fichier texte que je lie et il me ressort encore l?e-commerce… :stuck_out_tongue:

Si je fais un bête system.out.println(« l’e-commerce »);
Le caractère s’affiche correctement. Donc pourquoi le caractère est faux lorsque je le récupère d’une source extérieure (url, fichier…) ?
C’est peut-être un problème d’encodage au niveau de la convertion inputStream/String mais est-ce possible de régler ça ?

si vous avez une idée…

merci

Salut,

Tu utilises quelle classe pour lire ton flux ?
Si tu utilises l’InputStreamReader par exemple, tu peux lui spécifier l’encodage utilisé dans le constructeur…

Salut,

j’ai trouvé ca comme lien. ca peut t’aider peut etre : http://www.developpez.net/forums/viewtopic…ht=charset+java

Désolé de ne pouvoir faire plus mon Java commence a etre trop vieux.

Merci de votre aide

J’utilisais l’inputStreamReader mais en précisant UTF8, ISO-88591, Cp1252… ça me fait varier mon apostrophe rebel du « ? » au ’’’’carré

voici le code qui me paraît logique:

InputStream is = (new URL(this.url)).openStream(); byte[] pageBytes = new byte[is.available()]; is.read(pageBytes); String page = new String(pageBytes,"UTF8");

on récupère les bytes puis on les convertit celon le format en string: normalement imparable ! maintenant j’ai des doutes sur les formats à utiliser, est ce que cet apostrophe rebel est bien présent en UTF8 ou ISO-8859-1 ? (edit: oui 39eme caractère arf mais alors d’où viens le problème ? :stuck_out_tongue: )

Ah l’encodage, qu’est ce que j’en ai bavé avec ça.
Malheureusement je n’ai plus en tête le bout de code qui m’avait permis de m’en sortir.
Tu peux nous filer l’URL de ta page qu’on puisse faire des tests en live ?

www.club-gensi.fr

Dans le champ description par exemple il y a quelques apostrophes rebelles.

Moauis bon, le site me jette parce que je n’utilise pas IE ou Netscape (je suis sous FF). Je pensais pas que ça existait encore ce genre de limitation :stuck_out_tongue:

Bref, ce sera donc sans moi pour l’instant. Si je retrouve le code que j’ai écrit sur le même genre de problème pendant le WE je repasserai sur ce thread.

Bon courage quand même :stuck_out_tongue:

bah oui moi aussi il me jette à cause de Firefox, c’est pas un problème cette page a la même en-tête html.

Je vais sans doute dire des bétises, j’essaye juste d’aider, connaissant le problème en dotnet :
n’est-ce pas un simple problème d’affichage de ta string dans ton interface ?
par exemple une console DOS avec un convertisseur de codepages implicite qui ne fonctionnerait pas comme prévu ?

Il m’arrive régulièrement de passer d’un codepage à un autre, et la plupart du temps, on pense que les données sont mauvaises, alors que le problème se situe au niveau de l’interface, souvent console, callée sur un codepage merdique ne supportant pas tous les caractères.

Si ça peut t’aider à trouver…

[quote name=‹ Ge-Off › date=’ 5 Aug 2005, 11:09’]Je vais sans doute dire des bétises, j’essaye juste d’aider, connaissant le problème en dotnet :
n’est-ce pas un simple problème d’affichage de ta string dans ton interface ?
par exemple une console DOS avec un convertisseur de codepages implicite qui ne fonctionnerait pas comme prévu ?

Il m’arrive régulièrement de passer d’un codepage à un autre, et la plupart du temps, on pense que les données sont mauvaises, alors que le problème se situe au niveau de l’interface, souvent console, callée sur un codepage merdique ne supportant pas tous les caractères.

Si ça peut t’aider à trouver…
[right][post=« 383461 »]<{POST_SNAPBACK}>[/post][/right][/quote]

Oui j’y ai pensé, mais un bête affichage texte dans eclipse échoue aussi :stuck_out_tongue:
merci.

aaah le fameux apostrophe de windows, quelle belle merde.

Donc je sais pas si c’est vraiment ca mais ca y ressemble bien fortement, tu es en presence du fameux « apostrophe de windows » qui devient systematiquement un ? ou un carre quand il est lu par autre chose que le charset qui va bien.
Glop m’avait explique la raison de cette apostrophe en plus (parce qu’il y en a deja une de standard) mais j’ai deja oublie - peut etre parce que son explication n’etait pas satisfaisante (et je troll sur MS/Glop quand je veux :P)

Bref, tu as tres probablement fait ton fichier sous windows, surement avec word ou wordpad. Tu utilise donc le charset Windows-1252 et tu es bien emmerde. Bah t’inquiete hein, d’autres ont eu le probleme avant toi.
En cherchant la page de MS, j’ai vu des trucs java sur ce charset, donc ca doit pouvoir se gerer avec java - google est ton mega pote. Sinon, il y a ma technique de bourrin:

[code]/* wipe out all the fucking special windows charset

  • char c;
    */
    switch©
    {
                   case(133):
                           fwrite("…",sizeof(char),3,out);
                   break;
                   case(150):
                           fwrite("-",sizeof(char),1,out);
                   break;
                   case(156):
                           fwrite(« oe »,sizeof(char),2,out);
                   break;
                   case(146):
                           fwrite("’",sizeof(char),1,out);
                   break;
                   case(’&’):
                            fwrite("\&",sizeof(char),2,out);
                   break;
                   case(’’):
                           fwrite("\
    ",sizeof(char),2,out);
                   break;
                   default:
                           fwrite(&c,sizeof(char),1,out);
    }[/code]
    (moi j’ecris dans un fichier, tu fais ce que tu veux…)

Enjoy.

LoneWolf
Osons le specifique qui fait chier le peuple. :stuck_out_tongue:

Ok, c’est exactement ça merci.

Donc le code de bourrin provisoire donne ça (en attendant je les vire) :

[code]InputStream is = (new URL(this.url)).openStream();
byte[] pageBytes = new byte[is.available()];
is.read(pageBytes);

//Windows-1252 équivalent du ISO-8859-1 avec les caractères de @!%$ de microsoft
String page = new String(pageBytes,« Windows-1252 »);
 
char[] pageChars = page.toCharArray();
for(int i=0;i<pageChars.length;i++)
{
        //les caractères incriminés vont de 128 à 159
       if(pageChars[i]>=128 && pageChars[i]<=159)
       pageChars[i]=’ ';
}

page = new String(pageChars);[/code]

reste plus qu’à identifier chaque symbole comme dans ton moceau de code.

edit: l’apostrophe est le caractère n°8217 donc l’interval 129 à 159 est à oublier. M’enfin ça marche maintenant.

merci :stuck_out_tongue:

Bon, je suis en train de faire quelques tests avec ce bout de code là:

private static String GetData(String sURL) { String sOutput = ""; try { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Create a URL for the desired page &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;URL url = new URL(sURL); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Read all the text returned by the server &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;String str; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while ((str = in.readLine()) != null) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sOutput+=str + "\n"; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; in.close(); &nbsp; &nbsp; &nbsp; &nbsp;} catch (MalformedURLException e) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace(); &nbsp; &nbsp; &nbsp; &nbsp;} catch (IOException e) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace(); &nbsp; &nbsp; &nbsp; &nbsp;} return sOutput; }

Mais je ne trouve pas tes caractères spéciaux, tu pourrais donner un exemple précis avec un mot auquel se raccrocher ?

Parce que la solution à la barbare me parait clairement superflue, Java gère le cp1252, encore heureux…

essaie www.club-gensi.fr
Voici le champ de description :

GenSi, l’annuaire des societes de service pour la supply chain, la logistique, l’e-commerce, solutions interoperables, edi, code barre, rfid

pour “l’annuaire” et “l’e-commerce”, le caractère apostrophe ne passe pas (un ? ou un carré celon l’encodage).

Oui java gère le cp1252, c’est d’ailleurs pour ça que je ne comprenais pas pourquoi il refusait de me les afficher même en lui précisant le bon encodage.

Ben chez moi ça marche plutôt pas mal (avec mon bout de code cité plus haut).
Quand j’affiche le texte dans une JTextArea ou dans JEdit (j’utilise Beanshell pour faire mes tests) ça sort très bien.

Quand j’exécute mon script dans un shell windows ça marche moins bien (les apostrophes sortent mal) mais je pense que c’est un autre problème.

Donc c’est à mon avis un problème d’affichage plus que de lecture des données (à moins que tu ne sois pas sur une machine Windows, auquel cas il faudra que tu rajoute le charset à l’instanciation de l’InputStreamReader).

En espérant que ça t’aide…