[JAVA] MalformedInputException qui se produit également lors de l'écriture

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?

Recommended Posts

MalformedInputException qui se produit également lors de l'écriture
Éviter l'autorisation refusée lors du développement de Laravel avec Docker