Подтвердить что ты не робот

Удалить "пустой" символ из 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 и санатировать ее.

Любые идеи?

4b9b3361

Ответ 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(' ')){ // }