AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.12.2005, 12:58   #1  
Atani is offline
Atani
Участник
 
77 / 15 (1) ++
Регистрация: 25.07.2003
Адрес: г. Королёв М.О.
записать файл в UTF-кодировке
Здравствуйте!

Требуется из Аксапты создавать текстовый файл в кодировке UTF-8 (Обычный asciiio создаёт файл в windows-1251). Как такое сотворить?

Возможно, кто-нибудь знает способ перекодироки "на лету" или внешнюю утилиту перекодировки, которую можно было бы запустить программно сразу после создания файла
Старый 02.12.2005, 13:23   #2  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Можно по такой схеме: Axapta -> XML -> XSLT -> CSV
Старый 02.12.2005, 13:53   #3  
Atani is offline
Atani
Участник
 
77 / 15 (1) ++
Регистрация: 25.07.2003
Адрес: г. Королёв М.О.
Это мой запасной вариант :-)

Только почему нельзя пропустить фазу XSLT?
Разве не достаточно будет XMLDocument.save(filename); ?
Старый 02.12.2005, 14:05   #4  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Можно. Если вы создаете XML.
Старый 02.12.2005, 14:12   #5  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Рискну предложить свой вариант на основе виндовых функций
Вложения
Тип файла: zip UTF8.zip (1.3 Кб, 986 просмотров)
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: slava (1), Logger (5), Ace of Database (5), DreamCreator (3), kvg6 (3), gl00mie (5), ivas (1), xenikk (1), Just_smile (1), Vasil (1), freezok (1).
Старый 24.11.2010, 18:11   #6  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от AndyD Посмотреть сообщение
Рискну предложить свой вариант на основе виндовых функций
спасибо за код.

странно в 2009-й функция Utf2Ansi() валится с ошибкой "Метод вызван с недопустимыми параметрами" на вызове

X++:
buf.string(0, _utf8);
Старый 24.11.2010, 18:15   #7  
someOne is offline
someOne
Участник
Аватар для someOne
 
173 / 429 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Цитата:
странно в 2009-й функция Utf2Ansi() валится с ошибкой "Метод вызван с недопустимыми параметрами" на вызове

X++:
buf.string(0, _utf8);
Может быть поэтому ? Ошибка при работе с binary в Ax2009
Старый 24.11.2010, 19:29   #8  
someOne is offline
someOne
Участник
Аватар для someOne
 
173 / 429 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Еще - в Ax2009, наверное, лучше делать так (через NET):
X++:
static void Job31(Args _args)
{
    System.IO.StreamWriter file;
    ;
    file = new System.IO.StreamWriter("C:\\Test.txt", true, System.Text.Encoding::get_UTF8());
    file.WriteLine("Привет из Axapta");
    file.Close();
}
Гарантировано не будет проблем, например, при запуске на стороне сервера.
Замечал, что не все низкоуровневые api функции работают на стороне сервера.
Может проблема в том что операционная система сервера 64 bit ?
Наверное поэтому все серверные вызовы api (класс WinApiServer) переделаны на NET в axapta 2009.
Старый 01.08.2011, 09:35   #9  
GBH is offline
GBH
MCITP
Аватар для GBH
MCP
MCBMSS
Ex AND Project
 
140 / 28 (1) +++
Регистрация: 28.06.2007
Цитата:
Сообщение от someOne Посмотреть сообщение
Еще - в Ax2009, наверное, лучше делать так (через NET):
X++:
static void Job31(Args _args)
{
    System.IO.StreamWriter file;
    ;
    file = new System.IO.StreamWriter("C:\\Test.txt", true, System.Text.Encoding::get_UTF8());
    file.WriteLine("Привет из Axapta");
    file.Close();
}
Гарантировано не будет проблем, например, при запуске на стороне сервера.
Замечал, что не все низкоуровневые api функции работают на стороне сервера.
Может проблема в том что операционная система сервера 64 bit ?
Наверное поэтому все серверные вызовы api (класс WinApiServer) переделаны на NET в axapta 2009.
А как добиться работы данного кода на сервере?
У меня ругается на InteropPermission.
Пытался применить,то что написано здесь, но не помогает.
http://msdn.microsoft.com/en-us/library/bb190039.aspx
Видимо руки кривые.


static client работает корректно, но хотелось бы на сервере добиться работы.
Заранее спасибо.
Старый 18.01.2012, 12:01   #10  
Just_smile is offline
Just_smile
Участник
Axapta Retail User
 
41 / 29 (1) +++
Регистрация: 28.10.2008
Цитата:
Сообщение от AndyD Посмотреть сообщение
Рискну предложить свой вариант на основе виндовых функций
У меня на тройке этот вариант не работает - в UTF8 выводятся кракозябры:
ABCDEFGabcdefgАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдежзийклмнопрстуфхцчшщьыъэюя123

ABCDEFGabcdefgАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдежзийклмнопрстуфхцчшщьыъэюя123

ABCDEFGabcdefgАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдежзийклмнопрстуфхцчшщьыъэюя123
Старый 20.06.2012, 17:50   #11  
freezok is offline
freezok
Участник
 
4 / 10 (1) +
Регистрация: 18.06.2012
Цитата:
Сообщение от AndyD Посмотреть сообщение
Рискну предложить свой вариант на основе виндовых функций
Спасибо! Но есть одно но, класс плохо себя ведет со скобочками и цивфрами после 4-ки, а точнее добавляет после этих символов кряказябры... Как быть в таких случаях?
Пример:
На входе
ABCDEFGabcdefgАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдежзийклмнопрстуфхцчшщьыъэюя123(
Ны выходе
ABCDEFGabcdefgАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдежзийклмнопрстуфхцчшщьыъэюя123(Џ

Последний раз редактировалось freezok; 20.06.2012 в 17:53.
Старый 21.06.2012, 09:36   #12  
freezok is offline
freezok
Участник
 
4 / 10 (1) +
Регистрация: 18.06.2012
Решил проблему добавлением пустоты в конце строки(проблема была толко если символ скобка или цифры 4-9 были в конце строки)
Старый 02.12.2005, 16:57   #13  
Atani is offline
Atani
Участник
 
77 / 15 (1) ++
Регистрация: 25.07.2003
Адрес: г. Королёв М.О.
Спасибо!
Старый 24.11.2010, 20:10   #14  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Угу, насчет .NET согласен.
Вот так можно без промежуточных файлов работать с UTF8
X++:
{
    System.Text.UTF8Encoding    UTF8Encoding;
    System.Byte[]               bytes;
    System.Byte[]               utf8;
    int i;
    int len;
    int val;
    Binary  bin;
    ;
    UTF8Encoding = new System.Text.UTF8Encoding();
    bytes = UTF8Encoding.GetBytes("Строка UTF8");
    len = bytes.get_Length();
    bin = new Binary(len);
    for (i=0;i<len;i++)
    {
        val = bytes.GetValue(i);
        bin.byte(i, val);
    }
    info(bin.string(0));
    
    utf8 = new System.Byte[len]();
    for (i=0;i<len;i++)
        utf8.SetValue(System.Convert::ToByte(bin.byte(i)), i);

    info(UTF8Encoding.GetString(utf8));
}
По сути вопроса - возможно, проблемы из-за того, что строки теперь юникодные и преобразование на каком-то этапе идет неправильно.
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: Logger (5), Sergey Petrov (1).
Старый 24.11.2010, 23:58   #15  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Ещё простой вариант:

X++:
    TextBuffer      textBuffer;
    ;
    
    textBuffer = new TextBuffer();
    textBuffer.setText("Строка");
    textBuffer.toFile(@"C:\utf8.txt", FileEncoding::UTF8);
Старый 17.12.2013, 02:49   #16  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от AndyD Посмотреть сообщение
Угу, насчет .NET согласен.
Вот так можно без промежуточных файлов работать с UTF8
...
По сути вопроса - возможно, проблемы из-за того, что строки теперь юникодные и преобразование на каком-то этапе идет неправильно.
Спасибо.
Попробовал применить такой подход для строчек - не получилось
В чем может быть проблема ?
Изначально задача стояла переписать на .Net функции

X++:
client static str oem2CharBuff(str strSource)
{
    DLL          winApiDLL      = new DLL( #UserDLL );
    DLLFunction  oemToCharBuff  = new DLLFunction( winApiDLL, @'OemToCharBuffA');
    Binary       bSource        = new Binary( strSource );
    str          ret;
    ;

    oemToCharBuff.returns( ExtTypes::DWORD );
    oemToCharBuff.arg( ExtTypes::POINTER, ExtTypes::POINTER, ExtTypes::DWord );
    oemToCharBuff.call( bSource, bSource, strlen(strSource) );
    ret = bSource.string(0);

    return ret;
}
X++:
client static str char2OEM(str strSource)
{
    DLL         _winApiDLL  = new DLL('USER32');
    DLLFunction _CharToOEM  = new DLLFunction(_winApiDLL, 'CharToOemA');
    Binary       bSource    = new Binary(strSource);
    str          oemstr;
    ;

    _CharToOEM.returns(ExtTypes:: DWORD);
    _CharToOEM.arg(ExtTypes::POINTER,
                   ExtTypes::POINTER);
    _CharToOEM.call(bSource, bSource);
    oemstr = bSource.string(0);

    return oemstr;
}
и

X++:
client static str oem2Char(str strSource)
{
    DLL         _winApiDLL  = new DLL('USER32');
    DLLFunction _CharToOEM  = new DLLFunction(_winApiDLL, 'OemToCharA');
    Binary       bSource    = new Binary(strSource);
    str          winstr;
    ;

    _CharToOEM.returns(ExtTypes:: DWORD);
    _CharToOEM.arg(ExtTypes::POINTER,
                   ExtTypes::POINTER);
    _CharToOEM.call(bSource, bSource);
    winstr = bSource.string(0);

    return winstr;
}
Но почему-то не получается.
Попробовал вот так :
X++:
static void Unicode2ANSI_5(Args _args)
{
//    str                     unicodeStr;
    System.Text.Encoding    encAnsi;
    System.Byte[]           bytesAnsi;
    System.Byte             byte;
    str                     byteStr;
    Counter                 len;
    Counter                 n;
    asciiio                 file = SysDataIntegration::openFile(@"c:\_\ttt.txt", "R", ";");
    container               con;
    System.Text.Encoding                encoding;
    System.Text.Encoding                encoding866;
    System.Text.Encoding                encodingUTF;
    System.Text.Encoding                encodingAnsi;
    System.Byte[]                       tmp;
    System.String                       ss;
    str                                 s;
    str                                 ret;
    ;
    New InteropPermission(InteropKind::ClrInterop).assert();
    while (file.status() == IO_Status::Ok)
    {
        con = file.read();
        s = conPeek(con,1);
        ss = s;

        //encodingUTF = System.Text.Encoding::get_Unicode();
        encodingUTF = System.Text.Encoding::get_UTF8();
        encoding866 = System.Text.Encoding::GetEncoding(866);
        //encoding866 = System.Text.Encoding::get_ASCII();


        tmp = encoding866.GetBytes(ss);

        tmp = System.Text.Encoding::Convert(encoding866, encodingUTF, tmp);

        ret = encodingUTF.GetString(tmp);
        
        info(strFMT("%1  <--->  %2 <---> %3 ",
            conPeek(con,1),
            winapi::oem2CharBuff( conPeek(con,1) ),
            ret
            ));
            
        break;

    }

}
не получается.
В файле лежит строка
Цитата:
1. Кодировка
в досовской кодировке. В ansi это выглядит так :
Цитата:
1. Љ®¤Ёа®ўЄ 
- задачка получить в Аксапте строчку
Цитата:
1. Кодировка
и не
Цитата:
1. Љ®¤Ёа®ўЄ 
Причем желательно оформить код в виде функции, принимающей строку, т.е. не использующей работу с файлом.
Процитированный джобик вывел что-то типа
Цитата:
4. Љ®¤Ёа®ўЄ  <---> 4. Кодировка <---> 4. ?R¤ЁаRўЄ 
т.е. процитированная выше функция oem2CharBuff написанная через вызов dll - работает, а .net вариант - нет. Т.е. написан ошибочно.

Последний раз редактировалось Logger; 17.12.2013 в 03:11.
Старый 02.08.2011, 14:02   #17  
plumbum is offline
plumbum
Участник
Соотечественники
 
182 / 86 (3) ++++
Регистрация: 07.12.2007
Адрес: Vienna, AT
Я бы все таки сделал так:
X++:
    FileName    fileName;
    str         fileContent;
    ;
    
    new InteropPermission(InteropKind::ClrInterop).assert();
    
    System.IO.File::WriteAllText(fileName, fileContent, System.Text.Encoding::get_UTF8());
    
    CodeAccessPermission::revertAssert();
таким образом не надо освобождать файл методом Close() и нигде не хранятся ссылки на .NET объекты, которые потом АОС должен освобождать.

Удачи
__________________
http://www.axdevposts.blogspot.com
Пришел, уведел.... отойди, дай другому увидеть!
За это сообщение автора поблагодарили: someOne (2).
Старый 03.08.2011, 09:55   #18  
GBH is offline
GBH
MCITP
Аватар для GBH
MCP
MCBMSS
Ex AND Project
 
140 / 28 (1) +++
Регистрация: 28.06.2007
Вопрос, возможно, глупый, но не могу разобраться. :-(
Всё работает как и надо.
Только перед записью, мне необходимо удалить файл. Использую WinAPIServer::deleteFile(fileName)

X++:
Set                     permissionSet = new set(Types::Class);
....
permissionSet.add(new FileIOPermission(fileName, #io_write));
permissionSet.add(new InteropPermission(InteropKind::ClrInterop));

CodeAccessPermission::assertMultiple(permissionSet);

if(WinAPIServer::fileExists(fileName))  
{
    WinAPIServer::deleteFile(fileName);
}
Получаю ошибку
Цитата:
Сбой запроса на разрешение типа "FileIOPermission".
(S)\Classes\FileIOPermission\demand
(S)\Classes\WinAPIServer\fileExists - line 14
Функция WinAPI отрабатывает без проблем. Права на папку все даны. Папка серверная.

Что я делаю нет?
Заранее спасибо.
Старый 03.08.2011, 10:12   #19  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
WinAPI::fileExists()
__________________
Axapta v.3.0 sp5 kr2
Старый 03.08.2011, 10:22   #20  
GBH is offline
GBH
MCITP
Аватар для GBH
MCP
MCBMSS
Ex AND Project
 
140 / 28 (1) +++
Регистрация: 28.06.2007
Цитата:
Сообщение от AndyD Посмотреть сообщение
Спасибо.
Но я написал
Цитата:
Функция WinAPI отрабатывает без проблем.
. Но мне, для пакетной обработки, требуется использование WinAPIServer.
Теги
.net, ansi, ascii, cp866, utf8, законченный пример, полезное

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Создание текстового файла в кодировке DOS Pismarkina DAX: Программирование 5 18.06.2012 14:57
Файлы XML, CSV, HTML в кодировке Unicode EVGL DAX: База знаний и проекты 3 16.01.2009 14:23
Вывод отчета в файл в пакетном режиме Egor_bl DAX: Программирование 16 09.10.2006 19:10
Отчет записать сразу как RTF файл st_msav DAX: Программирование 2 17.01.2006 18:52
считать/записать данные в файл Valia DAX: Программирование 7 19.11.2003 11:59

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 10:44.