|
|
|
CLOB UTF8 -> WIN1251
|
|||
|---|---|---|---|
|
#18+
Есть CLOB в UTF8, необходимо сконвертировать в WIN1251. Стандартный Convert работает, но только со строками до 32к. Искал в форуме - в основном задача стоит WIN1251->UTF8 и вроде бы можно по частям, но в моем случае с исходным UTF8 не определить на какие части нужно делить строку. Может кто-то знает правильное решение данной проблемы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2010, 17:28 |
|
||
|
CLOB UTF8 -> WIN1251
|
|||
|---|---|---|---|
|
#18+
max13в моем случае с исходным UTF8 не определить на какие части нужно делить строку Неправда ваша. Методы пакета dbms_lob прекрасно определяют. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2010, 20:31 |
|
||
|
CLOB UTF8 -> WIN1251
|
|||
|---|---|---|---|
|
#18+
А можно поподробнее? Плохо представляю как 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='вет!' ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2010, 09:31 |
|
||
|
CLOB UTF8 -> WIN1251
|
|||
|---|---|---|---|
|
#18+
Насколько я знаю, утф-8 шифрует данные толи по 4, толи по 2 байта. делите длину строки кратно 4 и нет проблем :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2010, 10:53 |
|
||
|
CLOB UTF8 -> WIN1251
|
|||
|---|---|---|---|
|
#18+
chameleon82Насколько я знаю, утф-8 шифрует данные толи по 4, толи по 2 байта. - UTF8 не шифрует данные - codepoint в UTF8 может быть представлен цепочкой байт длиной от 1 до 6. За подробностями - на unicode.org. 2TC: Установите на клиенте NLS_LANG=.CL8MSWIN1251, выгрузите CLOB в файл(ы), смените NLS_LANG на .UTF8 и загрузите обратно. Oracle Developer и прочие java-тулзы для операции не подойдут, нужно что-то с поддержкой монобайта - sql*plus, например. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2010, 11:02 |
|
||
|
CLOB UTF8 -> WIN1251
|
|||
|---|---|---|---|
|
#18+
max13как dbms_lob\'у можно сказать что у меня в CLOB сидит UTF8 при том, что NLS_CHARACTERSET = CL8MSWIN1251.10g Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2010, 11:44 |
|
||
|
CLOB UTF8 -> WIN1251
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous: вариант интересный, хотя с реализацией проблема :) Elic: действительно работает, 100к символов уже сконвертил! я пытался что-то подобное соорудить, но безрезультатно, не хватало ключевой строки: blob_csid =>NLS_CHARSET_ID ('UTF8') Спасибо всем! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2010, 12:26 |
|
||
|
CLOB UTF8 -> WIN1251
|
|||
|---|---|---|---|
|
#18+
max13у меня в CLOB сидит UTF8 при том, что NLS_CHARACTERSET = CL8MSWIN1251. Это другое дело. А как вы это получили? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2010, 15:09 |
|
||
|
CLOB UTF8 -> WIN1251
|
|||
|---|---|---|---|
|
#18+
wildwindЭто другое дело. А как вы это получили? Да, извиняюсь, сразу не написал про настройку базы. Текст в UTF8 поступает от внешнего средства ("черного ящика") посредством COM-объектов и падает в CLOB. Кстати в нем XML и была даже мысль на уровне dbms_xmlparser как-то конвертировать, но что-то я ничего по теме в нем не нашел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2010, 11:06 |
|
||
|
CLOB UTF8 -> WIN1251
|
|||
|---|---|---|---|
|
#18+
max13Текст в UTF8 поступает от внешнего средства ("черного ящика") посредством COM-объектов и падает в CLOB. Измените настройки - COM-объекты, посредством которых данные попадают в базу, должны заявить кодировку, соответствующую данным, т.е. UTF8. В этом случае перекодировка будет осуществляться автомагически. Текущая настройка - cl8mswin1251 - неверна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2010, 13:58 |
|
||
|
CLOB UTF8 -> WIN1251
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous Измените настройки - COM-объекты, посредством которых данные попадают в базу, должны заявить кодировку, соответствующую данным, т.е. UTF8. В этом случае перекодировка будет осуществляться автомагически. Текущая настройка - cl8mswin1251 - неверна. Конкретно данная задача составляет 0.1% от всей системы, и ради нее переводить всю базу на UTF8 неразумно. Не очень понял насчет "В этом случае перекодировка будет осуществляться автомагически.". Если все будет в UTF8, то и перекодировка никакая не нужна ведь? или я чего-то не понял... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2010, 14:44 |
|
||
|
CLOB UTF8 -> WIN1251
|
|||
|---|---|---|---|
|
#18+
max13или я чего-то не понял... Именно. Globalization Support Guide в помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2010, 14:46 |
|
||
|
CLOB UTF8 -> WIN1251
|
|||
|---|---|---|---|
|
#18+
max13, Клиент, будь то COM или SQL+, не должен обманывать сервер о кодировке данных которые он запихивает в базу. Если твой COM сообщит о том что он собирается пихать UTF8 то при пересылке данных в базу которая в MSWIN1251 произойдет конвертация в кодировку базы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2010, 14:50 |
|
||
|
CLOB UTF8 -> WIN1251
|
|||
|---|---|---|---|
|
#18+
Proteusmax13, Клиент, будь то COM или SQL+, не должен обманывать сервер о кодировке данных которые он запихивает в базу. Если твой COM сообщит о том что он собирается пихать UTF8 то при пересылке данных в базу которая в MSWIN1251 произойдет конвертация в кодировку базы. Кажется начинаю понимаю о чем речь. Но в моем случае никакой клиент не пытается что-то вставить в базу Oracle. Наоборот - есть COM, который представляет собой черный ящик и умеет возвращать строку UTF8 (как он это делает, откуда берет данные я даже не представляю, знаю только как запустить). В результате после манипуляций с этим самым COM в pl/sql процедуре возникает строка UTF8, которую нужно конвертнуть, чтобы можно было обработать в базе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2010, 15:51 |
|
||
|
CLOB UTF8 -> WIN1251
|
|||
|---|---|---|---|
|
#18+
не знаю как там COM не работал с ними. Но можно предположить что если строка появляется сама по себе то COM сам устанавливает соединение с базой. можно попробовать сменить значение NLS_LANG в реестре на *******_******.UTF8 того хоста на котором поднимается COM и посмотреть на результат, будет ли продолжать приходить UTF8 или в базе появится другая кодировка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2010, 16:00 |
|
||
|
CLOB UTF8 -> WIN1251
|
|||
|---|---|---|---|
|
#18+
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"''); ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2010, 16:35 |
|
||
|
CLOB UTF8 -> WIN1251
|
|||
|---|---|---|---|
|
#18+
Следовательно в твою то базу кто закидывает строку? Твое приложение? Тогда оно должно озаботится тем чтобы открытая сессия к базе данных получила ту кодировку в которой передает данные. Раз у тебя UTF8 так и укажи что у тебя UTF8. Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2010, 16:49 |
|
||
|
CLOB UTF8 -> WIN1251
|
|||
|---|---|---|---|
|
#18+
Proteus Код: plaintext Ну-ну Вернее, мысль-то правильная, на application server об этом надо позаботиться. Но предложение... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2010, 16:56 |
|
||
|
CLOB UTF8 -> WIN1251
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous, Ну, я не владею, серверами приложений и от косяков не застрахован. Где там нужно прикрутить кодировку не знаю, но для того чтобы пропихнуть данные в нужной кодировке через SQL+ поступал именно так. Так что не обессудьте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2010, 17:06 |
|
||
|
CLOB UTF8 -> WIN1251
|
|||
|---|---|---|---|
|
#18+
Proteusдля того чтобы пропихнуть данные в нужной кодировке через SQL+ поступал именно так. Так что не обессудьте. Поступать Вы вольны как угодно, но... Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2010, 17:21 |
|
||
|
CLOB UTF8 -> WIN1251
|
|||
|---|---|---|---|
|
#18+
Max13через Ajax->Apache->Application Server процедура pl/sql на сервере, у которой в качестве параметра та самая строка А все остальные данные (в смысле human-readable) у вас в 1251? Если так, конвертите средствами Явы перед вызовом процедуры, и не парьте себе и людям мозги. Кстати, лезть на сервера в Европе с клиента тоже бред еще тот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2010, 17:29 |
|
||
|
CLOB UTF8 -> WIN1251
|
|||
|---|---|---|---|
|
#18+
alter session уже смотрел - понял что нет такого там. SQL+ больно сложно еще привязывать сюда. Application Server - вариант, но где и как не пойму. Если на клиенте, то что-то не помогает: httpRequest.setRequestHeader("Content-Type", "text/xml;charset=UTF-8"); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2010, 17:48 |
|
||
|
CLOB UTF8 -> WIN1251
|
|||
|---|---|---|---|
|
#18+
wildwindMax13через Ajax->Apache->Application Server процедура pl/sql на сервере, у которой в качестве параметра та самая строка А все остальные данные (в смысле human-readable) у вас в 1251? Если так, конвертите средствами Явы перед вызовом процедуры, и не парьте себе и людям мозги. А яваскриптом то разве можно что-то скорвертить? Я ничего в инете на эту тему не нашел. Конверт я уже и на pl/sql сделал благодаря Elic. Все работает. Сейчас просто спортивный интерес уже заставить все работать без всяких конвертаций. А мозг я никому не парю... wildwind[quot Max13]Кстати, лезть на сервера в Европе с клиента тоже бред еще тот. Когда другого варианта нет - ничего не поделаешь. Я же говорю - ORDCOM отказывается работать. Писать приложение на каком-нить С++ на сервере и потом с базой обмениваться через файлы итд итп еще хуже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2010, 17:59 |
|
||
|
CLOB UTF8 -> WIN1251
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousProteusдля того чтобы пропихнуть данные в нужной кодировке через SQL+ поступал именно так. Так что не обессудьте. Поступать Вы вольны как угодно, но... Код: plaintext 1. 2. 3. 4. да, да это я дурку прогнал. все было почти так но по другому :) Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2010, 19:57 |
|
||
|
CLOB UTF8 -> WIN1251
|
|||
|---|---|---|---|
|
#18+
max13А яваскриптом то разве можно что-то скорвертить? А я где-то писал про яваскрипт? App. server на чем у вас? wildwindMax13Кстати, лезть на сервера в Европе с клиента тоже бред еще тот. Когда другого варианта нет - ничего не поделаешь. Я сильно сомневаюсь, что вы рассмотрели другие варианты, не то что попробовали. Протокол обмена с Европой - секретный? Наверняка обычный веб-сервис. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2010, 00:36 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=36746100&tid=1884648]: |
0ms |
get settings: |
6ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
139ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 197ms |
| total: | 409ms |

| 0 / 0 |
