Gestion des caractéres spéciaux sous Linux [Résolu]

Hermios 265 Messages postés dimanche 14 avril 2013Date d'inscription 23 mai 2014 Dernière intervention - 2 mai 2011 à 15:15 - Dernière réponse : shaiulud 405 Messages postés mardi 18 décembre 2001Date d'inscription 15 juillet 2014 Dernière intervention
- 13 mai 2011 à 13:12
Salut à tous,
Ma question concerne ce qui semble être un problème récurrent sur le net, mais dont les réponses m'échappent :
Je dois créer une apli java qui se lance sous Linux. Cette appli génère entre autre des fichiers, appelle des fichiers bashs avec des paramètres d'entrée, et affiche des résultats sur l'écran.
Cette appli est utilisée en Allemagne, et les lettres ü, ö et ä ne passent pas (Probablement le ß non plus, je n'ai pas essayé!), elles sont remplacées systématiquement par des "?".
Pour une fois, je demanderai à avoir une réponse aussi précise que possible, quitte à contenir clairement la réponse. Je sais que ce n'est pas le but de ce forum, et je ne le demande normalement pas, mais là, je suis dessus depuis maintenant un mois, et j'ai beau lire beaucoup de doc, je comprend absolument rien (Et mon cerveau est en passe de devenir un ragout bouillant et odorant!!!!). Quoiqu'il en soit, je prendrai bien évidemment tous les conseils :D

Par avance, désolé du manque de précision, n'hésitez pas à me faire savoir si vous avez besoin de d'avantage d'info!

Merci beaucoup à tous de votre aide.

@+. Hermios
Afficher la suite 

15 réponses

Répondre au sujet
shaiulud 405 Messages postés mardi 18 décembre 2001Date d'inscription 15 juillet 2014 Dernière intervention - 5 mai 2011 à 09:33
+3
Utile
Tu peux le vérifier avec le petit programme:

public static void main(String[] args) {
Set<Entry<Object, Object>> set = System.getProperties().entrySet();

for (Iterator iterator = set.iterator(); iterator.hasNext();) {
Entry<Object, Object> entry = (Entry<Object, Object>) iterator.next();
System.out.println(entry.getKey()+"="+entry.getValue());
}

}

//--
Tu trouveras l'encodage du système et des fichiers dans la liste
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de shaiulud
shaiulud 405 Messages postés mardi 18 décembre 2001Date d'inscription 15 juillet 2014 Dernière intervention - 4 mai 2011 à 12:42
0
Utile
Tu vas devoir passer tes trads (i18n) en UTF8.
Puis utiliser la classe ResourceBundle.

Les serveurs Linux le sont généralement (RHEL, Centos de façons sûre).

France
Fichier traduction_fr.properties
CLE_BONJOUR= Bonjour

Suisse francophone
Fichier traduction_fr_CH.properties
CLE_BONJOUR =Bonjour

Allemagne
Fichier traduction_de.propertiesproperties

Suisse germanophone
Fichier traduction_de_CH.properties
CLE_BONJOUR=Grüß Gott
Commenter la réponse de shaiulud
shaiulud 405 Messages postés mardi 18 décembre 2001Date d'inscription 15 juillet 2014 Dernière intervention - 4 mai 2011 à 12:43
0
Utile
[u]Allemagne
/uFichier traduction_de.properties
CLE_BONJOUR=Grüß Gott
Commenter la réponse de shaiulud
Hermios 265 Messages postés dimanche 14 avril 2013Date d'inscription 23 mai 2014 Dernière intervention - 4 mai 2011 à 12:46
0
Utile
Salut Shaiulud,
Alors, merci de ta réponse, mais précisément... j'ai rien compris!!!!

c'est quoi i18n? Comment utiliser la classe ResourceBundel, et les serveurs Linux sont quoi, généralement???
Et que signifie RHEL????
Merci de m'éclairer un peu plus!
:D

@+. Hermios
Commenter la réponse de Hermios
shaiulud 405 Messages postés mardi 18 décembre 2001Date d'inscription 15 juillet 2014 Dernière intervention - 4 mai 2011 à 14:00
0
Utile
RHEL : Reh Hat Enterprise Linux
i18n : http://fr.wikipedia.org/wiki/Internationalisation_et_localisation

Les serveurs Linux ont leur encodage en UTF8 (aussi appelé Unicode mais c'est restrictif, Unicode n'implémente pas tout UTF8)

Exemple de code de Bundle

/*
Fichier HabilitationsBundle
*/

import java.text.MessageFormat;
import java.util.Enumeration;
import java.util.MissingResourceException;
import java.util.ResourceBundle;

/**
* Bundle des Interfaces batch.
*/
public class HabilitationsBundle {

private HabilitationsBundle() {
}

private static final String MODULE_ID = "traduction";

private static final Log log = LogService.getLog(HabilitationsBundle.class); //log

private static ResourceBundle mainResourceBundle = null;


public static ResourceBundle getBundle(){
return mainResourceBundle;
}

static {
try {
mainResourceBundle = ResourceBundle.getBundle(MODULE_ID);
} catch (Exception e) {
log.error(e);
}
}

/**
* @return La liste de toutes les clés d'un Bundle.
*/
public static Enumeration getKeys() {
Enumeration result = null;
try {
result = mainResourceBundle.getKeys();
} catch (MissingResourceException e) {
log.warn("No keys in bundle " + getBundleName());
}
return result;
}

/**
* Recherche une clé dans le fichier de ressource. Si celle-ci n'existe pas ,
* la méthode retourne null
*
* @param argKey
* @return
*/
public static String getString(String theKey) {
String result = null;
try {
result = mainResourceBundle.getString(theKey);
} catch (MissingResourceException e) {
log.warn("Bundle missing key=" + theKey + " in bundle " + getBundleName());
return theKey;
}
return result;
}

/**
* Retourne un message de ressource ayant 1 paramètre Si celle-ci n'existe
* pas , la méthode retourne le code de la clé
*
* @param theKey clé de tradution
* @param theValue
* @return valeur de la clé
*/
public static String getString(String theKey, String theValue) {
String result = null;
try {
String pattern = mainResourceBundle.getString(theKey);
if (pattern != null) {
result = MessageFormat.format(pattern, new String[] { theValue });
}
} catch (MissingResourceException e) {
log.warn("Bundle missing key=" + theKey + " theValue=" + theValue + " in bundle " + getBundleName());
return theKey;
}
return result;
}

/**
* Retourne un message de ressource ayant 2 paramètres Si celle-ci n'existe
* pas , la méthode retourne le code de la clé
*
* @param theKey clé de tradution
* @param theValue
* @return valeur de la clé
*/
public static String getString(String theKey, String theValue1, String theValue2) {
String result = null;
try {
String pattern = mainResourceBundle.getString(theKey);

if (pattern != null) {
result = MessageFormat.format(pattern, new String[] { theValue1, theValue2 });
}
} catch (MissingResourceException e) {
log.warn("Bundle missing key=" + theKey + " theValue1=" + theValue1 + " theValue2=" + theValue2 + " in bundle " + getBundleName());
return theKey;
}
return result;
}

/**
* Retourne un message de ressource ayant 3 paramètres Si celle-ci n'existe
* pas , la méthode retourne le code de la clé
*
* @param theKey clé de tradution
* @param theValue
* @return valeur de la clé
*/
public static String getString(String theKey, String theValue1, String theValue2, String theValue3) {
String result = null;
try {
String pattern = mainResourceBundle.getString(theKey);
if (pattern != null) {
result = MessageFormat.format(pattern, new String[] { theValue1, theValue2, theValue3 });
}
} catch (MissingResourceException e) {
log.warn("Bundle missing key=" + theKey + " theValue1=" + theValue1 +
" theValue2=" + theValue2 + " theValue3=" + theValue3 + " in bundle " + getBundleName());
return theKey;
}
return result;
}

private static String getBundleName() {
return MODULE_ID;
}

}

/*
Utilisation
*/
String messageTraduit = HabilitationsBundle.getMessage("CLE_BONJOUR");

//messageTraduit contient
//Bonjour si ma variable Locale = Locale.FRENCH
//Bonjour si ma variable Locale = Locale.GERMAN
// lire http://java.sun.com/developer/technicalArticles/J2SE/locale/ pour plus de détail
Commenter la réponse de shaiulud
shaiulud 405 Messages postés mardi 18 décembre 2001Date d'inscription 15 juillet 2014 Dernière intervention - 4 mai 2011 à 14:17
0
Utile
rectification
//Grüß Gott si ma variable Locale = Locale.GERMAN
Commenter la réponse de shaiulud
Hermios 265 Messages postés dimanche 14 avril 2013Date d'inscription 23 mai 2014 Dernière intervention - 4 mai 2011 à 14:25
0
Utile
Re,
Merci beaucoup pour la réponse, vraiment complète, mais... je crois que ce n'est pas ce que je demande :
Je ne souhaite pas traduire des éléments (mon programme est en langue allemande, pour des allemands, et même des bavarois, donc Grüß Gott, ils gèrent :D)
Mon programee doit afficher les caractères spéciaux sous Linux (Notamment le ü et le ß de Grüß). Pour l'instant, si mon appli java (que je lance via un wsdl) possède la ligne "System.out.println("Grüß")", la console Linux va afficher "Gr??". Donc ma question est, comment programmer Java (je n'ai pas le droit de changer la config du serveur Linux) pour que Linux affiche "Grüß". J'ai regardé un truc avec xfontsel, mais ca m'a pas appris grand chose.

Merci beaucoup

@+. Hermios
Commenter la réponse de Hermios
shaiulud 405 Messages postés mardi 18 décembre 2001Date d'inscription 15 juillet 2014 Dernière intervention - 4 mai 2011 à 16:50
0
Utile
OK

tu dois avoir donc de sources compilées avec l'encodage du serveur.

si le serveur Linux est en ISO-8859-1 tes sources java doivent être en ISO-8859-1 (si tu es sous eclipse window/prefrence - general/workspace - File Encoding)

si le système de fichier est différent tu devras pendre l'encodage de l'OS.

Une exécution sous windows (encodage cp1215 - ANSI like) donnera un truc du genre Grüß.

L'encodage est toujours la M.... vivement que tout le monde passe en UTF16, mais ce n'ai pas demain la veille...
Commenter la réponse de shaiulud
shaiulud 405 Messages postés mardi 18 décembre 2001Date d'inscription 15 juillet 2014 Dernière intervention - 4 mai 2011 à 16:55
0
Utile
Sinon une idée bête mais qui à marché sur un de mes projets.

Je générais nativement de l'UTF8 (ok pour toute les langues) mais un serveur qui consommait mes flux ne travaillait qu'en ANSI pour produire des PDF qui eux était UTF8.

Mes caractères devenaient une belle purée.

J'ai donc surencoder dans l'UTF-8 l'encodage du pays cible et c'est passé.
Mes fichiers originaux étaient illisible mais le résulat en sortie était OK.

En java, tu devras utiliser des truc du genre
http://www.exampledepot.com/egs/java.lang/unicodetoutf8.html
Commenter la réponse de shaiulud
Hermios 265 Messages postés dimanche 14 avril 2013Date d'inscription 23 mai 2014 Dernière intervention - 4 mai 2011 à 22:55
0
Utile
Ouah, là déjà, je vois à peu près. Merci vraiment pour ton aide, je testerai demain matin
Une petite question encore : comment connaitre le type d'encodage du serveur?
Merci encore, je te tiens au courant

@+. Hermios
Commenter la réponse de Hermios
shaiulud 405 Messages postés mardi 18 décembre 2001Date d'inscription 15 juillet 2014 Dernière intervention - 5 mai 2011 à 07:00
0
Utile
petit main pour lister les propriétées du système et le JVM

public static void main(String[] args) {
Set<Entry<Object, Object>> set = System.getProperties().entrySet();

for (Iterator iterator = set.iterator(); iterator.hasNext();) {
Entry<Object, Object> entry = (Entry<Object, Object>) iterator.next();
System.out.println(entry.getKey()+"="+entry.getValue());
}

}

Voici que que j'ai sur mon environnement :
sun.jnu.encoding=Cp1252
file.encoding=UTF-8
Commenter la réponse de shaiulud
Hermios 265 Messages postés dimanche 14 avril 2013Date d'inscription 23 mai 2014 Dernière intervention - 9 mai 2011 à 13:04
0
Utile
Salut,
Bon alors après maints et maints tests, j'en viens à la conclusion que... ben mon serveur est en anglais, et donc ne peut pas gérer les ä, ö et ü : J'ai testé le "surencodage" en UTF-8, ca marche pour écrire dans un fichier, mais pas pour écrire dans la console, et pour des appels à des softs extérieurs.
Donc la solution consiste à passer le serveur en allemand. Or, c'est un serveur que je n'ai pas le droit de configurer. Je me permets donc une dernière question : Est il possible, via java, de forcer temporairement le passage au language allemand, pour faire le programme? (Je pense que c'est non, mais bon, ca ne coute rien de demander).
Quoiqu'il en soit, mille mercis pour ton aide.

P.S.: J'ose pas trop mettre réponse acceptée, parce que ca n'a pas vraiment marché, le problème venant de mon côté. Mais si tu considères que je peux le mettre, pas de soucis de mon côté! :D


@+. Hermios
Commenter la réponse de Hermios
shaiulud 405 Messages postés mardi 18 décembre 2001Date d'inscription 15 juillet 2014 Dernière intervention - 10 mai 2011 à 07:14
0
Utile
Sur ton serveur Anglais pour écrire de l'Allemand tu peux si tu as la main pour le lancement de ta JVM :
java -Duser.language=de -Duser.region=DE

sinon tu es grillé en mode console

ps: pour l'acceptation d'un réponse il ne vaut mieux pas. nous ne sommes pas là pour faire un quelconque score mais pour nous entraider et nous n'avons pas la solution.
ça n'aidera personne d'avoir une réponse erronées
Commenter la réponse de shaiulud
Hermios 265 Messages postés dimanche 14 avril 2013Date d'inscription 23 mai 2014 Dernière intervention - 10 mai 2011 à 10:29
0
Utile
Salut Shaiulud,
Malheureusement, le programme se lance en wsdl, à partir d'un programme C#. donc pas de lancement de cette manière!

Merci quand même.

Concernant la réponse acceptée, je me suis mal exprimé :
ta réponse n'est pas erronnée dans l'absolu, mais ne marche pas sur mon cas précis. cela dit, ca m'a permis de mieux localiser le problème. Donc je pensais mettre quand même une réponse acceptée, justement parce que je les trouve très utiles et complètes. Qu'en penses tu?

En tout cas (et pour la ènième fois!) vraiment sympa de ta part de m'avoir aidé comme ca! :D

Niko


@+. Hermios
Commenter la réponse de Hermios
shaiulud 405 Messages postés mardi 18 décembre 2001Date d'inscription 15 juillet 2014 Dernière intervention - 13 mai 2011 à 13:12
0
Utile
tu peux alors topper les réponses qui t'ont aidé.
Commenter la réponse de shaiulud

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.