Definir o padrão Java codificação de caracteres?

votos
302

Como faço para configurar adequadamente a codificação de caracteres padrão usado pela JVM (1.5.x) de programação?

Eu li que -Dfile.encoding=whatevercostumava ser o caminho a percorrer para JVMs mais velhos ... eu não tenho esse luxo por razões que eu não vou entrar.

Eu tentei:

System.setProperty(file.encoding, UTF-8);

E a propriedade fica definido, mas não parece causar os getBytes finais chamar abaixo para usar UTF8:

    System.setProperty(file.encoding, UTF-8);

    byte inbytes[] = new byte[1024];

    FileInputStream fis = new FileInputStream(response.txt);
    fis.read(inbytes);
    FileOutputStream fos = new FileOutputStream(response-2.txt);
    String in = new String(inbytes, UTF8);
    fos.write(in.getBytes());
Publicado 12/12/2008 em 06:31
fonte usuário
Em outras línguas...                            


16 respostas

votos
249

Infelizmente, a file.encodingpropriedade tem que ser especificado como o JVM é iniciada; no momento em que o seu método principal é inserido, a codificação de caracteres usado por String.getBytes()e os construtores padrão de InputStreamReadere OutputStreamWritertem sido permanentemente em cache.

Como assinala Edward Grech, em um caso especial como este, a variável de ambiente JAVA_TOOL_OPTIONS pode ser usado para especificar esta propriedade, mas é normalmente feito assim:

java -Dfile.encoding=UTF-8 … com.x.Main

Charset.defaultCharset()refletirá alterações à file.encodingpropriedade, mas a maior parte do código no núcleo bibliotecas Java que precisam determinar a codificação de caracteres padrão não use esse mecanismo.

Quando você está codificação ou decodificação, você pode consultar a file.encodingpropriedade ou Charset.defaultCharset()a encontrar a codificação padrão atual, e usar o método ou construtor sobrecarga apropriada para especificá-lo.

Respondeu 12/12/2008 em 06:56
fonte usuário

votos
151

A partir da JVM ™ Interface Tool documentação ...

Desde a linha de comando nem sempre pode ser acessada ou modificada, por exemplo, em incorporado VMs ou simplesmente VMs lançou profundamente dentro de scripts, uma JAVA_TOOL_OPTIONSvariável é fornecido para que os agentes podem ser lançados nestes casos.

Ao definir a variável (Windows) ambiente JAVA_TOOL_OPTIONSpara -Dfile.encoding=UTF8o (Java) Systempropriedade será definida automaticamente cada vez que um JVM é iniciado. Você saberá que o parâmetro foi pego porque a seguinte mensagem será enviada para System.err:

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8

Respondeu 08/03/2009 em 05:31
fonte usuário

votos
54

Eu tenho uma maneira hacky que definitivamente funciona !!

System.setProperty("file.encoding","UTF-8");
Field charset = Charset.class.getDeclaredField("defaultCharset");
charset.setAccessible(true);
charset.set(null,null);

Desta forma, você está indo para enganar JVM que poderia pensar que charset não está definido e torná-lo para defini-la novamente para UTF-8, em tempo de execução!

Respondeu 20/02/2013 em 20:09
fonte usuário

votos
35

Eu acho que uma abordagem melhor do que a criação conjunto de caracteres padrão da plataforma, especialmente porque parece que você tem restrições ao afetar a implantação de aplicativos, e muito menos a plataforma, é chamar o muito mais seguro String.getBytes("charsetName"). Dessa forma, sua aplicação não depende de coisas fora de seu controle.

Pessoalmente, sinto que String.getBytes()deve ser obsoleto, uma vez que tem causado sérios problemas em um número de casos que tenho visto, onde o desenvolvedor não conta para o padrão charset possivelmente mudando.

Respondeu 12/12/2008 em 06:39
fonte usuário

votos
17

Eu não posso responder à sua pergunta original, mas eu gostaria de oferecer-lhe alguns conselhos - não dependem de codificação padrão do JVM. É sempre melhor para especificar explicitamente a codificação desejada (ou seja, "UTF-8") em seu código. Dessa forma, você sabe que vai funcionar mesmo entre diferentes sistemas e configurações de JVM.

Respondeu 12/12/2008 em 06:36
fonte usuário

votos
12

Tente isto:

    new OutputStreamWriter( new FileOutputStream("Your_file_fullpath" ),Charset.forName("UTF8"))
Respondeu 20/01/2012 em 19:09
fonte usuário

votos
5

Nós estávamos tendo os mesmos problemas. Nós metodicamente tentou várias sugestões a partir deste artigo (e outros) sem sucesso. Também tentei adicionar o -Dfile.encoding = UTF8 e nada parecia estar funcionando.

Para as pessoas que estão tendo este problema, o seguinte artigo finalmente nos ajudou a rastrear descreve como a definição de região pode quebrar unicode / UTF-8 em Java / Tomcat

http://www.jvmhost.com/articles/locale-breaks-unicode-utf-8-java-tomcat

Definir o local corretamente no arquivo ~ / .bashrc funcionou para nós.

Respondeu 09/01/2014 em 01:46
fonte usuário

votos
2

No caso de você estiver usando Primavera Bota e quer passar o argumento file.encodingde JVM você tem que executá-lo assim:

mvn spring-boot:run -Drun.jvmArguments="-Dfile.encoding=UTF-8"

este era necessário para nós, pois estávamos usando JTwigtemplates e do sistema operacional tinha ANSI_X3.4-1968que descobrimos atravésSystem.out.println(System.getProperty("file.encoding"));

Espero que isso ajude alguém!

Respondeu 23/02/2018 em 17:01
fonte usuário

votos
1
mvn clean install -Dfile.encoding=UTF-8 -Dmaven.repo.local=/path-to-m2

comando trabalhou com exec-maven-plugin para resolver seguinte erro ao configurar uma tarefa Jenkins.

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512m; support was removed in 8.0
Error occurred during initialization of VM
java.nio.charset.IllegalCharsetNameException: "UTF-8"
    at java.nio.charset.Charset.checkName(Charset.java:315)
    at java.nio.charset.Charset.lookup2(Charset.java:484)
    at java.nio.charset.Charset.lookup(Charset.java:464)
    at java.nio.charset.Charset.defaultCharset(Charset.java:609)
    at sun.nio.cs.StreamEncoder.forOutputStreamWriter(StreamEncoder.java:56)
    at java.io.OutputStreamWriter.<init>(OutputStreamWriter.java:111)
    at java.io.PrintStream.<init>(PrintStream.java:104)
    at java.io.PrintStream.<init>(PrintStream.java:151)
    at java.lang.System.newPrintStream(System.java:1148)
    at java.lang.System.initializeSystemClass(System.java:1192)
Respondeu 06/03/2018 em 08:28
fonte usuário

votos
1

Eu tentei um monte de coisas, mas o código de exemplo aqui funciona perfeito. Ligação

O ponto crucial do código é:

String s = "एक गाव में एक किसान";
String out = new String(s.getBytes("UTF-8"), "ISO-8859-1");
Respondeu 03/07/2014 em 10:33
fonte usuário

votos
1

Não está claro sobre o que você faz e não tem controle sobre neste momento. Se você pode interpor uma classe OutputStream diferente no arquivo de destino, você poderia usar um subtipo de OutputStream que converte strings para bytes sob um charset você define, dizem UTF-8 por padrão. Se UTF-8 modificado é suffcient para suas necessidades, você pode usar DataOutputStream.writeUTF(String):

byte inbytes[] = new byte[1024];
FileInputStream fis = new FileInputStream("response.txt");
fis.read(inbytes);
String in = new String(inbytes, "UTF8");
DataOutputStream out = new DataOutputStream(new FileOutputStream("response-2.txt"));
out.writeUTF(in); // no getBytes() here

Se esta abordagem não é viável, pode ajudar se você esclarecer aqui exatamente o que você pode e não pode controlar em termos de fluxo de dados e ambiente de execução (embora eu saiba que às vezes é mais fácil dizer do que determinado). Boa sorte.

Respondeu 16/12/2008 em 04:59
fonte usuário

votos
0

Minha equipe encontrou o mesmo problema em máquinas com o Windows .. então conseguiu resolvê-lo de duas maneiras:

a) Definir variável ambiente (mesmo nas preferências de sistema do Windows)

JAVA_TOOL_OPTIONS
-Dfile.encoding = UTF-8

b) Introduzir seguinte trecho ao seu pom.xml:

 -Dfile.encoding=UTF-8 

DENTRO

 <jvmArguments>
 -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8001
 -Dfile.encoding=UTF-8
 </jvmArguments>
Respondeu 03/07/2019 em 15:58
fonte usuário

votos
0

Estou usando Amazon (AWS) Elastic Beanstalk e mudou com sucesso para UTF-8.

Em Elastic Beanstalk, vá para Configuração> Software, "propriedades de ambiente". Adicionar (nome) JAVA_TOOL_OPTIONS com (valor) -Dfile.encoding = UTF8

Depois de salvar, o ambiente irá reiniciar com a codificação UTF-8.

Respondeu 24/04/2018 em 08:59
fonte usuário

votos
0

Recentemente eu esbarrei em sistema Notes 6.5 de uma empresa local e descobriu o webmail iria mostrar personagens não identificáveis ​​sobre um não-Zhongwen localed instalação do Windows. Cavaram durante várias semanas on-line, descobri-lo apenas alguns minutos atrás:

Em propriedades Java, adicione a seguinte cadeia de Runtime Parameters

-Dfile.encoding=MS950 -Duser.language=zh -Duser.country=TW -Dsun.jnu.encoding=MS950

UTF-8 configuração não funciona neste caso.

Respondeu 14/10/2017 em 17:14
fonte usuário

votos
0

Seguinte comentário @Caspar em resposta aceita, a forma preferida para corrigir isso de acordo com a Sun é:

"Alterar a localidade da plataforma subjacente antes de iniciar seu programa de Java."

http://bugs.java.com/view_bug.do?bug_id=4163515

Para estivador ver:

http://jaredmarkell.com/docker-and-locales/

Respondeu 05/10/2017 em 15:40
fonte usuário

votos
0

Nós estabelecemos há duas propriedades do sistema em conjunto e isso torna o sistema levar tudo em utf8

file.encoding=UTF8
client.encoding.override=UTF-8
Respondeu 19/01/2012 em 20:23
fonte usuário

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