9
votes

Lire Unicode de MessageSource donne un problème avec Java 5

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> xxx pré>

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 commentaires

Pouvez-vous poster un extrait de l'application ApplicationContext.xml qui définit le reloadableresourcebunsSourdeSourceSource 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)); à partir de reloadableresourcebundlemessagesagesource rencontre des problèmes lorsque le codage est "UTF-8". Lorsque je change le codage en arrière sur ISO-8859-1 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)


4 Réponses :


3
votes
<%@ page pageEncoding="UTF-8" %>

7 commentaires

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 . 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?



2
votes

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.


4 commentaires

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.



2
votes

citant de Javadoc pour Java.Util.Properties,

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.

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.

Utilisez également le getClassloader (). GetResourceastream (...) 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.

mise à jour basée sur le fil de commentaire:

Le Java 1.5 Java.Util.properties fait pas avoir un charge (lecteur) API. Donc, clairement, c'était un domaine d'amélioration de la période Java 1.6.


5 commentaires

@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 ? 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 fait quelque chose qui ne va pas. Sur cette ligne: this.propertiesperister.load (accessoires, nouvel entréeStreamReader (est, codage)); 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)



10
votes

J'ai consulté le code source de defaultPropertiespersister code> (il est utilisé par reloadableresourcebundlemessagesagesource code> en interne).

Si un 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>

Avant d'ajouter le CLÉ / VALEUR PAIX AUX 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>


1 commentaires

Merci pour votre réponse parfaite. Mais pour l'instant, je n'ai pas besoin de l'utilisation de la defaultPropertiesister . Donc, je le remplace simplement par apps.load (InputStream) ; 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)