Os ResourceBundle#getBundle()
usos ocultos PropertyResourceBundle
quando um .properties
arquivo é especificado. Por sua vez, isso é usado por padrão Properties#load(InputStream)
para carregar esses arquivos de propriedades. De acordo com o javadoc , eles são lidos por padrão como ISO-8859-1.
public void load(InputStream inStream) throws IOException
Lê uma lista de propriedades (pares de chave e elemento) do fluxo de bytes de entrada. O fluxo de entrada está em um formato orientado a linha simples, conforme especificado em load (Reader) e é assumido que ele usa a codificação de caracteres ISO 8859-1 ; cada byte é um caractere Latin1. Caracteres que não estão no Latin1, e certos caracteres especiais, são representados em chaves e elementos usando escapes Unicode, conforme definido na seção 3.3 da Especificação da linguagem Java ™.
Portanto, você precisará salvá-los como ISO-8859-1. Se você tiver algum caractere além do intervalo ISO-8859-1 e não puder usá- \uXXXX
lo em cima da cabeça e for forçado a salvar o arquivo como UTF-8, precisará usar a ferramenta native2ascii para converter um arquivo. Arquivo de propriedades salvas UTF-8 em um arquivo de propriedades salvas ISO-8859-1, em que todos os caracteres descobertos são convertidos em \uXXXX
formato. O exemplo abaixo converte um arquivo de propriedades codificado em UTF-8 text_utf8.properties
em um arquivo de propriedades codificado em ISO-8859-1 válido text.properties
.
native2ascii - codificação UTF-8 text_utf8.properties text.properties
Ao usar um IDE sensato como o Eclipse, isso já é feito automaticamente quando você cria um .properties
arquivo em um projeto baseado em Java e usa o próprio editor do Eclipse. O Eclipse converterá de forma transparente os caracteres além do intervalo ISO-8859-1 em \uXXXX
formato. Veja também as capturas de tela abaixo (observe as guias "Propriedades" e "Origem" na parte inferior, clique para ampliar):
Como alternativa, você também pode criar uma ResourceBundle.Control
implementação customizada na qual você lê explicitamente os arquivos de propriedades como UTF-8 InputStreamReader
, para que você possa salvá-los como UTF-8 sem a necessidade de se preocupar com isso native2ascii
. Aqui está um exemplo de 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;
}
}
Isso pode ser usado da seguinte maneira:
ResourceBundle bundle = ResourceBundle.getBundle("com.example.i18n.text", new UTF8Control());
Veja também: