Я должен обработать этот сценарий в Java:
Я получаю запрос в форме XML от клиента с заявленным encoding=utf-8. К сожалению, это может содержать не utf-8 символы и существует требование для удаления этих символов из xml на моей стороне (наследие).
Давайте рассмотрим пример, где этот недопустимый XML содержит £ (фунт).
1) Я получаю xml как Строку Java с £ в нем (у меня нет доступа для взаимодействия через интерфейс прямо сейчас, но я, вероятно, получаю xml как Строку Java). Я могу использовать replaceAll (£, "") для избавлений от этого символа? Какие-либо потенциальные проблемы?
2) Я получаю xml как массив байтов - как обработать эту операцию безопасно в этом случае?
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);
...
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]", "");
// ...
}
// ...