Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / CLOB UTF8 -> WIN1251 / 25 сообщений из 35, страница 1 из 2
14.07.2010, 17:28
    #36741399
max13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB UTF8 -> WIN1251
Есть CLOB в UTF8, необходимо сконвертировать в WIN1251.
Стандартный Convert работает, но только со строками до 32к.
Искал в форуме - в основном задача стоит WIN1251->UTF8 и вроде бы можно по частям, но в моем случае с исходным UTF8 не определить на какие части нужно делить строку.
Может кто-то знает правильное решение данной проблемы?
...
Рейтинг: 0 / 0
14.07.2010, 20:31
    #36741841
wildwind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB UTF8 -> WIN1251
max13в моем случае с исходным UTF8 не определить на какие части нужно делить строку Неправда ваша. Методы пакета dbms_lob прекрасно определяют.
...
Рейтинг: 0 / 0
15.07.2010, 09:31
    #36742328
max13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB UTF8 -> WIN1251
А можно поподробнее? Плохо представляю как dbms_lob'у можно сказать что у меня в CLOB сидит UTF8 при том, что NLS_CHARACTERSET = CL8MSWIN1251.
Допустим вот так:
DECLARE
a CLOB;
b CLOB;
BEGIN
a := 'Привет!';
b := CONVERT(a, 'CL8MSWIN1251', 'UTF8');
dbms_output.put_line(b);
END;
--------------------------------------
Привет!

как разбить "a" на:
a1='при'
a2='вет!'
?
...
Рейтинг: 0 / 0
15.07.2010, 10:53
    #36742539
chameleon82
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB UTF8 -> WIN1251
Насколько я знаю, утф-8 шифрует данные толи по 4, толи по 2 байта. делите длину строки кратно 4 и нет проблем :)
...
Рейтинг: 0 / 0
15.07.2010, 11:02
    #36742559
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB UTF8 -> WIN1251
chameleon82Насколько я знаю, утф-8 шифрует данные толи по 4, толи по 2 байта.
- UTF8 не шифрует данные
- codepoint в UTF8 может быть представлен цепочкой байт длиной от 1 до 6.
За подробностями - на unicode.org.

2TC: Установите на клиенте NLS_LANG=.CL8MSWIN1251, выгрузите CLOB в файл(ы), смените NLS_LANG на .UTF8 и загрузите обратно.
Oracle Developer и прочие java-тулзы для операции не подойдут, нужно что-то с поддержкой монобайта - sql*plus, например.
...
Рейтинг: 0 / 0
15.07.2010, 11:44
    #36742680
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB UTF8 -> WIN1251
max13как dbms_lob\'у можно сказать что у меня в CLOB сидит UTF8 при том, что NLS_CHARACTERSET = CL8MSWIN1251.10g
Код: plaintext
declare\n  c clob;\n  b blob;\n  c2 clob;\n  l_dest_offset   integer :=  1 ;\n  l_source_offset integer :=  1 ;\n  l_lang_context  integer := DBMS_LOB.DEFAULT_LANG_CTX;\n  l_warning       integer := DBMS_LOB.WARN_INCONVERTIBLE_CHAR;\nBEGIN\n  c := convert(\'Привет!\', \'utf8\');\n  dbms_output.put_line(c);\n  DBMS_LOB.CREATETEMPORARY(b, TRUE);\n  DBMS_LOB.CONVERTTOBLOB\n  (\n   dest_lob    =>b,\n   src_clob    =>c,\n   amount      =>DBMS_LOB.LOBMAXSIZE,\n   dest_offset =>l_dest_offset,\n   src_offset  =>l_source_offset,\n   blob_csid   => 0 ,\n   lang_context=>l_lang_context,\n   warning     =>l_warning\n  );\n  l_dest_offset   :=  1 ;\n  l_source_offset :=  1 ;\n  l_lang_context  := DBMS_LOB.DEFAULT_LANG_CTX;\n  DBMS_LOB.CREATETEMPORARY(c2, TRUE);\n  DBMS_LOB.CONVERTTOCLOB\n  (\n   dest_lob    =>c2,\n   src_blob    =>b,\n   amount      =>DBMS_LOB.LOBMAXSIZE,\n   dest_offset =>l_dest_offset,\n   src_offset  =>l_source_offset,\n   blob_csid   =>NLS_CHARSET_ID (\'UTF8\'),\n   lang_context=>l_lang_context,\n   warning     =>l_warning\n  );\n  c := c2;\n  dbms_output.put_line(c);\nend;\n/\n\nР_С_РёР_РчС\'!\nПривет!\n\nPL/SQL procedure successfully completed.
При многобайтном NLS_CHARACTERSET фокус, насколько я понимаю, не удастся.
...
Рейтинг: 0 / 0
15.07.2010, 12:26
    #36742841
max13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB UTF8 -> WIN1251
andrey_anonymous:
вариант интересный, хотя с реализацией проблема :)

Elic:
действительно работает, 100к символов уже сконвертил! я пытался что-то подобное соорудить, но безрезультатно, не хватало ключевой строки: blob_csid =>NLS_CHARSET_ID ('UTF8')

Спасибо всем!
...
Рейтинг: 0 / 0
15.07.2010, 15:09
    #36743387
wildwind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB UTF8 -> WIN1251
max13у меня в CLOB сидит UTF8 при том, что NLS_CHARACTERSET = CL8MSWIN1251. Это другое дело. А как вы это получили?
...
Рейтинг: 0 / 0
16.07.2010, 11:06
    #36744692
max13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB UTF8 -> WIN1251
wildwindЭто другое дело. А как вы это получили?
Да, извиняюсь, сразу не написал про настройку базы.
Текст в UTF8 поступает от внешнего средства ("черного ящика") посредством COM-объектов и падает в CLOB.
Кстати в нем XML и была даже мысль на уровне dbms_xmlparser как-то конвертировать, но что-то я ничего по теме в нем не нашел.
...
Рейтинг: 0 / 0
16.07.2010, 13:58
    #36745104
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB UTF8 -> WIN1251
max13Текст в UTF8 поступает от внешнего средства ("черного ящика") посредством COM-объектов и падает в CLOB.
Измените настройки - COM-объекты, посредством которых данные попадают в базу, должны заявить кодировку, соответствующую данным, т.е. UTF8.
В этом случае перекодировка будет осуществляться автомагически.
Текущая настройка - cl8mswin1251 - неверна.
...
Рейтинг: 0 / 0
16.07.2010, 14:44
    #36745244
max13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB UTF8 -> WIN1251
andrey_anonymous
Измените настройки - COM-объекты, посредством которых данные попадают в базу, должны заявить кодировку, соответствующую данным, т.е. UTF8.
В этом случае перекодировка будет осуществляться автомагически.
Текущая настройка - cl8mswin1251 - неверна.
Конкретно данная задача составляет 0.1% от всей системы, и ради нее переводить всю базу на UTF8 неразумно.
Не очень понял насчет "В этом случае перекодировка будет осуществляться автомагически.". Если все будет в UTF8, то и перекодировка никакая не нужна ведь? или я чего-то не понял...
...
Рейтинг: 0 / 0
16.07.2010, 14:46
    #36745252
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB UTF8 -> WIN1251
max13или я чего-то не понял...
Именно.
Globalization Support Guide в помощь.
...
Рейтинг: 0 / 0
16.07.2010, 14:50
    #36745264
Proteus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB UTF8 -> WIN1251
max13,

Клиент, будь то COM или SQL+, не должен обманывать сервер о кодировке данных которые он запихивает в базу. Если твой COM сообщит о том что он собирается пихать UTF8 то при пересылке данных в базу которая в MSWIN1251 произойдет конвертация в кодировку базы.
...
Рейтинг: 0 / 0
16.07.2010, 15:51
    #36745444
Max13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB UTF8 -> WIN1251
Proteusmax13,

Клиент, будь то COM или SQL+, не должен обманывать сервер о кодировке данных которые он запихивает в базу. Если твой COM сообщит о том что он собирается пихать UTF8 то при пересылке данных в базу которая в MSWIN1251 произойдет конвертация в кодировку базы.
Кажется начинаю понимаю о чем речь. Но в моем случае никакой клиент не пытается что-то вставить в базу Oracle. Наоборот - есть COM, который представляет собой черный ящик и умеет возвращать строку UTF8 (как он это делает, откуда берет данные я даже не представляю, знаю только как запустить). В результате после манипуляций с этим самым COM в pl/sql процедуре возникает строка UTF8, которую нужно конвертнуть, чтобы можно было обработать в базе.
...
Рейтинг: 0 / 0
16.07.2010, 16:00
    #36745470
Proteus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB UTF8 -> WIN1251
не знаю как там COM не работал с ними. Но можно предположить что если строка появляется сама по себе то COM сам устанавливает соединение с базой. можно попробовать сменить значение NLS_LANG в реестре на *******_******.UTF8 того хоста на котором поднимается COM и посмотреть на результат, будет ли продолжать приходить UTF8 или в базе появится другая кодировка.
...
Рейтинг: 0 / 0
16.07.2010, 16:35
    #36745564
Max13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB UTF8 -> WIN1251
Proteusне знаю как там COM не работал с ними. Но можно предположить что если строка появляется сама по себе то COM сам устанавливает соединение с базой. можно попробовать сменить значение NLS_LANG в реестре на *******_******.UTF8 того хоста на котором поднимается COM и посмотреть на результат, будет ли продолжать приходить UTF8 или в базе появится другая кодировка.
да, COM скорее всего сам устанавливает соединение с базой, но только не с моей, оракловой, а с внешней (которая находится вообще где-то в европе), что-то читает оттуда и как результат выдает мне строку. В описании COM-объекта, которым я располагаю написано, что функция возвращает строку в UTF8. Судя по экспериментам так оно и есть.
Вообще COM-функцию я запускаю через JavaScript на клиенте (ORDCOM не удалось побороть, что-то с ним не так), затем через Ajax->Apache->Application Server процедура pl/sql на сервере, у которой в качестве параметра та самая строка. Я пытался в HTTP заголовке аякса указать UTF8, но то ли не то писал, то ли действительно не срабатывает и не понятно должно ли. Где-то вот тут:
...
httpRequest.open( "POST", url, true );
httpRequest.setRequestHeader(''Content-Type'', ''"text/xml"'');
...
...
Рейтинг: 0 / 0
16.07.2010, 16:49
    #36745601
Proteus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB UTF8 -> WIN1251
Следовательно в твою то базу кто закидывает строку? Твое приложение?
Тогда оно должно озаботится тем чтобы открытая сессия к базе данных получила ту кодировку в которой передает данные. Раз у тебя UTF8 так и укажи что у тебя UTF8.
Код: plaintext
alter session set NLS_LANGUAGE=*****.UTF8
...
Рейтинг: 0 / 0
16.07.2010, 16:56
    #36745616
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB UTF8 -> WIN1251
Proteus
Код: plaintext
alter session set NLS_LANGUAGE=*****.UTF8

Ну-ну

Вернее, мысль-то правильная, на application server об этом надо позаботиться.
Но предложение...
...
Рейтинг: 0 / 0
16.07.2010, 17:06
    #36745648
Proteus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB UTF8 -> WIN1251
andrey_anonymous,

Ну, я не владею, серверами приложений и от косяков не застрахован. Где там нужно прикрутить кодировку не знаю, но для того чтобы пропихнуть данные в нужной кодировке через SQL+ поступал именно так.

Так что не обессудьте.
...
Рейтинг: 0 / 0
16.07.2010, 17:21
    #36745689
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB UTF8 -> WIN1251
Proteusдля того чтобы пропихнуть данные в нужной кодировке через SQL+ поступал именно так. Так что не обессудьте.
Поступать Вы вольны как угодно, но...
Код: plaintext
1.
2.
3.
4.
SQL> alter session set NLS_LANGUAGE=AMERICAN_AMERICA.UTF8;
alter session set NLS_LANGUAGE=AMERICAN_AMERICA.UTF8
                                               *
ERROR at line  1 :
ORA- 00922 : missing or invalid option
...
Рейтинг: 0 / 0
16.07.2010, 17:29
    #36745706
wildwind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB UTF8 -> WIN1251
Max13через Ajax->Apache->Application Server процедура pl/sql на сервере, у которой в качестве параметра та самая строка А все остальные данные (в смысле human-readable) у вас в 1251?
Если так, конвертите средствами Явы перед вызовом процедуры, и не парьте себе и людям мозги.

Кстати, лезть на сервера в Европе с клиента тоже бред еще тот.
...
Рейтинг: 0 / 0
16.07.2010, 17:48
    #36745739
max13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB UTF8 -> WIN1251
alter session уже смотрел - понял что нет такого там.
SQL+ больно сложно еще привязывать сюда.
Application Server - вариант, но где и как не пойму. Если на клиенте, то что-то не помогает:
httpRequest.setRequestHeader("Content-Type", "text/xml;charset=UTF-8");
...
Рейтинг: 0 / 0
16.07.2010, 17:59
    #36745763
max13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB UTF8 -> WIN1251
wildwindMax13через Ajax->Apache->Application Server процедура pl/sql на сервере, у которой в качестве параметра та самая строка А все остальные данные (в смысле human-readable) у вас в 1251?
Если так, конвертите средствами Явы перед вызовом процедуры, и не парьте себе и людям мозги.

А яваскриптом то разве можно что-то скорвертить? Я ничего в инете на эту тему не нашел.
Конверт я уже и на pl/sql сделал благодаря Elic. Все работает. Сейчас просто спортивный интерес уже заставить все работать без всяких конвертаций. А мозг я никому не парю...
wildwind[quot Max13]Кстати, лезть на сервера в Европе с клиента тоже бред еще тот.
Когда другого варианта нет - ничего не поделаешь. Я же говорю - ORDCOM отказывается работать. Писать приложение на каком-нить С++ на сервере и потом с базой обмениваться через файлы итд итп еще хуже.
...
Рейтинг: 0 / 0
16.07.2010, 19:57
    #36745913
Proteus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB UTF8 -> WIN1251
andrey_anonymousProteusдля того чтобы пропихнуть данные в нужной кодировке через SQL+ поступал именно так. Так что не обессудьте.
Поступать Вы вольны как угодно, но...
Код: plaintext
1.
2.
3.
4.
SQL> alter session set NLS_LANGUAGE=AMERICAN_AMERICA.UTF8;
alter session set NLS_LANGUAGE=AMERICAN_AMERICA.UTF8
                                               *
ERROR at line  1 :
ORA- 00922 : missing or invalid option


да, да это я дурку прогнал.

все было почти так но по другому :)
Код: plaintext
1.
2.
3.
4.
set nls_lang=american_america.utf8

sqlplus /nolog

...
Рейтинг: 0 / 0
17.07.2010, 00:36
    #36746100
wildwind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB UTF8 -> WIN1251
max13А яваскриптом то разве можно что-то скорвертить?
А я где-то писал про яваскрипт? App. server на чем у вас?

wildwindMax13Кстати, лезть на сервера в Европе с клиента тоже бред еще тот.
Когда другого варианта нет - ничего не поделаешь. Я сильно сомневаюсь, что вы рассмотрели другие варианты, не то что попробовали. Протокол обмена с Европой - секретный? Наверняка обычный веб-сервис.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / CLOB UTF8 -> WIN1251 / 25 сообщений из 35, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]