Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Гость
|
Добавлено: Ср Авг 04 2004 09:05 Заголовок сообщения: Oracle конвертация строк из UTF-8 в CL8MSWIN1251 (сложно) |
|
|
Изначально:
1. xmldom поддерживает только UTF-8 (win1251 разбирает но не пишет)
2. convert и подобные функции не поддерживают нашу кодировку
3. конечный XML (ответное сообщение) должно быть таким же как и вся база т.е. win1251
Пока единственный способ (работает посимвольно):
--UTF-8 > Win1251
-- берем каждый русский символ и:
--select ascii('Ð')*65535+ascii('¹') from dual =13631465
select chr(ascii(to_single_byte(chr(13631465 using nchar_cs)))) from dual
Очень хочу узнать есть ли способ проще, потому что это нереальный вариант. |
|
Вернуться к началу |
|
|
Antimof
Зарегистрирован: 04.08.2004 Сообщения: 41 Откуда: Тольятти
|
Добавлено: Ср Авг 04 2004 09:49 Заголовок сообщения: (вдогонку) |
|
|
За любую подсказку буду благодарен |
|
Вернуться к началу |
|
|
wildwind
Зарегистрирован: 03.02.2004 Сообщения: 268 Откуда: Москва
|
Добавлено: Ср Авг 04 2004 18:01 Заголовок сообщения: |
|
|
Версия (точно)?
xmldom = DBMS_XMLDOM ?
У меня пишет 866 (база такая). |
|
Вернуться к началу |
|
|
Antimof
Зарегистрирован: 04.08.2004 Сообщения: 41 Откуда: Тольятти
|
Добавлено: Чт Авг 05 2004 07:34 Заголовок сообщения: Про перекодировку |
|
|
Да, это DBMS_XMLDOM.
Oracle 901.11
Предложенный мною вариант ранее можно упростить, но он все равно нереален, т.к. оказывается что кириллица в UTF-8 расположена не совсем линейно. И начиная с "п" ряд теряет порядок (спецификация объясняет почему).
Возникла идея, что может это проблема клиента, который пытается отобразить utf побайтно, а потому попросту искажает результат.
Но с другой стороны, при установке NLS_LANG в реестре на AMERICAN_AMERICA.UTF8 кириллица все так же криво отображается, что наводит на плохую мысль |
|
Вернуться к началу |
|
|
wildwind
Зарегистрирован: 03.02.2004 Сообщения: 268 Откуда: Москва
|
Добавлено: Чт Авг 05 2004 12:39 Заголовок сообщения: |
|
|
У меня тоже возникает подобная проблема, правда не совсем в этом месте, но все равно давай разберемся.
Вот мой эксперимент. Oracle 9.2.0.4, NLS_LANG=RUSSIAN_CIS.CL8MSWIN1251, база в RU8PC866
Код: |
SQL*Plus: Release 8.0.6.0.0 - Production on Чтв Авг 5 13:21:27 2004
(c) Copyright 1999 Oracle Corporation. All rights reserved.
Enter password: ***********
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.5.0 - 64bit Production
With the Partitioning option
JServer Release 9.2.0.5.0 - Production
SQL> select * from nls_database_parameters where parameter='NLS_CHARACTERSET';
PARAMETER VALUE
------------------------------ ----------------------------------------
NLS_CHARACTERSET RU8PC866
SQL> set serverout on
SQL> declare
2 str varchar2(100) := 'АБВГДЕ';
3 xml_str varchar2(2000);
4 doc dbms_xmldom.domDocument;
5 rootnode dbms_xmldom.domNode;
6 node dbms_xmldom.domNode;
7 begin
8 doc := dbms_xmldom.newDomDocument;
9 node := dbms_xmldom.appendChild(dbms_xmldom.makeNode(doc),
10 dbms_xmldom.makeNode(dbms_xmldom.createElement(doc, 'DOC')));
11 node := dbms_xmldom.appendChild(node,
12 dbms_xmldom.makeNode(dbms_xmldom.createTextNode(doc, str)));
13 dbms_xmldom.writeToBuffer(doc, xml_str);
14 dbms_xmldom.freeDocument(doc);
15
16 dbms_output.put_line(xml_str);
17 dbms_output.put_line('-------------------------');
18 dbms_output.put_line(utl_raw.cast_to_raw(xml_str));
19 end;
20 /
<DOC>АБВГДЕ</DOC>
-------------------------
3C444F433E8081828384853C2F444F433E0A
PL/SQL procedure successfully completed.
SQL>
|
Как видно по кодам, xml получается в кодировке 866, то есть в кодировке базы. При передаче на клиента перекодируется в 1251, как и должно быть.
Попробуй прогнать то же самое у себя и запости результаты. |
|
Вернуться к началу |
|
|
Гость
|
Добавлено: Чт Авг 05 2004 13:03 Заголовок сообщения: |
|
|
вот результаты
Код: |
Connected to Oracle9i Enterprise Edition Release 9.2.0.1.0
SQL> select * from nls_database_parameters where parameter='NLS_CHARACTERSET';
PARAMETER VALUE
------------------------------ ----------------------------------------
NLS_CHARACTERSET CL8MSWIN1251
SQL>
<DOC>АБВГДЕ</DOC>
-------------------------
3C444F433EC0C1C2C3C4C53C2F444F433E0A
PL/SQL procedure successfully completed |
|
|
Вернуться к началу |
|
|
Antimof
Зарегистрирован: 04.08.2004 Сообщения: 41 Откуда: Тольятти
|
Добавлено: Чт Авг 05 2004 13:15 Заголовок сообщения: |
|
|
это не тот сервер
потом доберусь до исходного и отправлю результаты еще раз |
|
Вернуться к началу |
|
|
Гость
|
Добавлено: Чт Авг 05 2004 13:17 Заголовок сообщения: |
|
|
Вроде бы xml выдается в 1251... |
|
Вернуться к началу |
|
|
Antimof
Зарегистрирован: 04.08.2004 Сообщения: 41 Откуда: Тольятти
|
Добавлено: Чт Авг 05 2004 16:27 Заголовок сообщения: |
|
|
Вот результаты тестирования на исходном сервере.
Код: |
Connected to Oracle9i Enterprise Edition Release 9.0.1.1.1
SQL> select * from nls_database_parameters where parameter='NLS_CHARACTERSET';
PARAMETER VALUE
------------------------------ ----------------------------------------
NLS_CHARACTERSET CL8MSWIN1251
<DOC>ÐБВГДЕ</DOC>
-------------------------
3C444F433ED090D091D092D093D094D0953C2F444F433E0D0A
PL/SQL procedure successfully completed
|
Похоже все дело из-за NT платформы, потому что мой предыдущий пост был запущен с использованием базы на линуксе, а эта база на Win2000 (тестовая типа). |
|
Вернуться к началу |
|
|
wildwind
Зарегистрирован: 03.02.2004 Сообщения: 268 Откуда: Москва
|
Добавлено: Чт Авг 05 2004 17:46 Заголовок сообщения: |
|
|
Да, все символы двухбайтовые...
Возможно не все дело из-за NT платформы, возможно в Release 9.0.1.1.1 бага, которую потом исправили. В любом случае советую проапгрейдиться до 9.2.0.x. А может и что-то где-то криво настроено.
Кстати в конце строки стоит CRLF вместо обычного LF. Это уж точно из-за Win платформы.
А как ведут себя XMLType, dbms_xmlgen, sys_xmlgen, не пробовал?
______________________________________
У меня к тебе встречный вопрос: не случалось ли передавать символьные данные в хранимую Java-процедуру, и получать обратно? Как обрабатывались русские буквы? У меня портятся |
|
Вернуться к началу |
|
|
Antimof
Зарегистрирован: 04.08.2004 Сообщения: 41 Откуда: Тольятти
|
Добавлено: Пт Авг 06 2004 12:34 Заголовок сообщения: |
|
|
Эти пакеты я не пробовал в работе - просто нет под них задач. Думаю что будут тоже глючить.
И к сожалению ничем не могу помочь с Java-процедурами, т.к. у меня нет никакого опыта работы с ними.
Спасибо за помощь.
|
|
Вернуться к началу |
|
|
|