Используйте java для сценариев, чтобы обнаружить проблемную строку.
AtomicInteger lineno = new AtomicInteger();
Path path = Paths.get("... .xml");
Files.lines(path, StandardCharsets.ISO_8859_1)
.forEach(line -> {
int no = lineno.incrementAndGet();
byte[] b = line.getBytes(StandardCharsets.ISO_8859_1);
try {
new String(b, StandardCharsets.UTF_8);
} catch (Exception e) {
System.out.printf("[%d] %s%n%s%n", no, line, e.getMessage());
//throw new IllegalStateException(e);
}
});
Можно предположить, что это ошибка данных.
В общем случае это может быть также ошибочное, буферизованное чтение: когдамногобайтовая последовательность нарушена на границе буфера;тогда могут возникнуть две неправильные полупоследовательности.В отличие от стандартного библиотечного кода.
Чтобы код new String(...)
не сбрасывался JVM, возможно:
int sowhat = Files.lines(path, StandardCharsets.ISO_8859_1)
.mapToInt(line -> {
int no = lineno.incrementAndGet();
byte[] b = line.getBytes(StandardCharsets.ISO_8859_1);
try {
return new String(b, StandardCharsets.UTF_8).length();
} catch (Exception e) {
System.out.printf("[%d] %s%n%s%n", no, line, e.getMessage());
throw new IllegalStateException(e); // Must throw or return int
}
}).sum();
System.out.println("Ignore this: " + sowhat);
Можно предположить, что это ошибка данных.
В общем случае это может быть также ошибочное чтение с буферизацией: когда многобайтовая последовательность прерывается на границе буфера;тогда могут возникнуть две неправильные полупоследовательности.В отличие от стандартного кода библиотеки.
Чтобы код new String(...)
не сбрасывался JVM, возможно:
int sowhat = Files.lines(path, StandardCharsets.ISO_8859_1)
.mapToInt(line -> {
int no = lineno.incrementAndGet();
byte[] b = line.getBytes(StandardCharsets.ISO_8859_1);
try {
return new String(b, StandardCharsets.UTF_8).length();
} catch (Exception e) {
System.out.printf("[%d] %s%n%s%n", no, line, e.getMessage());
throw new IllegalStateException(e); // Must throw or return int
}
}).sum();
Недопустимые символы XML (в версии 1.0)? [# x1- # x8] |[# xB- # xC] |[# xE- # x1F] |[# x7F- # x84] |[# x86- # x9F]
int sowhat = Files.lines(path, StandardCharsets.ISO_8859_1)
.mapToInt(line -> {
int no = lineno.incrementAndGet();
byte[] b = line.getBytes(StandardCharsets.ISO_8859_1);
if (!legal(b)) {
System.out.printf("[%d] %s%n%s%n", no, line, e.getMessage());
throw new IllegalStateException(e); // Must throw or return int
}
}).sum();
static boolean legal(byte[] bytes) {
String s = new String(bytes, StandardCharsets.UTF_8);
for (char ch : s.toCharArray()) {
int x = ch;
if ((0 <= x && x <= 8) // ASCII control chars
|| (0xB <= x && x <= 0xC)
|| (0xE <= x && x <= 0x1F)
|| (0x7f <= x && x <= 0x84) // DEL + Unicode control chars
|| (0x86 <= x && x <= 0x9F)) {
return false;
}
}
return true;
}
Если это не сработает, я задержу вас достаточно долго.Разбейте файл и подтвердите детали.