Le programme Java que j'ai écrit a généré l'erreur suivante.
Caused by: java.nio.charset.MalformedInputException: Input length = 1
at java.base/java.nio.charset.CoderResult.throwException(CoderResult.java:274)
at java.base/sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:306)
at java.base/sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:281)
at java.base/sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125)
at java.base/java.io.OutputStreamWriter.write(OutputStreamWriter.java:211)
at java.base/java.io.BufferedWriter.flushBuffer(BufferedWriter.java:120)
at java.base/java.io.BufferedWriter.flush(BufferedWriter.java:256)
(Ci-après, la partie trace de pile du code d'application est omise)
Il est facile de voir qu'il s'agit d'un problème d'encodage de caractères, mais je ne peux pas penser à une raison lorsque je regarde la partie pertinente du code d'application ci-dessous.
File file = ...;
try (BufferedWriter writer = java.nio.file.Files.newBufferedWriter(file, StandardCharsets.UTF_8)) {
String s = ...;
writer.write(s);
writer.flush(); //J'obtiens une erreur ici, donc le dernier argument d'écriture est suspect...
}
Dans de tels cas, il est habituel de vider le s dans la chaîne et d'examiner le contenu du s.
System.err.println("[" + s + "]");
Ensuite, il a été affiché comme suit. Qu'est-ce que c'est ?, Est-ce déformé?
En premier lieu, est-ce que System.err # println
ne donne aucune erreur?
[?]
C'était un détour que je n'ai pas immédiatement remarqué Surrogate Pair.
Quand j'ai recherché chaque caractère de s avec le code suivant, j'ai obtenu High.
. C'est la cause de la première erreur.
for (char c : s.toCharArray()) {
if (Character.isHighSurrogate(c)) {
System.err.println("High.");
}
if (Character.isLowSurrogate(c)) {
System.err.println("Low.");
}
}
À partir de 2020, la programmation Java qui considère correctement les paires de substitution est-elle une pratique courante?