Propriedades Java Codificação UTF-8 no Eclipse

Eu recentemente tive que mudar a codificação do webapp que estou trabalhando de ISO-xx para utf8 . Tudo correu bem, exceto arquivos de propriedades. Eu adicionei -Dfile.encoding=UTF-8 no eclipse.ini e arquivos normais funcionam bem. Propriedades, no entanto, mostram algum comportamento estranho.

Se eu copiar as propriedades codificadas utf8 do Notepad ++ e colá-las no Eclipse, elas serão exibidas e funcionarão bem. Quando eu reabrir o arquivo de propriedades, vejo alguns caracteres Unicode em vez de adequados, como:

 Zur\u00EF\u00BF\u00BDck instead of Zurück 

mas o aplicativo ainda funciona bem. Se eu começar a editar as propriedades, adicionar alguns caracteres especiais e salvar, eles serão exibidos corretamente, no entanto, eles não funcionam e todos os caracteres especiais que funcionam anteriormente não funcionam mais.

Quando eu comparo a versão local com o CVS eu posso ver os caracteres especiais corretamente no arquivo remoto e após a atualização eu estou no começo novamente: o aplicativo funciona, mas o Eclipse exibe caracteres Unicode.

Eu tentei alterar a codificação de arquivos clicando com o botão direito e selecionando “Other: UTF8”, mas isso não ajudou. Ele também disse: “determinado a partir do conteúdo: ISO-8859-1”

Estou usando o Java 6 e o ​​Jboss Developer baseados no Eclipse 3.3

Eu posso viver com isso editando propriedades no Notepad ++ e colando-as no Eclipse, mas eu ficaria muito grato se alguém puder me ajudar a consertar isso no Eclipse.

Não perca seu tempo, você pode usar o plugin do Resource Bundle no Eclipse

Captura Básica da Tela

Página antiga do Sourceforge

Os arquivos de propriedades são ISO-8859-1 por definição – consulte os documentos para a class Properties .

O Spring possui uma substituição que pode ser carregada com uma codificação especificada, usando o PropertiesFactoryBean .

EDIT: Como Laurence observou nos comentários, o Java 1.6 introduziu sobrecargas de load e store que levam um Reader / Writer . Isso significa que você pode criar um leitor para o arquivo com qualquer codificação desejada e passá-lo para load . Infelizmente FileReader ainda não permite que você especifique a codificação no construtor (aargh), então você vai ficar preso com o encadeamento de FileInputStream e InputStreamReader juntos. No entanto, vai funcionar.

Por exemplo, para ler um arquivo usando o UTF-8:

 Properties properties = new Properties(); InputStream inputStream = new FileInputStream("path/to/file"); try { Reader reader = new InputStreamReader(inputStream, "UTF-8"); try { properties.load(reader); } finally { reader.close(); } } finally { inputStream.close(); } 

Não é um problema com o Eclipse. Se você estiver usando a class Properties para ler e armazenar o arquivo de propriedades, a class irá escaping todos os caracteres especiais.

Da documentação da aula:

Ao salvar propriedades em um stream ou carregá-las de um stream, a codificação de caracteres ISO 8859-1 é usada. Para caracteres que não podem ser representados diretamente nesta codificação, são usados ​​os escapes Unicode; no entanto, somente um único caractere ‘u’ é permitido em uma seqüência de escape. A ferramenta native2ascii pode ser usada para converter arquivos de propriedade para e de outras codificações de caracteres.

Da API, o método store ():

Caracteres menores que \ u0020 e caracteres maiores que \ u007E são escritos como \ uxxxx para o valor hexadecimal apropriado xxxx.

 Properties props = new Properties(); URL resource = getClass().getClassLoader().getResource("data.properties"); props.load(new InputStreamReader(resource.openStream(), "UTF8")); 

Funciona como um encanto

🙂

Há muitos pontos no processo em que você descreve onde os erros podem ocorrer, então não vou tentar adivinhar o que você está fazendo de errado, mas acho que sei o que está acontecendo sob o capô.

EF BF BD é a forma codificada UTF-8 de U+FFFD , o caractere de substituição padrão que é inserido pelos decodificadores quando eles encontram inputs malformadas. Parece que seu texto está sendo salvo como ISO-8859-1, depois lido como se fosse UTF-8, depois salvo como UTF-8 e convertido para o formato Properties usando native2ascii usando a codificação padrão da plataforma (por exemplo, windows- 1252).

  ü => 0xFC // salva como ISO-8859-1
 0xFC => U + FFFD // lido como UTF-8
 U + FFFD => 0xEF 0xBF 0xBD // salva como UTF-8
 0xEF 0xBF 0xBD => \ u00EF \ u00BF \ u00BD // native2ascii 

Eu sugiro que você deixe a propriedade “file.encoding” sozinha. Como “file.separator” e “line.separator”, não é tão útil quanto você esperaria que fosse. Em vez disso, adquira o hábito de sempre especificar uma codificação ao ler e gravar arquivos de texto.

 Properties props = new Properties(); URL resource = getClass().getClassLoader().getResource("data.properties"); props.load(new InputStreamReader(resource.openStream(), "UTF8")); 

isso funciona bem no java 1.6. Como posso fazer isso em 1.5, desde que a class Properties não tem um método para pars InputStreamReader .

Existe uma maneira muito mais fácil:

 props.load(new InputStreamReader(new FileInputStream("properties_file"), "UTF8")); 

Apenas outro plugin do Eclipse para arquivos * .properties:

Editor de propriedades

Isso parece funcionar apenas para alguns caracteres … incluindo caracteres especiais para alemão, português e francês. No entanto, tive problemas com os caracteres russo, hindi e mandarim. Estes não são convertidos para o formato de propriedades ‘native2ascii’, em vez disso, são salvos com ?? ?? ??
A única maneira de conseguir que meu aplicativo exiba esses caracteres corretamente é colocando-os no arquivo de propriedades convertido para o formato UTF-8 – como \ u0915 em vez de क ou \ u044F em vez de я. Algum conselho?

Eu recomendo que você use Attesoro ( http://attesoro.org/ ). É simples e fácil de usar. E é feito em java.

Você pode definir arquivos .properties UTF-8 para armazenar suas traduções e usar ResourceBundle para obter valores. Para evitar problemas, você pode alterar a codificação:

 String value = RESOURCE_BUNDLE.getString(key); return new String(value.getBytes("ISO-8859-1"), "UTF-8"); 

Se as propriedades forem para XML ou HTML, é mais seguro usar entidades XML. Eles são mais feios para ler, mas isso significa que o arquivo de propriedades pode ser tratado como ASCII direto, então nada será mutilado.

Observe que o HTML tem entidades que o XML não possui, portanto, posso mantê-lo seguro usando o XML direto: http://www.w3.org/TR/html4/sgml/entities.html