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

Недопустимый символ - CTRL- CHAR

Я получаю следующие исключения из webservices:

com.ctc.wstx.exc.WstxUnexpectedCharException: Недопустимый символ ((CTRL- CHAR, код 15))

Я знаю причину этого, я получаю "контрольные символы" в данных, которые я хочу вернуть. И в xml CTRL- CHAR не разрешены.

Я искал решение, и во многих местах я нашел код для удаления CTRL-CHAR.

Забота о том, должен ли я потерять данные, если я удалю контрольные символы из данных? Я хочу, чтобы чистое решение могло кодировать. Вместо удаления управления char.

4b9b3361

Ответ 1

Спасибо, ребята, за вас. Я использую решение, которое может быть полезным для других. Требование состояло в том, чтобы не уничтожить CONTROL CHAR, он должен оставаться таким же, как и в БД, и один WS отправляет его через n/w клиент должен иметь возможность получить CONTROL CHAR. Поэтому я внедрил следующий код:

  • Кодировать строки с использованием URLEncoder в коде Web-Service.
  • На стороне клиента декодирует его с помощью URLDecoder

Обмен примером кода и выходом ниже.
Пример кода:

System.out.println("NewSfn");  
System.out.println(URLEncoder.encode("NewSfn", "UTF-8"));  
System.out.println(URLDecoder.decode("NewSfn", "UTF-8"));  

Выход:

NewSfn  
New%0FSfn  
NewSfn 

Таким образом, клиент получит CHAR. CONTROL.

EDIT: Stack Exchange не показывает CONTROL CHAR выше. NewSfn выглядит так: New(CONTROL CHAR)Sfn.

Ответ 2

Я бы сделал то, что предлагает OrangeDog. Но если вы хотите решить это в своем коде, попробуйте:

replaceAll("[\\x00-\\x09\\x11\\x12\\x14-\\x1F\\x7F]", "")

\\x12 это символ.

Ответ 3

Эта ошибка генерируется парсером XML Woodstox. Исходный код класса InputBootstrapper выглядит следующим образом:

protected void reportUnexpectedChar(int i, String msg)
    throws WstxException
{
    char c = (char) i;
    String excMsg;

    // WTF? JDK thinks null char is just fine as?!
    if (Character.isISOControl(c)) {
        excMsg = "Unexpected character (CTRL-CHAR, code "+i+")"+msg;
    } else {
        excMsg = "Unexpected character '"+c+"' (code "+i+")"+msg;
    }
    Location loc = getLocation();
    throw new WstxUnexpectedCharException(excMsg, loc, c);
}

Забавный комментарий в сторону, Woodstox выполняет некоторую дополнительную проверку поверх анализатора JDK и отклоняет символ ASCII 15 как недействительный.

Что касается этого персонажа, мы не можем сказать вам, что это в ваших данных. Точно так же мы не можем сказать вам, удалит ли этот символ что-нибудь, потому что снова это ваши данные. Вы можете установить это только для себя.

Ответ 4

Если у вас есть контрольные символы в ваших текстовых данных, вам необходимо решить эту проблему в своем источнике.

Наиболее вероятными причинами являются неправильные кодировки обмена сообщениями (обычно между базой данных и приложением) или не дезинфицирующие пользовательский ввод.

Ответ 5

Я обнаружил ту же проблему, когда передавал нулевые значения для некоторых параметров. Я передал значения пустых или гаечных ключей, и эта ошибка исчезла.

Ответ 6

Я немного смущен @ssedano anwser, мне кажется, он пытается найти все контрольные символы из таблицы ASCII 0x00 до 0x1F, за исключением 0x0A (новая строка) и 0x0D (возврат каретки) плюс 0x7F (del), а затем не будет, регулярное выражение

replaceAll("[\\x00-\\x09\\x0B\\x0C\\x0E-\\x1F\\x7F]", "")