Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Oracle конвертация строк из UTF-8 в CL8MSWIN1251 (сложно)

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Базы данных
Предыдущая тема :: Следующая тема  
Автор Сообщение
Гость






СообщениеДобавлено: Ср Авг 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    Заголовок сообщения: (вдогонку) Ответить с цитатой

За любую подсказку буду благодарен Very Happy
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
wildwind



Зарегистрирован: 03.02.2004
Сообщения: 268
Откуда: Москва

СообщениеДобавлено: Ср Авг 04 2004 18:01    Заголовок сообщения: Ответить с цитатой

Версия (точно)?
xmldom = DBMS_XMLDOM ?

У меня пишет 866 (база такая).
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
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, как и должно быть.

Попробуй прогнать то же самое у себя и запости результаты.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Гость






СообщениеДобавлено: Чт Авг 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    Заголовок сообщения: Ответить с цитатой

Embarassed это не тот сервер
потом доберусь до исходного и отправлю результаты еще раз
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Гость






СообщениеДобавлено: Чт Авг 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-процедуру, и получать обратно? Как обрабатывались русские буквы? У меня портятся Sad
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Antimof



Зарегистрирован: 04.08.2004
Сообщения: 41
Откуда: Тольятти

СообщениеДобавлено: Пт Авг 06 2004 12:34    Заголовок сообщения: Ответить с цитатой

Эти пакеты я не пробовал в работе - просто нет под них задач. Думаю что будут тоже глючить.

И к сожалению ничем не могу помочь с Java-процедурами, т.к. у меня нет никакого опыта работы с ними.

Спасибо за помощь.

Very Happy
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Базы данных Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...