Как заставить Java игнорировать escape-последовательности в String? - PullRequest
1 голос
/ 22 сентября 2011

Я пишу код Java для чтения объектов Blob из таблицы базы данных Oracle.

Мне нужно извлечь объекты BLOB и сохранить их в String для дальнейшей обработки.Я преобразую содержимое объектов BLOB в строку следующим образом:

java.sql.Blob blob = rs.getBlob(i);
columnValue = new String(blob.getBytes(1l, (int) blob.length()));

Однако, когда я пытаюсь проанализировать результирующую строку, я получаю ошибки, которые говорят "Недопустимая escape-последовательность" , потому чтоданные BLOB-объектов состоят из таких данных, как \ x, \ i или что-то еще!

Есть ли способ заставить Java игнорировать эти escape-последовательности и сделать это простосчитать строку с ее содержимым такой, какая она есть (т.е. строки, содержащие \ x, \ i и т. д.)?

Ответы [ 2 ]

3 голосов
/ 22 сентября 2011

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

В любом случае, StringEscapeUtils.escapeJava(..) должен делать то, что вы хотите (это от commons-lang)

Кроме этого - вы должны использовать java.sql.Clob для текстовых данных.

2 голосов
/ 22 сентября 2011

Проблема не имеет ничего общего с escape-последовательностями "\ x". (Эти escape-последовательности имеют значение только в строковых литералах - они не имеют ничего общего с . * Escape-последовательности, найденные в регулярных выражениях, являются просто интерпретацией строки.)

Проблема в том, что BLOB-объект содержит данные, которые недопустимы для данной кодировки. Из new String(byte[]) документации:

Поведение этого конструктора, когда указанные байты недопустимы в кодировке по умолчанию, не определено. Класс CharsetDecoder следует использовать, когда требуется больший контроль над процессом декодирования.

Также обратите внимание, что new String(byte[]) не следует использовать , потому что (также из документации):

Создает новую строку путем декодирования указанного массива байтов с использованием кодировки по умолчанию платформы.

Я подозреваю, что либо

  1. Используемые данные BLOB-объектов недействительны и / или;
  2. "кодировка по умолчанию" не соответствует кодировке предоставленных байтов

Счастливое кодирование

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...