09.01.2006, 12:14 | #1 |
Banned
|
Файлы XML, CSV, HTML в кодировке Unicode
Думаю, многим окажутся полезны мои изыскания в области представления текстовых данных в разных кодировках. Итак, задача: сгенерировать из Аксапта файл CSV в кодировке UTF-16.
Одно из решений - это создать промежуточный файл XML в "родной" кодировке Аксапта, а затем с помощью XSL-шаблона превратить его в CSV в соответствующей кодировке. Это достигается следующим выражением xsl: PHP код:
А вот полный текст простого шаблона, который позволяет изменить кодировку XML-файла на желаемую: PHP код:
При этом в Аксапта запустить XSL-шаблон на исполнение, на первый взгляд, исключительно просто: PHP код:
Просто? Не тут-то было. Аксапта, как известно, продукт на чрезвычайно совеременной технологической платформе, и со строками Unicode работать не умеет. По-видимому, уже в момент приема строки-результата из компонента Msxml2.DOMDocument Аксапта преобразовывает результат из Unicode обратно в "родную" 8-битную кодировку. Рекомендованное решение - использовать не метод transformNode(), а метод transformNodeToObject(), который способен писать прямо в поток ADODB.Stream, т.е. писать результат на диск в обход Аксапта. Если разработать простой класс-обертку для ADODB.Stream, то код в Аксапта может выглядеть так: PHP код:
Последний раз редактировалось EVGL; 09.01.2006 в 17:21. |
|
|
За это сообщение автора поблагодарили: mazzy (18), belugin (14), kashperuk (1), zinius (1), alex55 (1), mix2ra (1). |
09.01.2006, 12:36 | #2 |
Участник
|
Спасибо. Добавил респект.
|
|
25.09.2008, 17:26 | #3 |
Участник
|
Добавлю готовый тестовый джоб, для экономии времени желающим что-нибудь выгрузить в нетрадиционной кодировке из Ax 3.0
Задача - выгрузить набор текстовых строк из аксапты в файл нужной кодировки. кодировка указывается в define, в моём случае это ISO-8859-5 (ключевые слова UTF-8, UTF-16 и прочий unicode) X++: #define.FILE('FILE') #define.LINE('LINE') #define.codePage('ISO-8859-5') #define.fileFullName(@'D:\testXML_ISO.txt') static void Test_XML2ISO(Args _args) { XMLDocument doc = XMLDocument::newBlank(); XMLElement file = doc.createElement(#FILE); XMLElement line; int i; str xslt = ' <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> '+ ' <xsl:output omit-xml-declaration="no" method="text" media-type="text/xml" '+ ' indent="no" encoding="'+#codePage+'" /> '+ ' <xsl:template match="'+#LINE+'"> '+ ' <xsl:apply-templates/> '+ ' <xsl:if test="following-sibling::node()"> '+ ' <xsl:text>XXX</xsl:text> '+ ' </xsl:if> '+ ' </xsl:template> '+ ' </xsl:stylesheet> '; void outputXML(XMLDocument _xml) { COM outputStream; XMLDocument xsl = XMLDocument::newXML(xslt); ; outputStream = new COM('ADODB.Stream'); outputStream.type(1); // binary outputStream.open(); _xml.com().transformNodeToObject(xsl.com(), outputStream); outputStream.saveToFile(#fileFullName); outputStream.close(); } ; if (WinAPI::fileExists(#fileFullName)) WinAPI::deleteFile(#fileFullName); doc.appendChild(file); for (i=1; i<=10; i++) { line = doc.createElement(#LINE); line.appendChild(doc.createTextNode(strFmt('line %1 ABCDE АБВГДЕЖЗИКабвгдежзик', i))); file.appendChild(line); } outputXML(doc); info('Готово'); } _;" без кавычек и подчёркивания Также выражаю признательность и большую спасибу EVGL и belugin за полезные подсказки Последний раз редактировалось zinius; 25.09.2008 в 17:46. |
|
|
За это сообщение автора поблагодарили: d_alexe (1). |
16.01.2009, 14:23 | #4 |
Участник
|
Hi, Sorry for using English but my Russian is worse than elementary
I would like to ask if it would be also possible to write to the file an Unicode sign 0x2028 (End of line) XML would always replace this sign as well as new line sign '\n' with the 0x00 What need to be done in order to be able to write 0x2028 directly to the file. Is it possible? We are still using AX 3.0 (I know that in DAX 4 it is possible by using TextIO class) Any clues? Thanks! |
|
Теги |
unicode, xml, кодировка, ax3.0 |
|
|