aplicação Java falha em caracteres especiais

votos
0

Uma aplicação que estou trabalhando lê informações de arquivos para preencher um banco de dados. Alguns dos caracteres nos arquivos são não-Inglês, por exemplo caracteres acentuados franceses.

A aplicação está funcionando bem no Windows, mas em nossa máquina Solaris é não reconhecer os caracteres especiais e é lançar uma exceção. Por exemplo quando encontra o e acentuado no Gerer ele diz: -

      Encontrado: \ u0161 (353), depois: \ L \ u00c3 \ u00a9rer les mod \ u00c3

(Uma exceção que é lançada a partir de nossa aplicação)

Eu suspeito que, a fim de impedir que isso aconteça eu preciso alterar a propriedade file.encoding do JVM. Tentei fazer isso através System.setProperty (), mas ele não parou o erro ocorra.

Há alguma sugestão para o que eu poderia fazer? Eu estava pensando sobre como definir o local básico da plataforma Solaris em / etc / default / init para ser UTF-8. Alguém acredita que isso pode ajudar?

Todos os pensamentos são muito apreciados.

Publicado 30/10/2008 em 17:53
fonte usuário
Em outras línguas...                            


8 respostas

votos
4

Que se parece com um arquivo que foi convertido por native2asciiusando os parâmetros errados. Para demonstrar, crie um arquivo com o conteúdo

Gérer les modÚ

e salve-o como "a.txt" com a codificação UTF-8. Em seguida, execute o seguinte comando:

native2ascii -encoding windows-1252 a.txt b.txt

Abra o novo arquivo e você deve ver o seguinte:

G\u00c3\u00a9rer les mod\u00c3\u0161

Agora reverter o processo, mas especificar ISO-8859-1 desta vez:

native2ascii -reverse -encoding ISO-8859-1 b.txt c.txt

Leia o novo arquivo como UTF-8 e você deve ver o seguinte:

Gérer les modÀ\u0161

Ele recupera o "é" bem, mas engasga com o "U", como seu aplicativo fez.

Eu não sei o que tudo está dando errado em seu aplicativo, mas eu tenho certeza que o uso incorreto de native2ascii é parte dela. E que foi provavelmente o resultado de deixar o aplicativo usar a codificação padrão do sistema. Você sempre deve especificar a codificação quando você salvar o texto, se é para um arquivo ou um banco de dados ou o que - nunca deixá-lo padrão. E se você não tem uma boa razão para escolher outra coisa, use UTF-8.

Respondeu 30/10/2008 em 19:45
fonte usuário

votos
2

Tente usar

java -Dfile.encoding=UTF-8 ...

quando se inicia a aplicação em ambos os sistemas.

Outra maneira de resolver o problema é alterar a codificação de ambos sistema para UTF-8, mas eu prefiro a primeira opção (menos intrusivo no sistema).

EDITAR:

Verifique esta resposta em stackoverflow, pode ajudar qualquer um:

Alterar o padrão de codificação para a corda (byte [])

Respondeu 30/10/2008 em 18:03
fonte usuário

votos
1

Eu consegui obter passado este erro, executando o comando

export LC_ALL = 'en_GB.UTF-8'

Este comando definir a localidade para o shell que eu estava em. Este conjunto de todas as variáveis ​​de ambiente LC_ para o arquivo de codificação Unicode.

Muito obrigado por todas as suas sugestões.

Respondeu 31/10/2008 em 12:58
fonte usuário

votos
1

Em vez de definir a codificação de caracteres de todo o sistema, pode ser mais fácil e mais robusto, para especificar a codificação de caracteres ao ler e gravar dados de texto específicos. Como está lendo sua aplicação os arquivos? Todos os Java I / O leitores e escritores pacote de apoio passando em um nome de codificação de caracteres a serem usados ​​durante a leitura / escrita de texto para / de bytes. Se você não especificar um, em seguida, irá usar a codificação padrão da plataforma, como você está provavelmente experimentando.

Alguns bancos de dados são surpreendentemente limitado nas codificações de texto que pode aceitar. Se o seu aplicativo Java lê os arquivos como texto, com a codificação adequada, então ele pode produzir-lo para o banco de dados no entanto ele precisa. Se seu banco de dados não suporta qualquer codificação cujo repertório de caracteres inclui os caracteres não-ASCII que você tem, então você pode precisar para codificar seu texto não-Inglês em primeiro lugar, por exemplo, em UTF-8 bytes, em seguida, Base64 codificar os bytes como texto ASCII .

PS: Nunca use String.getBytes()com nenhum argumento codificação de caracteres exatamente pelas razões que você está vendo.

Respondeu 31/10/2008 em 00:34
fonte usuário

votos
0

Java usa a codificação padrão do sistema operacional durante a leitura e escrita de arquivos. Agora, nunca se deve contar com isso. É sempre uma boa prática para especificar a codificação explicitamente.

Em Java você pode usar seguinte para leitura e escrita:

Leitura:

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(inputPath),"UTF-8"));

Escrevendo:

PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputPath), "UTF-8")));
Respondeu 24/05/2010 em 07:16
fonte usuário

votos
0

Além disso, você pode querer verificar se os pacotes do sistema operacional para suportar UTF-8 (SUNWeulux, SUNWeuluf etc) estão instalados.

Respondeu 31/10/2008 em 02:22
fonte usuário

votos
0

Acho que vamos precisar de mais informações para ser capaz de ajudá-lo com o seu problema:

  1. O exceção que você está recebendo exatamente, e qual o método que você está chamando quando ela ocorre.
  2. O que é a codificação do arquivo de entrada? UTF8? UTF16 / Unicode? ISO8859-1?

Ele também vai ser útil se você pudesse nos fornecer trechos de código relevantes.

Além disso, algumas coisas que eu quero salientar:

  1. O problema não está ocorrendo na 'é', mas mais tarde.
  2. Parece que a codificação de caracteres pode ser codificado em sua aplicação em algum lugar.
Respondeu 31/10/2008 em 01:52
fonte usuário

votos
0

Você também pode definir a codificação na linha de comando, como assim java -Dfile.encoding=utf-8.

Respondeu 30/10/2008 em 18:03
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more