Gli ResourceBundle#getBundle()
usi sotto le copertine PropertyResourceBundle
quando .properties
viene specificato un file. Questo a sua volta utilizza per impostazione predefinita Properties#load(InputStream)
per caricare i file delle proprietà. Come da javadoc , vengono letti per impostazione predefinita come ISO-8859-1.
public void load(InputStream inStream) throws IOException
Legge un elenco di proprietà (coppie chiave ed elemento) dal flusso di byte di input. Il flusso di input è in un semplice formato orientato alla linea come specificato nel caricamento (Reader) e si presume che utilizzi la codifica dei caratteri ISO 8859-1 ; cioè ogni byte ha un carattere Latin1. I caratteri non in latino1 e alcuni caratteri speciali sono rappresentati in chiavi ed elementi usando escape Unicode come definito nella sezione 3.3 di The Java ™ Language Specification.
Quindi, dovresti salvarli come ISO-8859-1. Se hai caratteri oltre l'intervallo ISO-8859-1 e non puoi usarli \uXXXX
al di sopra della testa e sei quindi costretto a salvare il file come UTF-8, allora dovresti usare lo strumento native2ascii per convertire un File di proprietà salvato UTF-8 in un file di proprietà salvato ISO-8859-1 in cui tutti i caratteri scoperti vengono convertiti in \uXXXX
formato. L'esempio seguente converte un file di proprietà codificato UTF-8 in un file di proprietà codificato text_utf8.properties
ISO-8859-1 validotext.properties
.
native2ascii -codifica UTF-8 text_utf8.properties text.properties
Quando si utilizza un IDE sano come Eclipse, questo viene già fatto automaticamente quando si crea un .properties
file in un progetto basato su Java e si utilizza il proprio editor di Eclipse. Eclipse converte in modo trasparente i caratteri oltre l'intervallo ISO-8859-1 nel \uXXXX
formato. Vedi anche gli screenshot seguenti (nota le schede "Proprietà" e "Sorgente" in basso, fai clic per ingrandirle):
In alternativa, puoi anche creare ResourceBundle.Control
un'implementazione personalizzata in cui leggi esplicitamente i file delle proprietà come UTF-8 InputStreamReader
, in modo da poterli semplicemente salvare come UTF-8 senza doverti preoccupare native2ascii
. Ecco un esempio di 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;
}
}
Questo può essere usato come segue:
ResourceBundle bundle = ResourceBundle.getBundle("com.example.i18n.text", new UTF8Control());
Guarda anche: