powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / encoding XML ( экспорт из DW )
25 сообщений из 29, страница 1 из 2
encoding XML ( экспорт из DW )
    #35469744
Фотография ChV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник

Good Luck !
...
Рейтинг: 0 / 0
encoding XML ( экспорт из DW )
    #35469769
Фотография ChV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sorry, пора в отпуск, да грехи не пускают. Как известно, ЦБ перешел на XML данные. Отсюда и проблемы. Те методы, которые я использовал раньше, перестали удовлетворять. Решил все сделать красиво. Экспорт из DW, использование объектов PBDOM, и прочее . При экспорте из DW получаю XML файл. Все замечательно, только в кодировке UTF-8. А нужно, хоть умри, windows-1251. Иначе программы ЦБ эти данные "не хочут". Перепробовал много вариантов, но, т.к. размер файла может быть большим, надо найти технологичное решение, с малым временем обработки.
Наверняка у кого-нибудь уже есть пути решения этой проблемки. Пока не получается решить красиво, а времени уже совсем мало осталось.
( Поиск рулит, но, вроде тщательно все просмотрел - того, что нужно пока не нашел ).

Good Luck !
...
Рейтинг: 0 / 0
encoding XML ( экспорт из DW )
    #35469787
18-я весна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
- Считать utf8 XML из файла в blob.
- Функцией WinAPI MultiByteToWideChar перевести его в UTF-16 (используя кодовую страницу CP_UTF8)
- Функцией WideCharToMultiByte перевести из UTF-16 в 1251 (используя кодовую страницу CP_ACP (для русской винды) или явно номер кодовой страницы 1251)
- заменить в полученной строке encoding
- записать blob обратно в файл

Скорость максимальная, правда расход памяти может быть большой, но я надеюсь у вас там не гигабайные файлы генерятся :) .
...
Рейтинг: 0 / 0
encoding XML ( экспорт из DW )
    #35469801
Фотография ChV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, на эти функции уже "натыкался", но до них руки пока не доходили. Спасибо, попробую.
Кстати, а никто не пробовал изменить кодировку используя xslt ?
Я думал, что может этот вариант сработает. К сожалению с xslt я еще "на Вы".

Good Luck !
...
Рейтинг: 0 / 0
encoding XML ( экспорт из DW )
    #35469813
18-я весна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChVКстати, а никто не пробовал изменить кодировку используя xslt ? Думаю это был бы самый медленный из всех вариантов :)

Вообще судя по доке DW позволяет в шаблоне задать кодировку.
Так что можно еще в эту сторону смотреть.
...
Рейтинг: 0 / 0
encoding XML ( экспорт из DW )
    #35470307
Фотография ChV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А шаблон у нас что ? Если 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 !
...
Рейтинг: 0 / 0
encoding XML ( экспорт из DW )
    #35470626
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChV
Кстати, а никто не пробовал изменить кодировку используя xslt ?
Я думал, что может этот вариант сработает. К сожалению с xslt я еще "на Вы".
...
Вот так примерно:
Код: plaintext
1.
2.
3.
4.
5.
6.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
<xsl:output method="xml" encoding="windows-1251"/>
<xsl:template match="/">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
К сожалению, ссылку на первоисточник не нашел :-(
...
Рейтинг: 0 / 0
encoding XML ( экспорт из DW )
    #35471071
Фотография ChV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отлично ! Попробую !

Good Luck !
...
Рейтинг: 0 / 0
encoding XML ( экспорт из DW )
    #35505138
Фотография ChV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
До отпуска так ничего сделать - все время съела текучка.
Сейчас могу сказать, что функции WinAPI MultiByteToWideChar и WideCharToMultiByte проблему решают.
Хотя с определением длины получаемой строки ( блоба ) там засада.
Они корректно определяют длину, но только не в этом случае. Но бог с ним.
Главное есть положительный результат. Будем разбираться дальше.

Good Luck !
...
Рейтинг: 0 / 0
encoding XML ( экспорт из DW )
    #35540046
ZhV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо.
Автору. Участникам топика.
Всему 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.
// Перевод STRING/Blob  в UTF- 16  
Function integer MultiByteToWideChar(&
UINT       CodePage ,        /* code page */  &
ulong       dwFlags,          /* character-type options  */ &
ref blob    InpMultiByteStr,  /* input blob data */ &
int          inpdatalen,       /* number of bytes in string */ &
ref blob   OutpWideCharStr,  /* wide-character buffer  */ &
int          outpdatalen       /* size of buffer */ )  library "KERNEL32.DLL"
									  

// Перевод из UTF- 16  в char
Function integer WideCharToMultiByte(&
UINT       CodePage,    &
ulong      dwFlags,           /* character-type options  */ &
ref blob   InpWideCharStr,    /* input wide-character blob data */ &
int          inpdatalen,        /* number of bytes in string */ &				
ref blob   OutpMultiByteStr,  /* output blob  buffer  */ &
int         outpdatalen ,      /* size of buffer */   &
ref        string lpDefaultChar,     /* Pointer to the character to use if a wide character cannot be represented in the specified code page. */ &
ref boolean  lpUsedDefaultChar  ) Library "KERNEL32.DLL"
// Для справки : CP_UTF8= 65001   Window- 1251 = 1251 

Код функции
Код: 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.
//of_convert1251(as_input)
//Конвертер из UTF8 в Win1251
Boolean lb_cnv
String ls_ret, ls_def , ls_s ,  ls_marker
Blob  lbl_in , lbl_out
Int i , li_inlen, li_outlen

i =  LEN(as_input)
//Ограничение по длине строки - в половину макс. integer. Если надо больше - по частям
IF i< 1  OR IsNull(i) OR i> 16200   THEN ; Return as_input ; END IF

ls_marker='!1*byt56;z%'

lbl_in = BLOB(as_input+ls_marker+' ') ;  li_inlen = LEN(lbl_in) 

li_outlen =  2 *li_inlen +  1  ; li_inlen += 1  
lbl_out = BLOB(Space(li_outlen+ 2 ))  //Заготовить blob-массив

i = This.MultiByteToWideChar(  65001 ,  0 , lbl_in, li_inlen , lbl_out, li_outlen )
IF i< 0  THEN ; Return as_input ; END IF

SetNull(ls_def) 
lbl_in = lbl_out

i = This.WideCharToMultiByte(  1251 ,  0 , lbl_in, li_outlen , lbl_out , li_outlen , ls_def, lb_cnv)

IF i< 0  THEN ; Return as_input ; END IF 

ls_ret = String(lbl_out)
i=LASTPOS(ls_ret,ls_marker) 
IF i> 1  THEN ;	ls_ret = LEFT(ls_ret, (i -  1 ) ) ; END IF	


Return ls_ret

Кто не понял. Для корректного определения окончания перекодированной строки :
- в конец входной строки добавляется ls_marker из нескольких символов
- после отработки - этот маркер находится в результирующей строке и отрезается.
...
Рейтинг: 0 / 0
encoding XML ( экспорт из DW )
    #35541217
Фотография ChV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть еще один вариант. Работающий. Ранее я этот вариант отверг, т.к. кодировка не менялась. Почему этот вариант работает, а то же самое, но раньше кодировку не меняло - не разбирался. На работе, как всегда, прессинг по времени. Собственно, именно по этой причине я его и не выкладывал - не хорошо, не разобравшись, выкладывать что-то на форум.
Но ... "ложка дорога к обеду". Раз эта проблема мучит и других - вот работающий скрипт :

Код: 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.
OleObject  ole_data, ole_pusto, Pi, eattr
String s_error
	
	
	ole_data = Create OleObject
	rc = ole_data.ConnectToNewObject( "MSXML.DOMDocument" ) 
...
	if rc <>  0  then
......
	end if
	ole_data.validateOnParse = True
	ole_data.async = False
	ole_data.Load( s_file_xml )
	s_error = ole_data.ParseError.SrcText
	if s_error <> '' then
...........
	end if
	Pi = ole_data.firstChild
	eattr = pi.attributes.getNamedItem("encoding")
	if eattr <> ole_pusto then
		Eattr = ole_data.createAttribute("encoding")
		Pi.attributes.setNamedItem(eattr)
		Eattr.value = "Windows-1251"
		ole_data.save( s_file_xml_obr )
	else
.........
	end if
	ole_data.DisconnectObject()
	Destroy ole_data

Good Luck !
...
Рейтинг: 0 / 0
encoding XML ( экспорт из DW )
    #35543097
18-я весна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) ИМХО вот это:
ZhV//Ограничение по длине строки - в половину макс. integer. Если надо больше - по частям

- выдумки, являющиеся следствием того что эти объявления:
ZhVUINT CodePage , /* code page */ &
...
int inpdatalen, /* number of bytes in string */ &
...и т.п. - некорректны (должен быть тип ulong и long в обеих ф-ях)
Так что если этот пример работает (в чем я сомневаюсь), то вы поистине везучий человек :)

2) Кроме того необходимость операции "определения окончания перекодированной строки" весьма спорна. Вместо этого достаточно правильно передавать длину исходной и конечной строки (не в байтах, а в символах). А для этого в свою очередь перед вызовом MultiByteToWideChar/WideCharToMultiByte надо их же вызывать с 0 в качестве длины приемного буфера, что заставит эти ф-и вернуть необходимую длину в символах не выполняя само преобразование.
...
Рейтинг: 0 / 0
encoding XML ( экспорт из DW )
    #35544301
Фотография ChV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
18-я весначто заставит эти ф-и вернуть необходимую длину в символах не выполняя само преобразование.
И кто же их заставит ?
Если бы это работало с этими XML файлами - не было бы печали и столько потраченного времени.
Я, возможно заблуждаюсь, но проблема в том, что в юникоде - только русские символы.
И только они переводятся с юникода в ANSII. Остальные символы не меняются.
Отсюда и некорректное значение возвращаемой длины. Буду рад, если был не прав.
Просьба поправлять - после проверки теории - практикой.

Good Luck !
...
Рейтинг: 0 / 0
encoding XML ( экспорт из DW )
    #35544454
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
encoding XML ( экспорт из DW )
    #35544586
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот как правильно объявлять и использовать эти ф-и:
Код: plaintext
1.
2.
3.
4.
5.
function long MultiByteToWideChar (ulong CodePage,  ulong dwFlags,  readonly string lpMultiByteStr, &
   long cbMultiByte,  ref blob lpWideCharStr,  long cchWideChar) LIBRARY "kernel32.dll"
function long WideCharToMultiByte(ulong CodePage, ulong dwFlags, readonly blob lpWideCharStr, &
   long cchWideChar, ref string lpMultiByteStr, long cchMultiByte, ref string lpDefaultChar, &
   ref boolean lpUsedDefaultChar) LIBRARY "kernel32.dll"
Код: 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.
n_cst_unicode u
long ll_utf8_len, ll_wide_len, ll_ansi_len
String ls_utf8_text = &
   "~hd0~ha7~hd0~hb8~hd1~h82~hd0~hb0~hd0~hb9~hd1~h82~hd0~hb5"+&
   "~h20~hd0~hb4~hd0~hbe~hd0~hba~hd0~hb8~h2e~h20~hd0~h9e~hd0"+&
   "~hbd~hd0~hb8~h20~hd1~h80~hd1~h83~hd0~hbb~hd0~hb5~hd0~hb7~hd0~hb7~h2e"
String ls_ansi_text, ls_defchar
Blob lbb_utf16
Boolean lb_defcharused = false

ll_utf8_len = Len(ls_utf8_text)
ll_wide_len = u.MultiByteToWideChar( 65001 ,  0 , ls_utf8_text, ll_utf8_len , ref lbb_utf16,  0 )
if ll_wide_len >  0  then
    lbb_utf16 = Blob(Space(ll_wide_len *  2 ))
    u.MultiByteToWideChar(  65001 ,  0 , ls_utf8_text, ll_utf8_len , ref lbb_utf16, ll_wide_len)
else
    lbb_utf16 = Blob("")
end if

SetNull(ls_defchar)
ll_ansi_len = u.WideCharToMultiByte( 1251 ,  0 , lbb_utf16, ll_wide_len , ref ls_ansi_text ,  0 , ref ls_defchar, ref lb_defcharused)
if ll_ansi_len >  0  then
    ls_ansi_text = Space(ll_ansi_len)
    u.WideCharToMultiByte( 1251 ,  0 , lbb_utf16, ll_wide_len , ref ls_ansi_text , ll_ansi_len, ref ls_defchar, ref lb_defcharused)
else
    ls_ansi_text = ""
end if
 
MessageBox("", ls_ansi_text)
...
Рейтинг: 0 / 0
encoding XML ( экспорт из DW )
    #35544707
Фотография ChV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как мало пройдено путей. Как много сделано ошибок.
Anatoly MoskovskyВот как правильно ОБЪЯВЛЯТЬ и использовать эти ф-и:
Респект и уважуха.
У меня были указаны другие типы данных. Все остальное было правильно.
Спасибо.

Good Luck !
...
Рейтинг: 0 / 0
encoding XML ( экспорт из DW )
    #35545315
Фотография ChV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может кому-то пригодится:
Немного разобрал и другие варианты изменения кодировки в XML файле.
Действительно, если используешь объект "MSXML.DOMDocument" , как это указано выше,
то при изменении значения encoding на "WINDOWS-1251" кодировка меняется.
Если использовать объекты PBDOM_.... , то одно только изменение значения encoding на "WINDOWS-1251"
( pbdom_processinginstruction ) - не приводит к перекодировке.

Good Luck !
...
Рейтинг: 0 / 0
encoding XML ( экспорт из DW )
    #35553786
Фотография ChV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опять же, может кому-то пригодится:
Использовал объект "MSXML.DOMDocument" и средства PB 9 - PBDOM_.... .
Вывод - "MSXML.DOMDocument" и быстрее, и больше сервиса, который работает ( в отличии от PBDOM_...., где мне так и не удалось заставить отработать функцию RemoveChildElement ).

Good Luck !
...
Рейтинг: 0 / 0
encoding XML ( экспорт из DW )
    #35764295
guest_ansi_utf8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите, как преобразовать обратно? Из ANSI в UTF-8??? Перебрал все варианты, ни как не выходит на PB 6.5.1 такая операция...
...
Рейтинг: 0 / 0
encoding XML ( экспорт из DW )
    #35764307
guest_ansi_utf8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
при вызове
MultiByteToWideChar( 65001, 0, ls_ansi_text, ll_ansi_len , ref lbb_utf16, ll_wide_len)
получается чистый юникод, а не UTF-8 и при этом не правильно перекодируются русские буквы
...
Рейтинг: 0 / 0
encoding XML ( экспорт из DW )
    #35765052
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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

Поэтому обратное также надо делать двумя вызовами (инверсными).
...
Рейтинг: 0 / 0
encoding XML ( экспорт из DW )
    #35765065
Фотография ChV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К сожалению ( а если честно, то к счастью) я с этой проблемой не столкнулся. Мне понравился вариант, который полностью решил мои проблемы - изменение кодировки ( encoding ) в объекте "MSXML.DOMDocument". Конечно, это если у Вас текст - XML. Но если это не так и без MultiByteToWideChar / WideCharToMultiByte не обойтись, то прийдется искать примеры в интернете на VB или CИ.
P.S.
Из того, что когда-то нашел для этих функций:
uint CP_UTF8 = 65001
uint CP_UTF16 = 1200
uint CP_1252 = 1252


Good Luck !
...
Рейтинг: 0 / 0
encoding XML ( экспорт из DW )
    #35765557
guest_ansi_utf8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PBDOM'а нет, так как 6-ая версия PB.

Вообщем я пытаюсь сделать по аналогии с примером выше, в 2 шага:

на вход приходит анси-строка (ls_ansi_text)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
ll_ansi_len = Len(ls_ansi_text)
ll_wide_len = MultiByteToWideChar(  1251 ,  0 , ls_ansi_text, ll_ansi_len , ref lbb_utf16,  0 )
if ll_wide_len >  0  then
	lbb_utf16 = Blob(Space(ll_wide_len *  2 ))
	MultiByteToWideChar(  1251 ,  0 , ls_ansi_text, ll_ansi_len , ref lbb_utf16, ll_wide_len)
else
	lbb_utf16 = Blob("")
end if
				
SetNull(ls_defchar)
ll_utf8_len = WideCharToMultiByte (  65001 ,  0 , lbb_utf16, ll_wide_len , ref ls_utf8_text ,  0 , ref ls_defchar, ref lb_defcharused)				
if ll_utf8_len >  0  then
	ls_utf8_text = Space(ll_utf8_len)
	WideCharToMultiByte (  65001 ,  0 , lbb_utf16, ll_wide_len , ref ls_utf8_text , ll_utf8_len, ref ls_defchar, ref lb_defcharused)
else
	ls_utf8_text = ""
end if

После первого шага все отлично - в блобе lbb_utf16 содержится юникод, а вот на втором шаге ll_utf8_len все время равен 0.
Что я не так делаю?
...
Рейтинг: 0 / 0
encoding XML ( экспорт из DW )
    #35765646
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_ansi_utf8Что я не так делаю?
На первый взгляд все правильно.
...
Рейтинг: 0 / 0
encoding XML ( экспорт из DW )
    #35766414
Фотография ChV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меня смущает реплика
guest_ansi_utf8PBDOM'а нет, так как 6-ая версия PB.
Если это в мой адрес, то, на всякий случай, хочу заметить - надеюсь Вы понимаете, что PBDOM и MSXML - разные объекты.
PBDOM - объект РB. Доступен начиная с PB 9.0.
MSXML - объект от Microsoft. И он доступен любой версии PB.

Good Luck !
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / encoding XML ( экспорт из DW )
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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