Изящное преобразование из Unicode в однобайтовую кодировку

Моя база данных (10gR2) однобайтная (NLS_CHARACTERSET = WE8DEC).

У меня есть XML-файл Unicode, который я хотел бы проанализировать. Если я прочитаю файл в CLOB и попытаюсь преобразовать его в XMLType, Oracle захлебнется, если XML содержит специальные символы (в данном случае норвежские символы, такие как "øæå").

ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing
LPX-00216: invalid character 184 (0xB8)

Если я читаю файл в NCLOB, а затем явно преобразовываю его в CLOB с помощью TO_CLOB, конструктор XMLType завершается успешно. Однако это преобразование дает «уродливые» результаты. Например,

bølle gjær

становится

bÿlle gjÿr

Есть ли способ выполнить преобразование из NCLOB с Unicode в однобайтовый CLOB и при этом сохранить специальные символы? (Меня особенно интересует правильное преобразование только трех норвежских символов «øæå», другие специальные символы и символы в этом случае не так важны.)


person ObiWanKenobi    schedule 10.09.2009    source источник


Ответы (3)


Можно перекодировать те символы, которые не помещаются в один байт, используя ссылки на символы. Это можно сделать, найдя значение Unicode, поместив его в ссылку. Например, A будет выглядеть как A

person Adam Hawkes    schedule 10.09.2009

Предполагается, что TO_CLOB правильно преобразует национальный набор символов в набор символов базы данных. У вас не будет никаких проблем, если все символы могут быть сопоставлены.

Затем я подозреваю, что ваша проблема возникает в части прочитать файл в NCLOB. Юникод — довольно расплывчатая информация:

Для перехода от одного к другому требуется определенное преобразование. Сначала вы должны убедиться, что NCLOB, содержащий ваш XML-файл, содержит правильную информацию.

person Mac    schedule 11.09.2009

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

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

SELECT CONVERT(NAME, 'WE8ISO8859P1', 'WE8DEC')  
  FROM table

Попробуйте с:

NE8ISO8859P10 ISO 8859-10 Северная Европа

NEE8ISO8859P4 ISO 8859-4 Северная и Северо-Восточная Европа

На этой странице перечислены настройки Oracle 8i NLS.

person Community    schedule 12.09.2009