java - unicode转str - 中文编码




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

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

我假设你宁愿意味着你想摆脱非ASCII字符,因为你在谈论一个“传统”的一面。 你可以使用下面的正则表达式去掉可打印的ASCII范围之外的任何东西:

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

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

您需要将byte[]包装在ByteArrayInputStream ,以便您可以使用InputStreamReader以UTF-8编码的字符流读取它们,其中您指定编码,然后使用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]", "");
        // ...
    }
    // ...

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

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

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

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

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


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);
...

"test text".replaceAll("[^\\u0000-\\uFFFF]", "");

此代码从字符串中删除所有4字节的utf8字符。在进行Mysql innodb varchar条目时,这可能是需要的


请注意,第一步应该是要求XML的创建者(最有可能是本地生成的“仅打印数据”XML生成器)在发送给您之前确保其XML正确无误。 如果他们使用Windows,最简单的测试就是让他们在Internet Explorer中查看它,并在第一个违规字符处看到解析错误。

虽然他们解决了这个问题,但是你可以简单地编写一个小程序来改变头部声明,而不是编码为ISO-8859-1:

<?xml version="1.0" encoding="iso-8859-1" ?>

并保持其余不变。







utf-8