|
encoding XML ( экспорт из DW )
|
|||
---|---|---|---|
#18+
Sorry, пора в отпуск, да грехи не пускают. Как известно, ЦБ перешел на XML данные. Отсюда и проблемы. Те методы, которые я использовал раньше, перестали удовлетворять. Решил все сделать красиво. Экспорт из DW, использование объектов PBDOM, и прочее . При экспорте из DW получаю XML файл. Все замечательно, только в кодировке UTF-8. А нужно, хоть умри, windows-1251. Иначе программы ЦБ эти данные "не хочут". Перепробовал много вариантов, но, т.к. размер файла может быть большим, надо найти технологичное решение, с малым временем обработки. Наверняка у кого-нибудь уже есть пути решения этой проблемки. Пока не получается решить красиво, а времени уже совсем мало осталось. ( Поиск рулит, но, вроде тщательно все просмотрел - того, что нужно пока не нашел ). Good Luck ! ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2008, 19:53 |
|
encoding XML ( экспорт из DW )
|
|||
---|---|---|---|
#18+
- Считать utf8 XML из файла в blob. - Функцией WinAPI MultiByteToWideChar перевести его в UTF-16 (используя кодовую страницу CP_UTF8) - Функцией WideCharToMultiByte перевести из UTF-16 в 1251 (используя кодовую страницу CP_ACP (для русской винды) или явно номер кодовой страницы 1251) - заменить в полученной строке encoding - записать blob обратно в файл Скорость максимальная, правда расход памяти может быть большой, но я надеюсь у вас там не гигабайные файлы генерятся :) . ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2008, 20:08 |
|
encoding XML ( экспорт из DW )
|
|||
---|---|---|---|
#18+
Спасибо, на эти функции уже "натыкался", но до них руки пока не доходили. Спасибо, попробую. Кстати, а никто не пробовал изменить кодировку используя xslt ? Я думал, что может этот вариант сработает. К сожалению с xslt я еще "на Вы". Good Luck ! ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2008, 20:24 |
|
encoding XML ( экспорт из DW )
|
|||
---|---|---|---|
#18+
ChVКстати, а никто не пробовал изменить кодировку используя xslt ? Думаю это был бы самый медленный из всех вариантов :) Вообще судя по доке DW позволяет в шаблоне задать кодировку. Так что можно еще в эту сторону смотреть. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2008, 20:34 |
|
encoding XML ( экспорт из DW )
|
|||
---|---|---|---|
#18+
А шаблон у нас что ? Если DW -> View -> Export/import Template -> XML -> Edit -> XML Declaration -> encoding ... , то об этом уже много говорили - выпадающий список - фикция. Только UTF-8 и баста. Менять в исходниках DW на windows-1251 ребята еще 2-3 года тому назад пытались. Безрезультатно. Читать полученный файл, пропускать его через функции PB "FromUnicode" и "ToAnsi" и записывать в файл ... Хотел написать, что результат был отрицательный, но сейчас, с утра, увидел, что Help читал не внимательно. Попробую еще раз. Загружать XML файл в OLEobject, менять в нем кодировку и сохранять в другой файл - тоже себя не оправдало. Good Luck ! ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2008, 09:44 |
|
encoding XML ( экспорт из DW )
|
|||
---|---|---|---|
#18+
ChV Кстати, а никто не пробовал изменить кодировку используя xslt ? Я думал, что может этот вариант сработает. К сожалению с xslt я еще "на Вы". ... Вот так примерно: Код: plaintext 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2008, 11:34 |
|
encoding XML ( экспорт из DW )
|
|||
---|---|---|---|
#18+
До отпуска так ничего сделать - все время съела текучка. Сейчас могу сказать, что функции WinAPI MultiByteToWideChar и WideCharToMultiByte проблему решают. Хотя с определением длины получаемой строки ( блоба ) там засада. Они корректно определяют длину, но только не в этом случае. Но бог с ним. Главное есть положительный результат. Будем разбираться дальше. Good Luck ! ... |
|||
:
Нравится:
Не нравится:
|
|||
25.08.2008, 19:12 |
|
encoding XML ( экспорт из DW )
|
|||
---|---|---|---|
#18+
Спасибо. Автору. Участникам топика. Всему PowerBuilder сообществу :) Очень пригодилось. Для желающих конкретный код Определение Local External Function Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Код функции Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33.
Кто не понял. Для корректного определения окончания перекодированной строки : - в конец входной строки добавляется ls_marker из нескольких символов - после отработки - этот маркер находится в результирующей строке и отрезается. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2008, 16:14 |
|
encoding XML ( экспорт из DW )
|
|||
---|---|---|---|
#18+
Есть еще один вариант. Работающий. Ранее я этот вариант отверг, т.к. кодировка не менялась. Почему этот вариант работает, а то же самое, но раньше кодировку не меняло - не разбирался. На работе, как всегда, прессинг по времени. Собственно, именно по этой причине я его и не выкладывал - не хорошо, не разобравшись, выкладывать что-то на форум. Но ... "ложка дорога к обеду". Раз эта проблема мучит и других - вот работающий скрипт : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
Good Luck ! ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2008, 10:11 |
|
encoding XML ( экспорт из DW )
|
|||
---|---|---|---|
#18+
1) ИМХО вот это: ZhV//Ограничение по длине строки - в половину макс. integer. Если надо больше - по частям - выдумки, являющиеся следствием того что эти объявления: ZhVUINT CodePage , /* code page */ & ... int inpdatalen, /* number of bytes in string */ & ...и т.п. - некорректны (должен быть тип ulong и long в обеих ф-ях) Так что если этот пример работает (в чем я сомневаюсь), то вы поистине везучий человек :) 2) Кроме того необходимость операции "определения окончания перекодированной строки" весьма спорна. Вместо этого достаточно правильно передавать длину исходной и конечной строки (не в байтах, а в символах). А для этого в свою очередь перед вызовом MultiByteToWideChar/WideCharToMultiByte надо их же вызывать с 0 в качестве длины приемного буфера, что заставит эти ф-и вернуть необходимую длину в символах не выполняя само преобразование. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2008, 22:21 |
|
encoding XML ( экспорт из DW )
|
|||
---|---|---|---|
#18+
18-я весначто заставит эти ф-и вернуть необходимую длину в символах не выполняя само преобразование. И кто же их заставит ? Если бы это работало с этими XML файлами - не было бы печали и столько потраченного времени. Я, возможно заблуждаюсь, но проблема в том, что в юникоде - только русские символы. И только они переводятся с юникода в ANSII. Остальные символы не меняются. Отсюда и некорректное значение возвращаемой длины. Буду рад, если был не прав. Просьба поправлять - после проверки теории - практикой. Good Luck ! ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2008, 13:52 |
|
encoding XML ( экспорт из DW )
|
|||
---|---|---|---|
#18+
ChV 18-я весначто заставит эти ф-и вернуть необходимую длину в символах не выполняя само преобразование. И кто же их заставит ? Создатель этих ф-й позаботился об этом :) MSDNcchWideChar [in] The size, in wide characters, of the buffer pointed to by the lpWideCharStr parameter. If this value is zero, the function returns the required buffer size, in wide characters , and makes no use of the lpWideCharStr buffer. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2008, 14:27 |
|
encoding XML ( экспорт из DW )
|
|||
---|---|---|---|
#18+
Вот как правильно объявлять и использовать эти ф-и: Код: plaintext 1. 2. 3. 4. 5.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2008, 15:12 |
|
encoding XML ( экспорт из DW )
|
|||
---|---|---|---|
#18+
Как мало пройдено путей. Как много сделано ошибок. Anatoly MoskovskyВот как правильно ОБЪЯВЛЯТЬ и использовать эти ф-и: Респект и уважуха. У меня были указаны другие типы данных. Все остальное было правильно. Спасибо. Good Luck ! ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2008, 15:48 |
|
encoding XML ( экспорт из DW )
|
|||
---|---|---|---|
#18+
Может кому-то пригодится: Немного разобрал и другие варианты изменения кодировки в XML файле. Действительно, если используешь объект "MSXML.DOMDocument" , как это указано выше, то при изменении значения encoding на "WINDOWS-1251" кодировка меняется. Если использовать объекты PBDOM_.... , то одно только изменение значения encoding на "WINDOWS-1251" ( pbdom_processinginstruction ) - не приводит к перекодировке. Good Luck ! ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2008, 19:12 |
|
encoding XML ( экспорт из DW )
|
|||
---|---|---|---|
#18+
Опять же, может кому-то пригодится: Использовал объект "MSXML.DOMDocument" и средства PB 9 - PBDOM_.... . Вывод - "MSXML.DOMDocument" и быстрее, и больше сервиса, который работает ( в отличии от PBDOM_...., где мне так и не удалось заставить отработать функцию RemoveChildElement ). Good Luck ! ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2008, 11:17 |
|
encoding XML ( экспорт из DW )
|
|||
---|---|---|---|
#18+
Подскажите, как преобразовать обратно? Из ANSI в UTF-8??? Перебрал все варианты, ни как не выходит на PB 6.5.1 такая операция... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2009, 12:10 |
|
encoding XML ( экспорт из DW )
|
|||
---|---|---|---|
#18+
при вызове MultiByteToWideChar( 65001, 0, ls_ansi_text, ll_ansi_len , ref lbb_utf16, ll_wide_len) получается чистый юникод, а не UTF-8 и при этом не правильно перекодируются русские буквы ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2009, 12:14 |
|
encoding XML ( экспорт из DW )
|
|||
---|---|---|---|
#18+
guest_ansi_utf8при вызове MultiByteToWideChar( 65001, 0, ls_ansi_text, ll_ansi_len , ref lbb_utf16, ll_wide_len) получается чистый юникод, а не UTF-8 и при этом не правильно перекодируются русские буквы Вообще-то прямое преобразование делается (в примере выше) двумя вызовами: MultiByteToWideChar UTF-8 -> UTF-16 WideCharToMultiByte UTF-16 -> Win1251 Поэтому обратное также надо делать двумя вызовами (инверсными). ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2009, 15:44 |
|
encoding XML ( экспорт из DW )
|
|||
---|---|---|---|
#18+
К сожалению ( а если честно, то к счастью) я с этой проблемой не столкнулся. Мне понравился вариант, который полностью решил мои проблемы - изменение кодировки ( encoding ) в объекте "MSXML.DOMDocument". Конечно, это если у Вас текст - XML. Но если это не так и без MultiByteToWideChar / WideCharToMultiByte не обойтись, то прийдется искать примеры в интернете на VB или CИ. P.S. Из того, что когда-то нашел для этих функций: uint CP_UTF8 = 65001 uint CP_UTF16 = 1200 uint CP_1252 = 1252 Good Luck ! ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2009, 15:49 |
|
encoding XML ( экспорт из DW )
|
|||
---|---|---|---|
#18+
PBDOM'а нет, так как 6-ая версия PB. Вообщем я пытаюсь сделать по аналогии с примером выше, в 2 шага: на вход приходит анси-строка (ls_ansi_text) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
После первого шага все отлично - в блобе lbb_utf16 содержится юникод, а вот на втором шаге ll_utf8_len все время равен 0. Что я не так делаю? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2009, 17:58 |
|
encoding XML ( экспорт из DW )
|
|||
---|---|---|---|
#18+
guest_ansi_utf8Что я не так делаю? На первый взгляд все правильно. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2009, 18:40 |
|
encoding XML ( экспорт из DW )
|
|||
---|---|---|---|
#18+
Меня смущает реплика guest_ansi_utf8PBDOM'а нет, так как 6-ая версия PB. Если это в мой адрес, то, на всякий случай, хочу заметить - надеюсь Вы понимаете, что PBDOM и MSXML - разные объекты. PBDOM - объект РB. Доступен начиная с PB 9.0. MSXML - объект от Microsoft. И он доступен любой версии PB. Good Luck ! ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2009, 10:27 |
|
|
start [/forum/topic.php?fid=15&fpage=37&tid=1336402]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
others: | 310ms |
total: | 464ms |
0 / 0 |