Изящно конвертировать из Unicode в однобайтовую кодировку - PullRequest
2 голосов
/ 10 сентября 2009

Моя база данных (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 и при этом сохранить специальные символы без изменений? (Меня особенно интересует правильное преобразование только трех норвежских символов «øæå», другие специальные символы и символы в данном случае не так важны.)

Ответы [ 3 ]

1 голос
/ 11 сентября 2009

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

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

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

1 голос
/ 10 сентября 2009

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

0 голосов
/ 12 сентября 2009

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

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

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

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

NE8ISO8859P10 ISO 8859-10 Североевропейский

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

Это страница список настроек Oracle 8i NLS

...