Недопустимый символ - CTRL- CHAR
Я получаю следующие исключения из webservices:
com.ctc.wstx.exc.WstxUnexpectedCharException: Недопустимый символ ((CTRL- CHAR, код 15))
Я знаю причину этого, я получаю "контрольные символы" в данных, которые я хочу вернуть.
И в xml CTRL- CHAR не разрешены.
Я искал решение, и во многих местах я нашел код для удаления CTRL-CHAR
.
Забота о том, должен ли я потерять данные, если я удалю контрольные символы из данных?
Я хочу, чтобы чистое решение могло кодировать. Вместо удаления управления char.
Ответы
Ответ 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]", "")