Удалить "пустой" символ из String
Я использую фреймворк, который время от времени возвращает неверные строки с "пустыми" символами.
"foobar" , например, представлен:
[, Е, о, о, Ь, а, г]
Первый символ НЕ является пробелом (''), поэтому System.out.printlin() вернет "foobar" , а не "foobar" . Тем не менее длина строки равна 7 вместо 6. Очевидно, это делает большинство методов String (равно, split, substring,..) бесполезным. Есть ли способ удалить пустые символы из строки?
Я попытался построить новую строку следующим образом:
StringBuilder sb = new StringBuilder();
for (final char character : malformedString.toCharArray()) {
if (Character.isDefined(character)) {
sb.append(character);
}
}
sb.toString();
К сожалению, это не сработает. То же самое со следующим кодом:
StringBuilder sb = new StringBuilder();
for (final Character character : malformedString.toCharArray()) {
if (character != null) {
sb.append(character);
}
}
sb.toString();
Я также не могу проверить пустой символ следующим образом:
if (character == ''){
//
}
Очевидно, что что-то не так с String.. но я не могу изменить используемую инфраструктуру или ждать их исправления (если это ошибка в их рамках). Мне нужно обработать эту String и санатировать ее.
Любые идеи?
Ответы
Ответ 1
Возможно, это символ NULL, который представлен \0
. Вы можете избавиться от него String#trim()
.
Чтобы определить нужный код, выполните следующие действия:
for (char c : string.toCharArray()) {
System.out.printf("U+%04x ", (int) c);
}
Затем вы можете найти точный символ здесь.
Обновление: в соответствии с обновлением:
Кто-нибудь знает, как просто включить диапазон допустимых символов вместо исключения 95% диапазона UTF8?
Вы можете сделать это с помощью регулярного выражения. См. Ответ @polygenelubricants здесь и этот ответ.
С другой стороны, вы можете просто исправить проблему в своем корне, а не обманывать ее. Либо обновляйте файлы, чтобы избавиться от метки спецификации, это унаследованный способ отличить файлы UTF-8 от других, которые в настоящее время бесполезны, или использовать Reader
, который распознает и пропускает спецификацию. Также см. этот вопрос.
Ответ 2
Regex был бы подходящим способом дезинформировать строку из нежелательных символов Unicode в этом случае.
String sanitized = dirty.replaceAll("[\uFEFF-\uFFFF]", "");
Это заменит все char
в диапазоне \uFEFF-\uFFFF
пустой строкой.
Конструкция [...]
называется символьным классом, например. [aeiou]
соответствует одному из любых нижних строчных гласных, [^aeiou]
соответствует чему-либо, кроме.
Вы можете сделать один из этих двух подходов:
-
replaceAll("[
<суб > blacklist
суб > ]", "")
-
replaceAll("[^
<суб > whitelist
суб > ]", "")
Ссылки
Ответ 3
Спасибо, Йоханнес Рёссел. Фактически это было "\ uFEFF"
Работает следующий код:
final StringBuilder sb = new StringBuilder();
for (final char character : body.toCharArray()) {
if (character != '\uFEFF') {
sb.append(character);
}
}
final String sanitzedString = sb.toString();
Кто-нибудь знает, как просто включить диапазон допустимых символов вместо исключения 95% диапазона UTF8?
Ответ 4
Очень простой способ удалить спецификацию UTF-8 из строки, используя подстроку, как предложил Денис Тульский. Нет необходимости в петле. Просто проверяет первый символ для метки и пропускает его, если необходимо.
public static String removeUTF8BOM(String s) {
if (s.startsWith("\uFEFF")) {
s = s.substring(1);
}
return s;
}
Мне нужно было добавить это в мой код при использовании Apache HTTPClient EntityUtil для чтения с веб-сервера. Веб-сервер не отправлял пустую метку, но ее втягивали, читая входной поток. Оригинальную статью можно найти здесь.
Ответ 5
обрезка влево или вправо удаляет пробелы. у него есть двоеточие перед пространством?
еще больше:
a = (длинная) строка [0]; покажет u код char, и вы можете использовать replace() или подстроку.
Ответ 6
Это то, что сработало для меня: -
StringBuilder sb = new StringBuilder();
for (char character : myString.toCharArray()) {
int i = (int) character;
if (i > 0 && i <= 256) {
sb.append(character);
}
}
return sb.toString();
Значение int моих NULL символов находилось в области 8103 или что-то в этом роде.
Ответ 7
Просто malformedString.trim() решит проблему.
Ответ 8
for (int i = 0; i < s.length(); i++)
if (s.charAt(i) == ' ') {
your code....
}
Ответ 9
Вы можете проверить пробелы следующим образом:
if (character.equals(' ')){ // }