Codage de caractères par défaut pour la sortie de la console java
Comment Java déterminer le codage utilisé pour System.out
?
Compte tenu de la classe suivante:
import java.io.File;
import java.io.PrintWriter;
public class Foo
{
public static void main(String[] args) throws Exception
{
String s = "xxäñxx";
System.out.println(s);
PrintWriter out = new PrintWriter(new File("test.txt"), "UTF-8");
out.println(s);
out.close();
}
}
Il est enregistré en UTF-8 et compilé avec javac -encoding UTF-8 Foo.java
sur un système Windows.
Ensuite sur un git-bash console (en utilisant UTF-8 charset) je fais:
$ java Foo
xxõ±xx
$ java -Dfile.encoding=UTF-8 Foo
xxäñxx
$ cat test.txt
xxäñxx
$ java Foo | cat
xxäñxx
$ java -Dfile.encoding=UTF-8 Foo | cat
xxäñxx
Ce qui se passe ici?
Évidemment java vérifie si il est connecté à un terminal et est en train de changer son encodage dans ce cas. Est-il un moyen de forcer Java pour simplement la sortie de la plaine de l'UTF-8?
J'ai essayé la même chose avec la console cmd, trop. Rediriger STDOUT ne semble pas faire toute la différence. Sans le fichier.le paramètre d'encodage, il renvoie le codage ansi avec le paramètre sorties de l'encodage utf8.
System.out
code octets à l'aide de la encodage par défaut. Parfois, c'est même l'encodage utilisé par la console.- Mais pourquoi ne
java Foo
sortie de quelque chose de différent quejava Foo|cat
? - Le codage par défaut devrait être le même. - avez-vous assurer que vous avez réellement enregistré le fichier en utilisant l'encodage utf-8? c'est généralement une mauvaise idée de dépendre sur la source du fichier encodages. pour être vraiment sûr, définir la chaîne à l'aide de
"\u"
échappe.
Vous devez vous connecter pour publier un commentaire.
Je suis en supposant que votre console fonctionne toujours sous cmd.exe. Je doute que votre console est vraiment attend UTF-8 - j'espère que c'est vraiment un OEM DOS d'encodage (par exemple,850 ou 437.)
Java va encoder les octets à l'aide de la encodage par défaut défini lors de la JVM de l'initialisation.
Reproduire sur mon PC:
Java code pour windows-1252; console décode comme IBM850. Résultat: Mojibake
Java encode en UTF-8; console décode comme IBM850. Résultat: Mojibake
chat décode le fichier en UTF-8; chat encode IBM850; console décode comme IBM850.
Java code pour windows-1252; chat décode comme windows-1252; chat encode IBM850; console décode comme IBM850
Java encode en UTF-8; chat décode en UTF-8; chat encode IBM850; console décode comme IBM850
Cette mise en œuvre de chat doit utiliser la méthode heuristique pour déterminer si les données de caractère UTF-8 ou pas, puis convertit les données en UTF-8 ou ANSI (par exemple, windows-1252) à la console de codage (par exemple, IBM850.)
Cela peut être confirmé avec les commandes suivantes:
La chat commande peut prendre cette décision parce que
e4 f1
n'est pas UTF-8 valide séquence.Vous pouvez corriger la sortie Java par:
HexDump est une simple application Java:
cat
simplement des copies d'octets qu'ils sont. Évidemment, en effet, elle tente de "réparer" l'encodage lors de l'écriture d'un terminal. J'étais pas au courant que git-bash utilise en effet le IBM850 cmd terminal. Cette réponse a été vraiment utile.