Я использую framwork, который возвращает уродливые Строки с "пустыми" символами время от времени.
"foobar", например, представлен: [f, o, o, b, a, r]
Первый символ НЕ является пробелом (''), таким образом, System.out.printlin () возвратил бы "foobar" и не "foobar". Все же длина Строки 7 вместо 6. Очевидно, это делает большинство Строковых методов (равняется, разделение, подстрока..) бесполезный. Существует ли способ удалить пустые символы из Строки?
Я пытался создать новую Строку как это:
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 == ''){
//
}
Очевидно, существует что-то не так со Строкой.. но я не могу изменить платформу, которую я использую или ожидаю их для фиксации его (если это - ошибка в их платформе). Я должен обработать эту Строку и санировать ее.
Какие-либо идеи?
Вероятно, это NULL-символ , который представлен как \ 0
. Вы можете избавиться от него с помощью String # trim ()
.
Чтобы определить точный код, сделайте следующее:
for (char c : string.toCharArray()) {
System.out.printf("U+%04x ", (int) c);
}
Затем вы можете найти точный символ здесь .
Обновление: согласно обновлению:
Кто-нибудь знает способ просто включить диапазон допустимых символов вместо исключения 95% диапазона UTF8?
Вы можете сделать это с помощью регулярного выражения . См. Ответ @polygenelubricants здесь и этот ответ .
С другой стороны, вы также можете просто исправить проблему в ее корне, вместо того, чтобы ее обходить. Либо обновите файлы, чтобы избавиться от метки спецификации, это старый способ отличить файлы UTF-8 от других, который в настоящее время бесполезен, либо используйте Reader
, который распознает и пропускает BOM. Также см. этот вопрос .
В этом случае регулярное выражение было бы подходящим способом очистить строку от нежелательных символов Unicode.
String sanitized = dirty.replaceAll("[\uFEFF-\uFFFF]", "");
Это заменит все char
в диапазоне \ uFEFF- \ uFFFF
пустой строкой.
Конструкция [...]
называется символьным классом , например [aeiou]
соответствует одному из гласных в нижнем регистре, [^ aeiou]
соответствует чему угодно, кроме.
Вы можете использовать один из этих двух подходов:
replaceAll ("[
черный список
]", "")
replaceAll ("[^
белый список
]", "")
Спасибо Johannes Rössel. На самом деле это было '\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?
обрезка влево или вправо удаляет пробелы. перед пробелом стоит двоеточие?
даже больше: a = (длинная) строка [0]; покажет код символа, и вы можете использовать replace () или подстроку.
Вы можете проверить наличие пробелов следующим образом:
if (character.equals(' ')){ // }