Dont l'encodage n'Processus.getInputStream() utiliser?
Dans un programme Java, je frayer un nouveau Process
via ProcessBuilder
.
args[0] = directory.getAbsolutePath() + File.separator + program;
ProcessBuilder pb = new ProcessBuilder(args);
pb.directory(directory);
final Process process = pb.start();
Puis, j'ai lu le processus de sortie standard avec un nouveau Thread
new Thread() {
public void run() {
BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
String line = "";
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}.start();
Toutefois, lorsque le processus de sorties de caractères non-ASCII (comme 'é'
), le line
a du caractère '\uFFFD'
à la place.
Qu'est-ce que l'encodage dans le InputStream
retourné par getInputStream
(ma plateforme Windows en Europe)?
Comment puis-je changer les choses pour que line
contient les données attendues (c'est à dire '\u00E9'
pour 'é'
)?
Edit: j'ai essayé new InputStreamReader(...,"UTF-8")
:
é
devient \uFFFD
- BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
- s'il vous plaît écrire une réponse plutôt qu'un commentaire, si vous voulez répondre
Vous devez vous connecter pour publier un commentaire.
Que je comprends, un système d'exploitation, les flux sont des octets de flux, il n'y a pas de caractères ici. Le
InputStreamReader
constructeur utilise jvm jeu de caractères par défautjava.nio.charset.Charset#defaultCharset()
, vous pouvez utiliser un autre constructeur de spécifier un jeu de caractères.new InputStreamReader(...,"ISO-8859-1")
Un InputStream est un flux binaire, donc il n'y a pas de codage. Lorsque vous créez le Lecteur, vous devez savoir ce codage des caractères à utiliser, et cela dépendra de ce que le programme que vous avez appelé produit (Java ne sera pas le convertir en quelque sorte).
Si vous ne spécifiez rien pour InputStreamReader, il va utiliser la plate-forme de codage par défaut, ce qui peut ne pas être approprié. Il est un autre constructeur qui vous permet de spécifier l'encodage.
Si vous savez ce que le codage à utiliser (et vous avez vraiment à le savoir):
getInputStream()
retours)Fait intéressant à noter, lors de l'exécution sur Windows:
Puis CP437 page de code fonctionne très bien pour
CP437
était le seul jeu de caractères nom qui a fonctionné pour moi (Windows + espagnol caractères)Selon http://www.fileformat.info/info/unicode/char/e9/index.htm '\uFFFD' est un code unicode du caractère 'é'. Cela signifie en fait que vous êtes la lecture du flux correctement. Votre problème est dans l'écriture.
Console Windows ne prend pas en charge unicode par défaut. Donc, si vous voulez tester votre code d'ouvrir le fichier et écrire votre flux de là. Mais n'oubliez pas de régler l'encodage
UTF-8
.0xE9
que je veux) quand j'ai le caractère0xFFFD
aka de REMPLACEMENT par le CARACTÈRE' fileformat.info/info/unicode/char/fffd/index.htmScientifique
Sur Windows cela fonctionne parfaitement:
Conformément au cahier des charges: il n'y a pas d'astuce pour l'exécution de codage de changement de la jvm. Nous ne peut pas assurez-vous que le codage ne change PAS lors de l'exécution et le jeu de caractères toujours correct après un tel changement.
Si vous, comme moi, de savoir dans quel encodage que vous souhaitez utiliser pour toutes les entrées/sorties, vous pouvez l'encoder dans l'API Java appels à certains (pas tous) CreateReader méthodes, dont certaines autres réponses ont souligné.
Mais ce sera dur de code dans la source, ce qui pourrait ou ne pourrait pas, être ok.
J'ai trouvé une meilleure façon après la lecture de cette réponse qui révèle que vous pouvez définir l'encodage avant de la machine démarre jusqu'à ce que vous avez besoin.
J'ai mis ça comme commentaire, mais je vois qu'il y avait une réponse ,alors il pourrait être redondant maintenant 🙂
utilisation commons-lang fichier jar dans cette utilisation, -
StringEscapeUtils.escapeHtml