удалите non-UTF-8 символы из xml с заявленным encoding=utf-8 - Java

Я должен обработать этот сценарий в Java:

Я получаю запрос в форме XML от клиента с заявленным encoding=utf-8. К сожалению, это может содержать не utf-8 символы и существует требование для удаления этих символов из xml на моей стороне (наследие).

Давайте рассмотрим пример, где этот недопустимый XML содержит £ (фунт).

1) Я получаю xml как Строку Java с £ в нем (у меня нет доступа для взаимодействия через интерфейс прямо сейчас, но я, вероятно, получаю xml как Строку Java). Я могу использовать replaceAll (£, "") для избавлений от этого символа? Какие-либо потенциальные проблемы?

2) Я получаю xml как массив байтов - как обработать эту операцию безопасно в этом случае?

17
задан St Nietzke 19 May 2010 в 20:19
поделиться

2 ответа

UTF-8 - это кодировка; Юникод - это набор символов. Но символ 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);
...
18
ответ дан 30 November 2019 в 10:22
поделиться

1) Я получаю xml как java String с £ в нем (у меня нет доступа к интерфейсу прямо сейчас, но я, вероятно, получаю xml как java String). Могу ли я использовать replaceAll(£, ""), чтобы избавиться от этого символа?

Я предполагаю, что вы скорее имеете в виду, что вы хотите избавиться от неASCII символов, потому что вы говорите о "унаследованной" стороне. Вы можете избавиться от всего, что находится за пределами печатаемого диапазона ASCII, используя следующий regex:

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

2) Я получаю xml как массив байтов - как безопасно обработать эту операцию в таком случае?

Вам нужно обернуть byte[] в ByteArrayInputStream, чтобы вы могли прочитать их в потоке символов в кодировке UTF-8, используя InputStreamReader где вы указываете кодировку, а затем используете BufferedReader для чтения построчно.

E.g.

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]", "");
        // ...
    }
    // ...
26
ответ дан 30 November 2019 в 10:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: