Удалить "пустой" символ из строки - PullRequest
12 голосов
/ 03 августа 2010

Я использую фреймворк, который время от времени возвращает некорректные строки с «пустыми» символами.

"foobar", например, представлен как: [, Е, о, о, Ь, а, г]

Первый символ НЕ является пробелом (''), поэтому System.out.printlin () будет возвращать "foobar", а не "foobar". Тем не менее, длина строки равна 7 вместо 6. Очевидно, что это делает большинство методов String (equals, 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 что-то не так ... но я не могу изменить используемый фреймворк или ждать, пока они его исправят (если это баг в их рамках). Мне нужно обработать эту строку и продезинфицировать ее.

Есть идеи?

Ответы [ 9 ]

16 голосов
/ 03 августа 2010

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

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

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

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


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

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

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

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

13 голосов
/ 03 августа 2010

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

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

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

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

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

  • replaceAll("[blacklist]", "")
  • replaceAll("[^whitelist]", "")

Ссылки

4 голосов
/ 24 сентября 2013

Очень простой способ удалить спецификацию UTF-8 из строки, используя подстроку, как предложил Денис Тульский.Нет необходимости в цикле.Просто проверяет первый символ на отметку и пропускает его при необходимости.

public static String removeUTF8BOM(String s) {
    if (s.startsWith("\uFEFF")) {
        s = s.substring(1);
    }
    return s;
}

Мне нужно было добавить это в мой код при использовании Apache HTTPClient EntityUtil для чтения с веб-сервера.Веб-сервер не отправлял пустую метку, но он тянулся во время чтения потока ввода.Оригинальную статью можно найти здесь .

2 голосов
/ 03 августа 2010

Спасибо, Йоханнес Рессел. На самом деле это был \ 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?

1 голос
/ 03 августа 2010

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

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

0 голосов
/ 22 января 2018

Просто malformedString.trim () решит проблему.

0 голосов
/ 25 апреля 2017

Вот что у меня сработало: -

    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 или около того.

0 голосов
/ 01 мая 2013
for (int i = 0; i < s.length(); i++)
    if (s.charAt(i) == ' ') {
        your code....
    }
0 голосов
/ 03 августа 2010

Вы можете проверить пробелы, как это:

if (character.equals(' ')){ // }
...