Como configuro corretamente a codificação de caracteres padrão usada pela JVM (1.5.x) programaticamente?
Eu li que -Dfile.encoding=whatever
costumava ser o caminho a seguir para JVMs mais antigas. Não tenho esse luxo por razões que não me envolvem.
Eu tentei:
System.setProperty("file.encoding", "UTF-8");
E a propriedade é configurada, mas parece não fazer com que a getBytes
chamada final abaixo use 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());
java
utf-8
character-encoding
Willi Mentzel
fonte
fonte
file.encoding
propriedade não é suportada .class Reader
&class Writer
)? Comoclass FileInputStream
o fluxo de E / S é baseado em bytes, por que alguém deveria se preocupar com o conjunto de caracteres no fluxo de E / S baseado em bytes?Respostas:
Infelizmente, a
file.encoding
propriedade precisa ser especificada quando a JVM é inicializada; no momento em que o método principal é inserido, a codificação de caracteres usada pelosString.getBytes()
construtores padrãoInputStreamReader
eOutputStreamWriter
foi permanentemente armazenada em cache.Como Edward Grech aponta, em um caso especial como este, a variável de ambiente
JAVA_TOOL_OPTIONS
pode ser usada para especificar essa propriedade, mas normalmente é assim:Charset.defaultCharset()
refletirá as alterações nafile.encoding
propriedade, mas a maioria do código nas bibliotecas Java principais que precisam determinar a codificação de caracteres padrão não usa esse mecanismo.Ao codificar ou decodificar, você pode consultar a
file.encoding
propriedade ouCharset.defaultCharset()
encontrar a codificação padrão atual e usar o método apropriado ou a sobrecarga do construtor para especificá-la.fonte
file.encoding
sysprop após a inicialização da JVM.Na documentação da interface da ferramenta JVM ™ …
Ao definir a variável de ambiente (Windows)
JAVA_TOOL_OPTIONS
como-Dfile.encoding=UTF8
, aSystem
propriedade (Java) será configurada automaticamente sempre que uma JVM for iniciada. Você saberá que o parâmetro foi escolhido porque a seguinte mensagem será publicada emSystem.err
:fonte
UTF8
ouUTF-8
?Eu tenho uma maneira hacky que definitivamente funciona !!
Dessa forma, você enganará a JVM, que pensaria que o charset não está definido e o configuraria novamente para UTF-8, em tempo de execução!
fonte
WARNING: An illegal reflective access operation has occurred • WARNING: Illegal reflective access by [..] • WARNING: Please consider reporting this to the maintainers of [..] • WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations • WARNING: All illegal access operations will be denied in a future release
Eu acho que uma abordagem melhor do que definir o conjunto de caracteres padrão da plataforma, especialmente porque você parece ter restrições em afetar a implantação do aplicativo, e muito menos a plataforma, é chamar de muito mais seguro
String.getBytes("charsetName")
. Dessa forma, seu aplicativo não depende de coisas além de seu controle.Pessoalmente, acho que isso
String.getBytes()
deve ser descontinuado, pois causou sérios problemas em vários casos que já vi, nos quais o desenvolvedor não considerou o charset padrão possivelmente alterado.fonte
Não consigo responder à sua pergunta original, mas gostaria de lhe oferecer alguns conselhos - não dependa da codificação padrão da JVM. É sempre melhor especificar explicitamente a codificação desejada (por exemplo, "UTF-8") no seu código. Dessa forma, você sabe que funcionará mesmo em diferentes sistemas e configurações de JVM.
fonte
Tente o seguinte:
fonte
Estávamos tendo os mesmos problemas. Metodologicamente, tentamos várias sugestões deste artigo (e de outros) sem sucesso. Também tentamos 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
emJava/Tomcat
http://www.jvmhost.com/articles/locale-breaks-unicode-utf-8-java-tomcat
Definir o código do idioma corretamente no
~/.bashrc
arquivo funcionou para nós.fonte
Eu tentei muitas coisas, mas o código de exemplo aqui funciona perfeitamente. Ligação
O cerne do código é:
fonte
Caso você esteja usando o Spring Boot e deseje passar o argumento
file.encoding
na JVM, execute-o assim:isso foi necessário para nós, pois estávamos usando
JTwig
modelos e o sistema operacional tinhaANSI_X3.4-1968
descoberto por meio deSystem.out.println(System.getProperty("file.encoding"));
Espero que isso ajude alguém!
fonte
Estou usando o Amazon (AWS) Elastic Beanstalk e o alterei com sucesso para UTF-8.
No Elastic Beanstalk, vá para Configuração> Software, "Propriedades do ambiente". Inclua (nome) JAVA_TOOL_OPTIONS com (value) -Dfile.encoding = UTF8
Após salvar, o ambiente será reiniciado com a codificação UTF-8.
fonte
Não está claro o que você faz e não tem controle neste momento. Se você puder interpor uma classe OutputStream diferente no arquivo de destino, poderá usar um subtipo de OutputStream que converta Strings em bytes em um conjunto de caracteres definido, por exemplo, UTF-8. Se o UTF-8 modificado for suficiente para suas necessidades, você poderá usar
DataOutputStream.writeUTF(String)
:Se essa abordagem não for viável, pode ser útil 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 determinar). Boa sorte.
fonte
O comando trabalhou com exec-maven-plugin para resolver o seguinte erro ao configurar uma tarefa jenkins.
fonte
Definimos duas propriedades do sistema juntas e isso faz com que o sistema leve tudo para o utf8
fonte
Após o comentário do @Caspar na resposta aceita, a maneira preferida de corrigir isso de acordo com a Sun é:
"altere o código de idioma da plataforma subjacente antes de iniciar seu programa Java."
http://bugs.java.com/view_bug.do?bug_id=4163515
Para janela de encaixe, consulte:
http://jaredmarkell.com/docker-and-locales/
fonte
Recentemente, deparei-me com o sistema Notes 6.5 de uma empresa local e descobri que o webmail mostraria caracteres não identificáveis em uma instalação do Windows que não fosse Zhongwen. Pesquisei por várias semanas on-line, descobri isso há apenas alguns minutos:
Nas propriedades Java, inclua a seguinte sequência em Parâmetros de Tempo de Execução
A configuração UTF-8 não funcionaria neste caso.
fonte
Minha equipe encontrou o mesmo problema em máquinas com Windows. Em seguida, conseguiu resolvê-lo de duas maneiras:
a) Defina a variável de ambiente (mesmo nas preferências do sistema Windows)
JAVA_TOOL_OPTIONS
-Dfile.encoding = UTF8
b) Introduza o seguinte snippet no seu pom.xml:
DENTRO
fonte