Character Encoding Trouble - Java

votos
0

Eu escrevi um pequeno aplicativo que faz alguma manipulação de texto e escreve a saída para um arquivo (HTML, CSV, docx, xml) e isso tudo parece funcionar bem em Mac OS X. No windows no entanto I parecem ter problemas de codificação de caracteres e um monte de ' ' parece desaparecer e ser substituído com algumas coisas estranhas. Normalmente, o fechamento '' fora de um par.

Eu uso um FreeMarker para criar meus arquivos de saída e há um byte [] array e em um caso também uma ByteArrayStream entre ler os modelos e escrever a saída. Eu suponho que este é um problema de codificação de caracteres por isso, se alguém poderia dar-me aconselhar ou me aponte para algum recurso 'Melhores Práticas' para lidar com a codificação de caracteres em java.

obrigado

Publicado 07/04/2009 em 11:13
fonte usuário
Em outras línguas...                            


4 respostas

votos
3

Você pode controlar qual codificação seu JVM será executado com pelo fornecimento de f, ex

-Dfile.encoding = UTF-8

para (UTF-8 de curso) como um argumento para a JVM. Em seguida, você deve obter resultados previsíveis em todas as plataformas. Exemplo:

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

Respondeu 07/04/2009 em 11:30
fonte usuário

votos
5

Há realmente apenas uma boa prática: estar ciente de que Cordas e bytes são duas coisas fundamentalmente diferentes, e que sempre que você converter entre eles, você está usando uma codificação de caracteres (implícita ou explicitamente), o que você precisa prestar atenção.

manchas problemáticas típicas na API Java são:

  • new String(byte[])
  • String.getBytes()
  • FileReader, FileWriter

Todos estes usar implicitamente a codificação plataforma padrão, que depende do sistema operacional e configurações de localidade do usuário. Geralmente, é uma boa idéia para evitar este e explicitamente declarar uma codificação nos casos acima (que FileReader / escritor, infelizmente, não permitem, então você tem que usar um InputStreamReader / Writer).

No entanto, seus problemas com as aspas e o uso de um modelo de motor pode ter uma explicação muito mais simples. Que programa você está usando para escrever seus modelos? Parece que é um que insere "aspas inteligentes" , que fazem parte da codificação CP1251 específicos do Windows, mas não existem na codificação ISO-8859-1 mais global.

O que você provavelmente precisa fazer é estar ciente que codificar os seus modelos são salvos, e configurar o seu motor de modelo para usar esse tipo de codificação ao ler nos modelos. Também estar ciente de que alguns arquivos texxt, especificamente XML, declarar explicitamente a codificação em um cabeçalho, e se esse cabeçalho não concorda com a codificação real usado pelo arquivo, você invariável executar em problemas.

Respondeu 07/04/2009 em 11:31
fonte usuário

votos
1

Executando o JVM com uma codificação 'standard' através do confuso chamado -Dfile.encodingvai resolver um monte de problemas.

Garantindo a sua aplicação não faz uso de byte[] <-> Stringconversões sem codificação especificada é importante, já que às vezes você não pode aplicar a codificação VM (por exemplo, se você tiver um servidor de aplicações usado por vários aplicativos)

Se você está confuso com toda a questão de codificação, ou quer rever o seu conhecimento, Joel Spolsky escreveu um ótimo artigo sobre este assunto.

Respondeu 07/04/2009 em 11:44
fonte usuário

votos
0

Eu tinha que ter certeza de que o OutputStreamWriter usa a codificação correta

OutputStream out = ...
OutputStreamWriter writer = new OutputStreamWriter(out, "UTF-8");
template.process(model, writer);

Além disso, se você usar um ByteArrayOutputStream também certificar-se de chamar toString com a codificação correta:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
...
baos.toString("UTF-8");
Respondeu 28/10/2011 em 15:44
fonte usuário

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