【发布时间】:2021-01-18 15:11:16
【问题描述】:
我有一个包含德语变音符号的 ISO-8859-1 文件,我需要使用 JAXB 对其进行解组。但在我需要 UTF-8 格式的内容之前。
@Override
public List<Usage> convert(InputStream input) {
try {
InputStream inputWithNamespace = addNamespaceIfMissing(input);
inputWithNamespace = convertFileToUtf(inputWithNamespace);
ORDR order = xmlUnmarshaller.unmarshall(inputWithNamespace, ORDR.class);
...
我将“文件”作为 InputStream 获取。我的想法是以 UTF-8 格式读取文件的内容并制作另一个 InputStream 来使用。这是我尝试过的:
private InputStream convertFileToUtf(InputStream inputStream) throws IOException {
byte[] bytesInIso = ByteStreams.toByteArray(inputStream);
String stringIso = new String(bytesInIso);
byte[] bytesInUtf = new String(bytesInIso, ISO_8859_1).getBytes(UTF_8);
String stringUtf = new String(bytesInUtf);
return new ByteArrayInputStream(bytesInUtf);
}
我有这 2 个字符串来检查内容,但即使只是读取 ISO 文件,它也会在变音符号 (?) 的位置给出问号,并将其转换为 UTF_8 会给出奇怪的字符,例如 1/2 等等。
更新
byte[] bytesInIso = ByteStreams.toByteArray(inputWithNamespace);
String contentInIso = new String(bytesInIso);
byte[] bytesInUtf = new String(bytesInIso, ISO_8859_1).getBytes(UTF_8);
String contentInUtf = new String(bytesInUtf);
验证 contentInIso 会打印问号而不是变音符号,并且通过检查 contentInIso 而不是变音符号,它会显示像“�”这样的字符。
@Override
public List<Usage> convert(InputStream input) {
try {
InputStream inputWithNamespace = addNamespaceIfMissing(input);
byte[] bytesInIso = ByteStreams.toByteArray(inputWithNamespace);
String contentInIso = new String(bytesInIso);
byte[] bytesInUtf = new String(bytesInIso, ISO_8859_1).getBytes(UTF_8);
String contentInUtf = new String(bytesInUtf);
ORDR order = xmlUnmarshaller.unmarshall(inputWithNamespace, ORDR.class);
这个方法转换它被另一个叫做processUsageFile的方法调用:
private void processUsageFile(File usageFile) {
try (FileInputStream fileInputStream = new FileInputStream(usageFile)) {
usageImporterService.importUsages(usageFile.getName(), fileInputStream, getUsageTypeValidated(usageFile.getName()));
log.info("Usage file {} imported successfully. Moving to archive directory", usageFile.getName());
如果我在 UPDATE 语句下编写的代码并在尝试后立即放入,第一个 contentInIso 有问号,但 contentInUtf 有变音符号。然后,通过进入转换,jabx 抛出一个异常,该文件有一个过早的行尾。
【问题讨论】:
-
JAXB 也可以从 Reader 解组,所以你不需要从 ISO-8859-1 转换为 UTF-8,只需构造一个 Reader 将 ISO-8859-1 字节转换为字符(例如
new InputStreamReader(inputStream, StandardCharsets.ISO_8859_1),然后将该Reader 传递给Unmarshaller.unmarshal(Reader)而不是Unmarshaller.unmarshal(InputStream)。 -
我不能这样做,因为我的解组看起来像这样:
JAXBElement<T> root = jaxbUnmarshaller.unmarshal(new StreamSource(input), tClass);所以使用阅读器意味着更改一些我不想更改的代码和测试。我找到了另一种方法:然后遇到了另一个问题。你可以看到更新。
标签: java