Domanda

  

Eventuali duplicati:
   Come utilizzare UTF-8 nelle proprietà di risorse con ResourceBundle

Voglio consentire l'internazionalizzazione per la mia applicazione Java Swing. Io uso un file pacchetto per mantenere tutte le etichette al suo interno.

Come test ho cercato di impostare un titolo svedese un JButton. Quindi, nel file di pacchetto che ho scritto:

nextStepButton=nästa

E nel codice Java che ho scritto:

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

Ma i personaggi titolo del pulsante appaiono sbagliato in fase di esecuzione:
alt text

Sto usando il carattere Tahoma, che supporta Unicode. Quando ho impostato manualmente il titolo tasto tramite codice appare bene:

nextStepButton.setText("nästa");

Qualsiasi idea del perché non riesce a file del pacchetto?

--------------------------------------------> Modifica: Codifica il titolo:
Ho provato la codifica del testo proveniente dal file fascio utilizzando il codice:

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

E ancora il risultato è:
alt text

È stato utile?

Soluzione

Come per le javadoc , proprietà i file vengono letti utilizzando ISO-8859-1.

  

.. il flusso di ingresso / uscita viene codificato in ISO 8859-1 codifica dei caratteri. Caratteri che non possono essere rappresentati direttamente in questa codifica può essere scritto usando fughe Unicode; una sola 'u' carattere è consentito in una sequenza di escape. Lo strumento native2ascii può essere utilizzato per i file di proprietà convertire da e verso altre codifiche dei caratteri.

Oltre ad utilizzare lo strumento native2ascii per convertire i file UTF-8 di immobili da 8859-1 ISO-file di proprietà, è anche possibile utilizzare un costume ResourceBundle.Control in modo da poter controllare il caricamento di file di proprietà e l'uso UTF-8 lì. Ecco un esempio kickoff:

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;
    }
}

Usa come segue:

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

In questo modo non c'è bisogno di complicarsi la vita con strumento native2ascii e si finisce con file di proprietà meglio gestibile.

Vedi anche:

Altri suggerimenti

Date un'occhiata al Java Internazionalizzazione FAQ . Se hai messo i caratteri non ASCII nel file .properties, è necessario convertirlo utilizzando il native2ascii strumento. Poi tutto dovrebbe funzionare.

Il problema è che il file di proprietà di bundle di risorse è codificato in UTF-8, ma l'applicazione sta caricando utilizzando Latin-1.

Se si prende "latino con dieresi" (E4 in latino-1 o 0000E4 come codepoint Unicode) e rappresentarlo come UTF-8, si ottiene C3 A4. Se poi si trattano quelli come Latin-1 byte si ottiene "alfabeto latino con tilde" e il carattere piazza "VALUTA IL SEGNO" ... che è come i personaggi stanno mostrando nel vostro screenshot del pulsante !!

(Per inciso, ecco un neologismo per la pressare si ottiene come risultato di utilizzando la codifica dei caratteri sbagliato ... mojibake . Lamiera tuoi amici usandolo in una conversazione.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top