从 xml 中删除非 UTF-8 字符,并声明编码 =utf-8 - Java

2022-09-02 02:18:54

我必须在Java中处理这种情况:

我从声明编码=utf-8的客户端收到XML格式的请求。不幸的是,它可能不包含utf-8字符,并且需要从我这边的xml中删除这些字符(旧版)。

让我们考虑一个示例,其中此无效的 XML 包含 £ (磅)。

1)我得到xml作为java字符串,其中有£(我现在没有访问接口,但我可能得到xml作为java字符串)。我可以使用 replaceAll(£, “”) 来摆脱这个字符吗?是否有任何潜在问题?

2)我得到xml作为字节数组 - 在这种情况下,如何安全地处理此操作?


答案 1

1)我得到xml作为java字符串,其中有£(我现在没有访问接口,但我可能得到xml作为java字符串)。我可以使用 replaceAll(£, “”) 来摆脱这个字符吗?

我假设你宁愿说你想摆脱非ASCII字符,因为你谈论的是“遗产”的一面。您可以使用以下正则表达式删除可打印 ASCII 范围之外的任何内容:

string = string.replaceAll("[^\\x20-\\x7e]", "");

2)我得到xml作为字节数组 - 在这种情况下,如何安全地处理此操作?

您需要将 包装在 ByteArrayInputStream 中,以便可以使用 InputStreamReader 在 UTF-8 编码的字符流中读取它们,其中您指定编码,然后使用 BufferedReader 逐行读取它。byte[]

例如:

BufferedReader reader = null;
try {
    reader = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(bytes), "UTF-8"));
    for (String line; (line = reader.readLine()) != null;) {
        line = line.replaceAll("[^\\x20-\\x7e]", "");
        // ...
    }
    // ...

答案 2

UTF-8是一种编码;Unicode 是一个字符集。但是 GBP 符号绝对在 Unicode 字符集中,因此肯定可以用 UTF-8 表示。

如果您实际上是指 UTF-8,并且您实际上正在尝试删除不是 UTF-8 中字符的有效编码的字节序列,那么...

CharsetDecoder utf8Decoder = Charset.forName("UTF-8").newDecoder();
utf8Decoder.onMalformedInput(CodingErrorAction.IGNORE);
utf8Decoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
ByteBuffer bytes = ...;
CharBuffer parsed = utf8Decoder.decode(bytes);
...

推荐