【问题标题】:Convert InputStream from ISO-8859-1 to UTF-8将 InputStream 从 ISO-8859-1 转换为 UTF-8
【发布时间】: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&lt;T&gt; root = jaxbUnmarshaller.unmarshal(new StreamSource(input), tClass); 所以使用阅读器意味着更改一些我不想更改的代码和测试。我找到了另一种方法:然后遇到了另一个问题。你可以看到更新。

标签: java


【解决方案1】:

关于你得到的行为,

String stringIso = new String(bytesInIso);

在此步骤中,您通过使用平台的默认字符集解码指定的字节数组来构造一个新字符串

由于这可能不是 ISO_8859_1,我认为您正在查看的字符串在这里变得乱码。

【讨论】:

    猜你喜欢
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 2011-09-26
    • 2014-08-29
    • 2014-04-30
    • 1970-01-01
    • 2014-07-04
    相关资源
    最近更新 更多