Définition du codage de caractères Java par défaut?


Comment définir correctement le codage de caractères par défaut utilisé par la JVM (1.5.x) par programmation?

J'ai lu que -Dfile.encoding=whatever était la voie à suivre pour les anciennes JVM... Je n'ai pas ce luxe pour des raisons dans lesquelles je ne vais pas entrer.

J'ai essayé:

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

Et la propriété est définie, mais il ne semble pas que le dernier appel getBytes ci-dessous utilise 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());
Author: Bhavik Ambani, 2008-12-12

15 answers

Malheureusement, la propriété file.encoding doit être spécifiée au démarrage de la JVM; au moment où votre méthode principale est entrée, le codage de caractères utilisé par String.getBytes() et les constructeurs par défaut de InputStreamReader et OutputStreamWriter a été définitivement mis en cache.

, Comme Edward Grech souligne, dans un cas comme celui-ci, la variable d'environnement JAVA_TOOL_OPTIONS peut - être utilisé pour spécifier cette propriété, mais il est normalement fait comme ceci:

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

Charset.defaultCharset() reflétera les changements apportés au file.encoding propriété, mais la plupart du code dans les bibliothèques Java de base qui doivent déterminer le codage de caractères par défaut n'utilisent pas ce mécanisme.

Lorsque vous encodez ou décodez, vous pouvez interroger la propriété file.encoding ou Charset.defaultCharset() pour trouver l'encodage par défaut actuel, et utiliser la méthode appropriée ou la surcharge du constructeur pour le spécifier.

 261
Author: erickson, 2017-05-23 11:54:46

Depuis l'interface de l'outil JVM™ documentation...

Étant donné que la ligne de commande ne peut pas toujours être consultée ou modifiée, par exemple dans les machines virtuelles intégrées ou simplement dans les scripts, une variable JAVA_TOOL_OPTIONS est fournie afin que les agents puissent être lancés dans ces cas.

En définissant la variable d'environnement (Windows) JAVA_TOOL_OPTIONS sur -Dfile.encoding=UTF8, la propriété (Java) System sera définie automatiquement à chaque démarrage d'une JVM. Vous saurez que le paramètre a été ramassé parce que le message suivant sera posté sur System.err:

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8

 154
Author: Edward Grech, 2009-03-08 04:46:37

J'ai une façon hacky qui fonctionne vraiment!!

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

De cette façon, vous allez tromper JVM qui penserait que charset n'est pas défini et le faire pour le remettre en UTF-8, lors de l'exécution!

 55
Author: naskoos, 2013-03-22 10:16:57

Je pense qu'une meilleure approche que de définir le jeu de caractères par défaut de la plate-forme, d'autant plus que vous semblez avoir des restrictions sur le déploiement de l'application, sans parler de la plate-forme, est d'appeler le String.getBytes("charsetName") beaucoup plus sûr. De cette façon, votre application ne dépend pas de choses indépendantes de sa volonté.

Personnellement, je pense que String.getBytes() devrait être obsolète, car cela a causé de graves problèmes dans un certain nombre de cas que j'ai vus, où le développeur ne tenait pas compte du jeu de caractères par défaut changer.

 36
Author: Dov Wasserman, 2017-03-30 14:15:10

Je ne peux pas répondre à votre question d'origine mais je voudrais vous donner quelques conseils don ne dépendez pas de l'encodage par défaut de la JVM. Il est toujours préférable de spécifier explicitement l'encodage souhaité (c'est à dire "UTF-8") dans votre code. De cette façon, vous savez que cela fonctionnera même sur différents systèmes et configurations JVM.

 17
Author: Marc Novakowski, 2008-12-12 05:36:04

Essayez ceci :

    new OutputStreamWriter( new FileOutputStream("Your_file_fullpath" ),Charset.forName("UTF8"))
 12
Author: Emmanuel.B, 2012-01-20 18:09:42

Nous avions les mêmes problèmes. Nous avons méthodiquement essayé plusieurs suggestions de cet article (et d'autres) en vain. Nous avons également essayé d'ajouter le fichier-Dfile.encoding=UTF8 et rien ne semblait fonctionner.

Pour les personnes qui ont ce problème, l'article suivant nous a finalement aidés à trouver décrit comment le paramètre régional peut casser unicode / UTF-8 dans Java / Tomcat

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

Réglage de la paramètres régionaux correctement dans le ~/.le fichier bashrc a travaillé pour nous.

 5
Author: D Bright, 2014-01-09 00:46:28

J'ai essayé beaucoup de choses, mais l'exemple de code ici fonctionne parfaitement. Lien

Le nœud du code est:

String s = "एक गाव में एक किसान";
String out = new String(s.getBytes("UTF-8"), "ISO-8859-1");
 3
Author: Lavixu, 2016-01-03 16:15:57

Si vous utilisez Spring Boot et que vous souhaitez passer l'argument file.encoding dans JVM, vous devez l'exécuter comme ceci:

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

Cela était nécessaire pour nous puisque nous utilisions JTwig templates et que le système d'exploitation avait ANSI_X3.4-1968 que nous avons découvert à travers System.out.println(System.getProperty("file.encoding"));

J'espère que cela aide quelqu'un!

 3
Author: Michail Michailidis, 2018-02-23 17:01:53

Pas clair sur ce que vous faites et n'avez pas de contrôle à ce stade. Si vous pouvez interposer une classe OutputStream différente sur le fichier de destination, vous pouvez utiliser un sous-type de OutputStream qui convertit les chaînes en octets sous un jeu de caractères que vous définissez, par exemple UTF-8 par défaut. Si UTF-8 modifié est suffisant pour vos besoins, vous pouvez utiliser 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

Si cette approche n'est pas réalisable, cela peut être utile si vous clarifiez ici exactement ce que vous pouvez et ne pouvez pas contrôler en termes de flux de données et d'exécution environnement (même si je sais que c'est parfois plus facile à dire qu'à déterminer). Bonne chance.

 1
Author: Dov Wasserman, 2008-12-16 03:59:32
mvn clean install -Dfile.encoding=UTF-8 -Dmaven.repo.local=/path-to-m2

Commande a fonctionné avec exec-maven-plugin pour résoudre l'erreur suivante lors de la configuration d'une tâche 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)
 1
Author: prabushi samarakoon, 2018-03-06 08:28:28

Nous y définissons deux propriétés système ensemble et cela fait que le système prend tout en utf8

file.encoding=UTF8
client.encoding.override=UTF-8
 0
Author: lizi, 2012-01-19 19:23:40

Suite au commentaire de @Caspar sur la réponse acceptée, le moyen préféré de résoudre ce problème selon Sun est:

"modifiez les paramètres régionaux de la plate-forme sous-jacente avant de démarrer votre programme Java."

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

Pour docker voir:

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

 0
Author: Luis Muñoz, 2017-10-05 15:40:32

Récemment, je suis tombé sur le système Notes 6.5 d'une entreprise locale et j'ai découvert que le webmail afficherait des caractères non identifiables sur une installation Windows non localisée Zhongwen. J'ai creusé pendant plusieurs semaines en ligne, je l'ai compris il y a quelques minutes:

Dans les propriétés Java, ajoutez la chaîne suivante aux paramètres d'exécution

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

Le réglage UTF-8 ne fonctionnerait pas dans ce cas.

 0
Author: midmaestro, 2017-10-14 17:14:47

J'utilise Amazon (AWS) Elastic Beanstalk et l'ai changé avec succès en UTF-8.

Dans Elastic Beanstalk, allez dans Configuration > Software, "Environment properties". Ajoutez (nom) JAVA_TOOL_OPTIONS avec (valeur) -Dfile.encodage = UTF8

Après l'enregistrement, l'environnement redémarre avec l'encodage UTF-8.

 0
Author: Berend Menninga, 2018-04-24 08:59:03