Как обнаружить символы Unicode в строке Java для разрешения исключения синтаксического анализатора - PullRequest
1 голос
/ 28 мая 2010

Предположим, у меня есть строка, содержащая '¿'. Как бы я нашел все эти символы Unicode? Должен ли я проверить их код? Как бы я это сделал?

Я хочу обнаружить его, чтобы избежать исключения синтаксического анализатора саксофона, которое я получаю при анализе xml сохранено как база данных в базе данных Oracle 10g.

Исключение javax.servlet.ServletException: org.xml.sax.SAXParseException: неверный байт 1 из 1-байтовой последовательности UTF-8.

Ответы [ 2 ]

0 голосов
/ 28 мая 2010

Вы можете избавиться от этого исключения, либо добавив пролог с указанием кодировки, либо преобразовав свой XML в UTF-8 в CLOB.

0 голосов
/ 28 мая 2010

Это слишком долго для комментария, поэтому я делаю его ответом, хотя это не ответ ...

Сначала вы запутались в том, что означает "Unicode". ASCII является подмножеством Unicode, например. Каждый действительный символ ASCII является допустимым символом Unicode.

Тогда вы, вероятно, озадачены различием между кодом и его фактическим представлением. Например, ASCII - это чисто 7-битная кодировка: она определяет 128 «кодовых точек» (фактически, это первое коммерческое использование было для семибитного телепринтера: http://en.wikipedia.org/wiki/ASCII). Несмотря на 7-битное кодирование, ASCII обычно в настоящее время всегда кодируется на 8-битном, причем самый левый / старший бит всегда очищается.

Юникод определяет более 65536 кодовых точек. Существует несколько способов представления кодовых точек Unicode, одним из которых является UTF-8.

Одна из конкретных полезных функций UTF-8 заключается в том, что любой допустимый 8-битный текстовый файл ASCII (где каждый байт имеет очищенный крайний левый / старший бит) имеет значение всегда действительный UTF-8 / Unicode файл тоже.

Что ты после? Найти каждый символ, который не является символом ASCII?

Во всяком случае, это действительно сложно сделать правильно в Java. Поскольку Java была задумана до Unicode 3.1, когда было менее 65536 точек Unicode, примитив Java char является полностью сломанной абстракцией кодовой точки Unicode (Unicode, более 10 лет, имеет более 65536 кодовых точек ). Так появилась Java 1.5 / 5 и новые методы, связанные с «кодовой точкой»: это немного лучше, но вы все еще не можете легко «перебрать» кодовую точку: метод codepointAt (...) невероятно сбивает с толку то, что он дает кодовую точку, но работает, подсчитывая аргументы индекса в Java char (что, кстати, является ошибкой Sun / RFE, так как многие луны).

Понимание этого само по себе невероятно сложно, если вы не знакомы ни с этим чудовищным Java SNAFU, ни с ASCII / Unicode / UTF-8.

В дополнение к этому, здесь, вероятно, есть более фундаментальная проблема: файл XML, который вы анализируете, должен правильно указывать кодировку, которую он использует, и должен быть правильно закодирован. Следовательно, он должен быть правильно декодирован Java. Ваш XML-файл правильный? Вы расшифровываете его с Java, используя правильную кодировку? Здесь может помочь что-то вроде «hexdump» проблемной части вашего XML-файла.

Вот пример того, как продолжить работу с файлом с именем «problemmatic.txt» в системе Un * x (например, отлично работает в Linux и OS X):

$ file problemmatic.txt

problematic.txt: UTF-8 Unicode text

$ hexdump -C problemmatic.txt

00000000  6c c3 a9 61 20 31 32 33  0a                       |l..a 123.|
00000009

Может быть, если вы дадите нам больше информации о проблемном файле, люди могут помочь вам здесь.

В то же время:

http://en.wikipedia.org/wiki/ASCII

http://en.wikipedia.org/wiki/UTF-8

http://en.wikipedia.org/wiki/Unicode

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