Удалите “пустой” символ из Строки

Я использую 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 == ''){
     //
   }

Очевидно, существует что-то не так со Строкой.. но я не могу изменить платформу, которую я использую или ожидаю их для фиксации его (если это - ошибка в их платформе). Я должен обработать эту Строку и санировать ее.

Какие-либо идеи?

12
задан black666 3 August 2010 в 12:41
поделиться

5 ответов

Вероятно, это NULL-символ , который представлен как \ 0 . Вы можете избавиться от него с помощью String # trim () .

Чтобы определить точный код, сделайте следующее:

for (char c : string.toCharArray()) {
    System.out.printf("U+%04x ", (int) c);
}

Затем вы можете найти точный символ здесь .


Обновление: согласно обновлению:

Кто-нибудь знает способ просто включить диапазон допустимых символов вместо исключения 95% диапазона UTF8?

Вы можете сделать это с помощью регулярного выражения . См. Ответ @polygenelubricants здесь и этот ответ .

С другой стороны, вы также можете просто исправить проблему в ее корне, вместо того, чтобы ее обходить. Либо обновите файлы, чтобы избавиться от метки спецификации, это старый способ отличить файлы UTF-8 от других, который в настоящее время бесполезен, либо используйте Reader , который распознает и пропускает BOM. Также см. этот вопрос .

16
ответ дан 2 December 2019 в 04:32
поделиться

В этом случае регулярное выражение было бы подходящим способом очистить строку от нежелательных символов Unicode.

String sanitized = dirty.replaceAll("[\uFEFF-\uFFFF]", ""); 

Это заменит все char в диапазоне \ uFEFF- \ uFFFF пустой строкой.

Конструкция [...] называется символьным классом , например [aeiou] соответствует одному из гласных в нижнем регистре, [^ aeiou] соответствует чему угодно, кроме.

Вы можете использовать один из этих двух подходов:

  • replaceAll ("[ черный список ]", "")
  • replaceAll ("[^ белый список ]", "")

Ссылки

14
ответ дан 2 December 2019 в 04:32
поделиться

Спасибо 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?

2
ответ дан 2 December 2019 в 04:32
поделиться

обрезка влево или вправо удаляет пробелы. перед пробелом стоит двоеточие?

даже больше: a = (длинная) строка [0]; покажет код символа, и вы можете использовать replace () или подстроку.

1
ответ дан 2 December 2019 в 04:32
поделиться

Вы можете проверить наличие пробелов следующим образом:

if (character.equals(' ')){ // }
-3
ответ дан 2 December 2019 в 04:32
поделиться
Другие вопросы по тегам:

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