Question

  

Possible en double:    Comment utiliser UTF-8 dans les propriétés de ressources avec ResourceBundle

Je veux permettre à l'internationalisation de mon application Java Swing. J'utilise un fichier paquet pour garder toutes les étiquettes à l'intérieur.

Comme un test j'ai essayé de définir un titre suédois à un JButton. Ainsi, dans le fichier paquet que j'ai écrit:

nextStepButton=nästa

Et dans le code Java j'ai écrit:

nextStepButton.setText(bundle.getString("nextStepButton"));

Mais les caractères du titre du bouton apparaissent mal à l'exécution:
text alt

J'utilise la police Tahoma, qui prend en charge Unicode. Quand je tournerai le titre du bouton manuellement par le code, il semble bien:

nextStepButton.setText("nästa");

Toute idée pourquoi il échoue dans le fichier bundle?

--------------------------------------------> Edit: Encoding le titre: J'ai essayé coder le texte provenant du fichier bundle en utilisant le code suivant:

nextStepButton.setText(new String(bundle.getString("nextStepButton").getBytes("UTF-8")));

Et toujours le résultat est:
text alt

Était-ce utile?

La solution

Selon les propriétés, javadoc les fichiers sont lus à l'aide de l'ISO-8859-1.

  

.. le flux d'entrée / sortie est codé en codage de caractères ISO 8859-1. Les caractères qui ne peuvent être représentés directement dans ce codage peut être écrit à l'aide échappe Unicode; un seul caractère « u » est autorisé dans une séquence d'échappement. L'outil native2ascii peut être utilisé pour les fichiers de propriétés de conversion vers et à partir d'autres codages de caractères.

En plus d'utiliser l'outil native2ascii pour convertir des fichiers UTF-8 propriétés à propriétés ISO-8859-1 fichiers, vous pouvez également utiliser une coutume ResourceBundle.Control de sorte que vous pouvez contrôler le chargement des fichiers de propriétés et de l'utilisation UTF-8 là. Voici un exemple de coup d'envoi:

public class UTF8Control extends Control {
    public ResourceBundle newBundle
        (String baseName, Locale locale, String format, ClassLoader loader, boolean reload)
            throws IllegalAccessException, InstantiationException, IOException
    {
        // The below is a copy of the default implementation.
        String bundleName = toBundleName(baseName, locale);
        String resourceName = toResourceName(bundleName, "properties");
        ResourceBundle bundle = null;
        InputStream stream = null;
        if (reload) {
            URL url = loader.getResource(resourceName);
            if (url != null) {
                URLConnection connection = url.openConnection();
                if (connection != null) {
                    connection.setUseCaches(false);
                    stream = connection.getInputStream();
                }
            }
        } else {
            stream = loader.getResourceAsStream(resourceName);
        }
        if (stream != null) {
            try {
                // Only this line is changed to make it to read properties files as UTF-8.
                bundle = new PropertyResourceBundle(new InputStreamReader(stream, "UTF-8"));
            } finally {
                stream.close();
            }
        }
        return bundle;
    }
}

Utilisez-le suit comme:

ResourceBundle bundle = ResourceBundle.getBundle("com.example.i18n.text", new UTF8Control());

De cette façon, vous ne avez pas besoin de tracas avec l'outil native2ascii et vous vous retrouvez avec des fichiers de propriétés plus maintenable.

Voir aussi:

Autres conseils

Jetez un oeil à Java Internationalisation FAQ . Si vous avez mis des caractères non ASCII dans votre fichier .properties, vous devez le convertir en utilisant le native2ascii . Ensuite, tout devrait fonctionner.

Le problème est que le fichier de propriétés de regroupement de ressources est codée en UTF-8, mais votre application charge à l'aide de Latin-1.

Si vous prenez "LATINE A TRÉMA" (E4 en latin-1 ou 0000E4 comme point de code Unicode) et de la représenter en UTF-8, vous obtenez C3 A4. Si vous traitez alors ceux comme Latin-1 octets que vous obtenez le caractère « LETTRE MAJUSCULE LATINE A TILDE » et le carré « SYMBOLE MONÉTAIRE » ... qui est la façon dont les personnages font preuve dans votre capture d'écran du bouton !!

(Soit dit en passant, voici un néologisme pour la vous obtenez mutiler en raison de l'utilisation de l'encodage de caractères incorrect ... Mojibake . Baffle vos amis en utilisant dans la conversation.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top