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());
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.
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
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!
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.
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.
essayez ceci:
new OutputStreamWriter( new FileOutputStream("Your_file_fullpath" ),Charset.forName("UTF8"))
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.
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!
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.
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)
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
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:
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.
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.