使用声明的encoding = utf-8 - Java从xml中删除非UTF-8字符

St *_*zke 17 java xml encoding utf-8

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

我从声明为encoding = utf-8的客户端获取XML格式的请求.不幸的是,它可能不包含utf-8字符,并且需要从我这边的xml中删除这些字符(遗留).

让我们考虑这个无效XML包含£(磅)的示例.

1)我得到xml作为带有£的java字符串(我现在没有访问接口,但我可能得到xml作为java字符串).我可以使用replaceAll(£,"")来摆脱这个角色吗?任何潜在的问题?

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

Bal*_*usC 26

1)我得到xml作为带有£的java字符串(我现在没有访问接口,但我可能得到xml作为java字符串).我可以使用replaceAll(£,"")来摆脱这个角色吗?

我假设你想要摆脱非ASCII字符,因为你在谈论一个"遗产"方面.您可以使用以下正则表达式删除可打印ASCII范围之外的任何内容:

string = string.replaceAll("[^\\x20-\\x7e]", "");
Run Code Online (Sandbox Code Playgroud)

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

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

例如

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]", "");
        // ...
    }
    // ...
Run Code Online (Sandbox Code Playgroud)


Sea*_*wen 18

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);
...
Run Code Online (Sandbox Code Playgroud)


小智 7

"test text".replaceAll("[^\\u0000-\\uFFFF]", "");
Run Code Online (Sandbox Code Playgroud)

此代码从string中删除所有4字节的utf8字符.在执行Mysql innodb varchar条目时,这可能需要用于某些目的