Pour travailler en Java avec les flux de caractères (en opposition avec les flux binaires),
il faut utiliser les notions :
Java.io.Reader
Java.io.Writer
URLEncoder et URLDecoder ne servent qu'a encoder des caractères au sein d'une URL, c'est-à-dire :
# The alphanumeric characters "a" through "z", "A" through "Z" and "0" through "9" remain the same.
# The special characters ".", "-", "*", and "_" remain the same.
# The space character " " is converted into a plus sign "+".
# All other characters are unsafe and are first converted into one or more bytes using some encoding scheme. Then each byte is represented by the 3-character string "%xy", where xy is the two-digit hexadecimal representation of the byte. The recommended encoding scheme to use is UTF-8. However, for compatibility reasons, if an encoding is not specified, then the default encoding of the platform is used.
Bref, ça ne s'emploie pas en XML (sauf cas extremement rares, qui ne correspondent pas à ton cas).
Si tu connais l'encodage de ton flux binaire en lecture :
InputStream is = ...; // récéption du flux binaire
Reader myReader = new InputStreamReader(is,"UTF-8");
Maintenant toute lecture sur ton Reader se fera en décodant de l'UTF-8.
Ce reader peut être la source d'une lecture XML.
Pour l'écriture
OutputStream os = new ...; // tu crées un flux binaire de sortie, a toi de déterminer ou tu écris, ça peut être un fichier, un flux reseau, etc.
Writer myWriter = new OutputStreamWriter(os,"ISO-8859-1");
Maintenant toute écriture sur ton Reader se fera en encodant en ISO Latin 1.
Attention, si tu écris des caractères n'étant pas codés en ISO Latin 1, tu aura une erreur
Ce reader peut être la cible d'une écriture XML.
Enfin pour filtrer, afin d'écrire des entités pour les caractères non ISO Latin 1par exemple, il suffit d'écrire un FilterWriter
Class isoLatin1Writer extends FilterWriter {
public isoLatin1Writer(Writer out) {
super(out);
}
public void write(int c) throws IOException {
if(c<256) {
super.write(c);
} else {
super.write("&#");
super.write(Integer.toString(c));
super.write(";");
}
}
public void write(char[] cbuf,
int off,
int len) throws IOException {
for(int i=0; i<len; i++) {
write(cbuf[off+i]);
}
public void write(String str,
int off,
int len) throws IOException {
for(int i=0; i<str.length(); i++) {
write(str.charAt(off+i));
}
}
J'ai écris la classe dans le mél je ne m'engage pas qu'il n'y ai pas d'erreur de frappe.
Par contre pour la façon de faire, c'est sur :)
Ensuite ton writer devient :
Writer myWriter =
new isoLatin1Writer (
new OutputStreamWriter(os,"iso-8859-1")
);
Toute écriture pourra se faire en Unicode. Ton isoLatin1Writer enverra une entité &#...; à OutputStreamWriter pour tous les caractères au delà de 255. La compatibilité ISO Latin 1 est vérifiée.
Résumé :
2/ Mon deuxième est une appli java d'indexation qui récupère les données
de mon premier en utf-8 et les indexe en iso-8859-1 (avec
URLDecoder.decode(la chaine du serveur webdav, "utf8") : à ce moment
précis je pensais tenir de l'iso-8859-1 (charset du système).
Non, URLDecoder.decode ne sert pas à cela.
Il faut écrire
Reader myReader = new InputStreamReader(is,"UTF-8");
Writer myWriter = new OutputStreamWriter(os,"ISO-8859-1");
Il te faudra gérer les caractères Unicode non ISO Latin 1.
Tu en fais quoi ?
Pourquoi passer par un intermédiaire ISO Latin 1 alors que l'entrée et la sortie sont en Unicode ?
3/ Mon troisième est une appli front-end cocoon/java qui récupère du xml
iso-8859-1 de mon premier(resultat d'une recherche) et doit l'afficher
en html utf-8 à travers une transfo XSLT + sérialisation HTML utf8.
A priori, aucun problème en vue si tout est bien spécifié (je suis un enfant illegitime de Lapalisse).
Cordialement,
--------------------------------------------------------------------
Erik Mazoyer, Chef de projet
HyperOffice
6, rue Jacques Daguerre - 92565 Rueil-Malmaison Cedex
Tél. 01 41 96 96 76
Fax 01 41 96 96 77
Mél erik.mazoyer@hyperoffice.fr
Nouveau cycle de séminaires "les mardis d'HyperOffice" Inscriptions et renseignements : http://www.hyperoffice.fr/formation/catalogue/index.asp
-----Message d'origine-----
De : François Jannin [mailto:issar@free.fr]
Envoyé : mardi 10 janvier 2006 16:16
À : xml-tech@xmlfr.org
Objet : [xml-tech] Re: RE : Re: RE : j'y perd mon latin iso-8859-1
Erik Mazoyer wrote:
>>Ce n'est pas forcément vrai, personnellement j'utilise
>>Encode (http://search.cpan.org/~dankogai/Encode-2.12/Encode.pm).
>>
>>
>
>Quand je disait "facilement", je voulais dire normatif ou presque (par
>exemple la reconnaissance par les premiers caractères n'est pas
>"normative" mais se trouve décrite dans la norme "xml 1.0" et la norme
>"xml 1.1").
>
>En java (je prêche pour ma paroisse) il est "simple" de poser un filtre
>sur un Writer pour encoder "automatiquement" les entités.
>
>
Je travaille en Java, ça tombe bien. Peux-tu donner un exemple ou un
lien sur ces filtres de Writer ?
J'ai l'impression que je me suis compliquée la vie avec
l'URLEncoder/Decoder pour rien.
Pour résumer ma problèmatique sous forme de rébus :
1/ Mon premier est un serveur WEBDAV stockant des métadonnées en utf-8
2/ Mon deuxième est une appli java d'indexation qui récupère les données
de mon premier en utf-8 et les indexe en iso-8859-1 (avec
URLDecoder.decode(la chaine du serveur webdav, "utf8") : à ce moment
précis je pensais tenir de l'iso-8859-1 (charset du système)
3/ Mon troisième est une appli front-end cocoon/java qui récupère du xml
iso-8859-1 de mon premier(resultat d'une recherche) et doit l'afficher
en html utf-8 à travers une transfo XSLT + sérialisation HTML utf8. 3/ Et mon tout donne un casse-tête chinois ressemblant à un générateur
d'improbabilités :)
Malgré moult tests j'obtiens soit des caractères bizarres par-ci ou des
multi-byte error par-là. Par exemple, j'envoie une requête avec accents
latin-1(eh oui ! du français !) url-encodée en utf-8 et impossible de
l'utliser pour la recherche, même aprés avoir essayé toutes combinaisons
d'encodage/décodage avec URLDecoder/Encoder.
Merci mille fois de votre aide.
Cordialement,
François.
--
Devenez redacteur <XML>fr et contribuez au developpement du
xml francophone (http://xmlfr.org/infos/redacteurs/) !
Liste de diffusion "xml-tech@xmlfr.org" (http://xmlfr.org).
Cette liste est a votre disposition pour discuter en francais de
tout sujet technique lie a XML.
Pour resilier votre abonnement, envoyez un message contenant
la commande "unsubscribe" a xml-tech-request@xmlfr.org
(mailto:xml-tech-request@xmlfr.org?Subject=unsubscribe)
--
Devenez redacteur <XML>fr et contribuez au developpement du
xml francophone (http://xmlfr.org/infos/redacteurs/) !
Liste de diffusion "xml-tech@xmlfr.org" (http://xmlfr.org).
Cette liste est a votre disposition pour discuter en francais de
tout sujet technique lie a XML.
Pour resilier votre abonnement, envoyez un message contenant
la commande "unsubscribe" a xml-tech-request@xmlfr.org
(mailto:xml-tech-request@xmlfr.org?Subject=unsubscribe)
Received on Tue Jan 10 16:50:11 2006