Définition de L'encodage 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 JVM plus anciennes... Je n'ai pas ce luxe pour des raisons qui m'échappent.

j'ai essayé:

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

et la propriété est définie, mais il ne semble pas causer l'appel final getBytes ci-dessous pour utiliser 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());
310
demandé sur Bhavik Ambani 2008-12-12 08:31:21

15 réponses

malheureusement, la propriété file.encoding doit être spécifiée lorsque la JVM démarre; 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 ont été mis en cache de façon permanente.

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

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

Charset.defaultCharset() reflétera les changements à la propriété file.encoding , mais la plupart du code dans les bibliothèques Java de base qui ont besoin de 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 le codage par défaut courant, et utiliser la méthode appropriée ou la surcharge du constructeur pour spécifier il.

261
répondu erickson 2017-05-23 11:54:46

De la JVM™ Interface de l'Outil de la documentation...

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

en paramétrant la variable d'environnement (Windows) JAVA_TOOL_OPTIONS à -Dfile.encoding=UTF8 , la variable (Java) System la propriété sera définie automatiquement chaque fois qu'une JVM est lancée. Vous saurez que le paramètre a été repris car le message suivant sera posté sur System.err :

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8

154
répondu Edward Grech 2009-03-08 04:46:37

j'ai une façon hacky qui fonctionne certainement!!

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 le charset n'est pas réglé et le faire régler à nouveau à UTF-8, sur runtime!

55
répondu 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, et encore moins la plate-forme, est d'appeler le beaucoup plus sûr String.getBytes("charsetName") . De cette façon, votre application ne dépend pas de choses indépendantes de sa volonté.

je pense personnellement que String.getBytes() devrait être déprécié, car il a causé de graves problèmes dans un certain nombre de cas que j'ai vu, où le développeur n'a pas tenir compte du fait que le jeu de caractères par défaut peut changer.

36
répondu 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 -- ne dépend pas de l'encodage par défaut de la JVM. Il est toujours préférable de spécifier explicitement le codage désiré (i.e. "UTF-8") dans votre code. De cette façon, vous savez que cela fonctionnera même à travers différents systèmes et configurations JVM.

17
répondu Marc Novakowski 2008-12-12 05:36:04

essayez ceci:

    new OutputStreamWriter( new FileOutputStream("Your_file_fullpath" ),Charset.forName("UTF8"))
12
répondu 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 -Dfile.encoding=UTF8 et rien ne semblait fonctionner.

pour les gens qui ont ce problème, l'article suivant nous a finalement aidé à traquer décrit comment le paramètre locale peut casser unicode / UTF-8 en Java /Tomcat

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

paramétrage de la locale correctement dans le~/.le fichier bashrc a fonctionné pour nous.

5
répondu D Bright 2014-01-09 00:46:28

j'ai essayé beaucoup de choses, mais le code ici fonctionne parfaitement. Lien

le cœur du code est:

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

dans le cas où vous utilisez la botte de printemps et que vous voulez 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 gabarits et le système d'exploitation avait ANSI_X3.4-1968 que nous avons découvert par System.out.println(System.getProperty("file.encoding"));

Espérons que cela aide quelqu'un!

3
répondu Michail Michailidis 2018-02-23 17:01:53

Pas clair sur ce que vous faites et n'ont pas le contrôle à ce point. Si vous pouvez interposer une classe de 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, disons UTF-8 par défaut. Si L'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, il peut être utile de clarifier ici exactement ce que vous pouvez et ne pouvez pas contrôle en termes de flux de données et d'environnement d'exécution (même si je sais que c'est parfois plus facile à dire qu'à déterminer). Bonne chance.

1
répondu Dov Wasserman 2008-12-16 03:59:32
mvn clean install -Dfile.encoding=UTF-8 -Dmaven.repo.local=/path-to-m2
La commande

a fonctionné avec exec-maven-plugin pour résoudre l'erreur suivante tout en configurant 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
répondu prabushi samarakoon 2018-03-06 08:28:28

nous avons mis là deux propriétés du système ensemble et il fait le système tout prendre dans utf8

file.encoding=UTF8
client.encoding.override=UTF-8
0
répondu lizi 2012-01-19 19:23:40

suite au commentaire de @Caspar sur la réponse acceptée, la meilleure façon de corriger cela selon Sun est:

" changez la localisation de la plate-forme sous-jacente avant de lancer votre programme Java."

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

Pour docker voir:

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

0
répondu Luis Muñoz 2017-10-05 15:40:32

récemment, je suis tombé sur le système Notes 6.5 d'une compagnie locale et j'ai découvert que le webmail afficherait des caractères non identifiables sur une installation Windows localisée non-Zhongwen. Ont creusé pendant plusieurs semaines en ligne, compris Il ya quelques minutes:

dans les propriétés Java, ajouter 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
répondu midmaestro 2017-10-14 17:14:47

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

en haricot magique, allez à Configuration > Software,"propriétés de L'environnement". Ajouter (nom) JAVA_TOOL_OPTIONS avec (valeur) -Dfile.encoding=UTF8

après sauvegarde, l'environnement redémarre avec L'encodage UTF-8.

0
répondu Berend Menninga 2018-04-24 08:59:03