J'ai fait une application de printemps (2.5.6) avec prise en charge I18N avec des fichiers de propriété (ex: messages_en_us.properties, messages_de_de.properties).
Ces fichiers .properties avec des codes Uni. Par exemple: p> lors de la lecture occupé code> Mots-clés de la messagerie code> donne ce résultat: p>
URLClassLoader cl = (URLClassLoader) IOUtils.class.getClassLoader();
InputStream resourceAsStream = cl.getResourceAsStream("messages_de_DE.properties");
Properties prop = new Properties();
prop.load(resourceAsStream);
System.out.println("From classpath --> " + prop.get("busy")); //Beschäftigt
System.out.println("From i18n folder --> " + I18nFunctions.getMessage("busy")); //Beschu00E4ftigt
4 Réponses :
<%@ page pageEncoding="UTF-8" %>
Thx pour votre réponse, j'aimerais que cela a résolu le problème. Mais la solution que vous avez mentionnée était déjà implémentée: <% @ page PageCoding = "utf-8"%> <% réponse.setcharacterending ("utf-8");%> <% Demande.Setch Aracterencoding ("UTF - 8 ");%> et j'utilise un personnageFilter. J'utilise JSTL pour afficher des messages I18N ... Donc:
La définition du codage de la réponse est déjà implicitement faite implicitement par pageCoding. Le codage de la demande de réglage dans JSP est inutile car il est généralement trop tard déjà. Juste la pageCoding pour le codage de la réponse (et les en-têtes) et le filtre pour le codage de la demande suffisent.
Merci pour vos commentaires. Ça a du sens. Malheureusement, cela ne résout pas le problème ...
Oui, je suis au courant de cela. C'était juste un commentaire. Veuillez noter la mise à jour de réponse en bas pour résoudre le problème concret.
"Veuillez noter la mise à jour de réponse en bas pour résoudre le problème concret" ?? Je ne comprends pas ce que tu veux dire avec ce commentaire.
J'ai édité ma réponse. Regardez le bas de ma réponse. Il y a un paragraphe qui commence par Mise à jour B>. L'avez-vous vu / lu?
Ow haha a désolé ... :-) Oui quand j'ai lu les fichiers .properties sur les fichiersYtem, je vois: "Modifications = Einschr \ u00e4nkung" et dans l'application, je vois "Einschru00e4nkung". Est-ce que tu veut dire ça?
Vous devez vous assurer que vous vérifiez que l'utilisateur utilise le serveur, ou pour être plus précis, vous devez vérifier les paramètres régionaux de l'environnement que le serveur commence. À des fins de débogage, vous pourrez peut-être éditer le Démarrez les scripts pour écrire la sortie de "locale" à un fichier. p>
Cela semble bien, mais il y a une possibilité que vous vérifiez cela pour les autres utilisateurs lorsque vous vous êtes connecté en tant qu'administrateur sur le serveur Linux (je n'ai qu'un seul identifiant SSH)
Oui, vous devez vérifier comme l'utilisateur qui exécute le serveur car cet environnement est celui qui détermine ce que le JVM utilise comme codage par défaut. L'encodage de l'environnement de votre utilisateur de connexion n'impose que si vous exécutez le serveur comme utilisateur.
Je comprends donc que vous ne pouvez pas vérifier les paramètres locaux d'un autre utilisateur, par exemple l'utilisateur «racine»? Peut-être connaissez-vous une page avec plus d'informations à ce sujet? Je suis un noob Linux.
Droit. Comme vous n'êtes évidemment pas la personne qui gère le serveur exécutant votre application, veuillez contacter quelqu'un qui en est responsable et les avoir vérifiant l'environnement.
citant de Javadoc pour Java.Util.Properties, P>
Les méthodes de chargement (InputStream) / Store (OutStream, String) fonctionnent de la même manière que la paire de chargée (lecteur) / Store (Writer, String), à l'exception du flux d'entrée / sortie est codé dans le codage du caractère ISO 8859-1. . Les caractères qui ne peuvent pas être directement représentés dans ce codage peuvent être écrits à l'aide des évasions Unicode; Seul un seul caractère 'U' est autorisé dans une séquence d'évacuation. L'outil Native2ASCII peut être utilisé pour convertir des fichiers de propriétés vers et vers d'autres codages de caractères. P> blockQuote>
Peut-être que vous avez une phase de construction qui convertissait votre fichier codé UTF-8 en ASCII. Essayez de modifier le codage des fichiers de propriétés au 8859-1. On dirait que votre fichier de propriétés échappe déjà aux caractères Unicode de manière appropriée. P>
Utilisez également le
getClassloader (). GetResourceastream (...) code> Pour obtenir un flux dans le fichier de propriétés vous-même et chargez-vous dans un fichier de propriétés. Voir si les valeurs sont les chaînes souhaitées. Cela va 1/2 le problème à un codage + emballage contre un problème de printemps. P>
mise à jour basée sur le fil de commentaire: strong> p> Le Java 1.5 Java.Util.properties fait pas em> avoir un
charge (lecteur) code> API. Donc, clairement, c'était un domaine d'amélioration de la période Java 1.6. P>
@Dilum Ranatunga: J'essaie de convertir à nouveau les fichiers en 8859-1 (par défaut dans Eclipse), mais cela ne résout pas le problème. Je vais essayer la deuxième suggestion plus tard.
@Dilum Ranatunga: Votre deuxième suggestion donne un résultat intéressant. Voir ma mise à jour2. Je pense qu'il y a un problème avec le printemps reloadableresourcebunsagesagesource code>? Ou je me trompe?
Je craquerais ouvrir la mise en œuvre de ladite classe et voir ce que cela fait.
Je lisais déjà la source et l'utilisais;) Source . Semble que le Prescripter code> fait quelque chose qui ne va pas. Sur cette ligne:
this.propertiesperister.load (accessoires, nouvel entréeStreamReader (est, codage)); code> après que ces accessoires sont fausses
Malheureusement, l'amélioration ne fonctionne pas. Je faisais maintenant une CustomResourcebunsSourceSource sans définir un codage et utilisez de simples apps.load (InputStream) code>
J'ai consulté le code source de Si un Avant d'ajouter le CLÉ / VALEUR PAIX AUX defaultPropertiespersister code> (il est utilisé par
reloadableresourcebundlemessagesagesource code> en interne).
defaulage est spécifié code> , les propriétés sont chargées manuellement à la ligne de ligne d'un
lecteur code> au lieu d'utiliser la méthode Conventional
Propriétés.Load () CODE>. P>
Propriétés CODE> Objet, l'objet
Unescape () Code> est appelé sur la chaîne code> S. / P>
<b:bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<b:property name="defaultEncoding" value="UTF-8"/>
<b:property name="fallbackToSystemLocale" value="false" />
<b:property name="basenames">
<b:list>
<b:value>classpath:messages</b:value>
<b:value>/public/custom/i18n/portalmessages</b:value>
</b:list>
</b:property>
<b:property name="cacheSeconds" value="1"/>
<b:property name="propertiesPersister">
<b:bean class="com.something.MyPropertiesPersister"/>
</b:property>
</b:bean>
Merci pour votre réponse parfaite. Mais pour l'instant, je n'ai pas besoin de l'utilisation de la defaultPropertiesister code>. Donc, je le remplace simplement par
apps.load (InputStream) code>; Cela fonctionne comme le charme. Même avec des caractères chinois ou russes et dans JDK5 et JDK6. (plus bas que JDK5 n'est pas requis)
Pouvez-vous poster un extrait de l'application
ApplicationContext.xml code> qui définit le
reloadableresourcebunsSourdeSourceSource code> s'il vous plaît?
@Harry Lime: voir la mise à jour sur le post
Semble que la règle
ceci.propertiespersister.load (accessoires, nouvel entréeStreamReader (est, codage)); code> à partir de
reloadableresourcebundlemessagesagesource code> rencontre des problèmes lorsque le codage est "UTF-8". Lorsque je change le codage en arrière sur
ISO-8859-1 code> Le problème est résolu. Maintenant, je n'ai besoin que d'enregistrer des jetons chinois fonctionne par exemple.
Malheureusement, l'amélioration ne fonctionne pas dans tous les cas, donc j'ai créé une CustomResourcebunMessagesSource sans définir un codage et une utilisation
apps.load (InputStream) code>