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 Кб, 988 просмотров)
__________________
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).
Старый 02.12.2005, 16:57   #6  
Atani is offline
Atani
Участник
 
77 / 15 (1) ++
Регистрация: 25.07.2003
Адрес: г. Королёв М.О.
Спасибо!
Старый 24.11.2010, 18:11   #7  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от AndyD Посмотреть сообщение
Рискну предложить свой вариант на основе виндовых функций
спасибо за код.

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

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

X++:
buf.string(0, _utf8);
Может быть поэтому ? Ошибка при работе с binary в Ax2009
Старый 24.11.2010, 19:29   #9  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 432 (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.
Старый 24.11.2010, 20:10   #10  
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   #11  
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);
Старый 01.08.2011, 09:35   #12  
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 работает корректно, но хотелось бы на сервере добиться работы.
Заранее спасибо.
Старый 01.08.2011, 10:08   #13  
pedrozzz is offline
pedrozzz
Молодой, подающий надежды
Аватар для pedrozzz
MCBMSS
Лучший по профессии 2015
 
164 / 218 (8) ++++++
Регистрация: 18.02.2010
Адрес: Краснодар
Цитата:
Сообщение от GBH Посмотреть сообщение
А как добиться работы данного кода на сервере?
Быть может так получится:
X++:
static void Job31(Args _args)
{
    FileName                fileName      = @'C:\Test.txt';
    Set                     permissionSet = new set(Types::Class);
    System.Text.Encoding    encoding;
    System.IO.StreamWriter  file;
    #File
    ;

    permissionSet.add(new FileIOPermission(fileName, #io_write));
    permissionSet.add(new InteropPermission(InteropKind::ClrInterop));

    CodeAccessPermission::assertMultiple(permissionSet);

    try
    {
        encoding = System.Text.Encoding::get_UTF8();
        file     = new System.IO.StreamWriter(fileName, true, encoding);

        file.WriteLine("Привет из Axapta на сервере");

        file.Close();
    }
    catch
    {
        error(AifUtil::getClrErrorMessage());
    }

    CodeAccessPermission::revertAssert();
}
За это сообщение автора поблагодарили: Logger (3).
Старый 01.08.2011, 23:22   #14  
jonny is offline
jonny
Участник
Аватар для jonny
Самостоятельные клиенты AX
 
217 / 124 (5) +++++
Регистрация: 10.02.2006
Адрес: СПб-Екб-?
Класс TextIo позволяет задавать кодировку, используется так же как AsciiIo
http://msdn.microsoft.com/en-us/libr...=ax.50%29.aspx
За это сообщение автора поблагодарили: someOne (5).
Старый 02.08.2011, 08:36   #15  
GBH is offline
GBH
MCITP
Аватар для GBH
MCP
MCBMSS
Ex AND Project
 
140 / 28 (1) +++
Регистрация: 28.06.2007
Цитата:
Сообщение от pedrozzz Посмотреть сообщение
Быть может так получится:
X++:
static void Job31(Args _args)
{
    FileName                fileName      = @'C:\Test.txt';
    Set                     permissionSet = new set(Types::Class);
    System.Text.Encoding    encoding;
    System.IO.StreamWriter  file;
    #File
    ;

    permissionSet.add(new FileIOPermission(fileName, #io_write));
    permissionSet.add(new InteropPermission(InteropKind::ClrInterop));

    CodeAccessPermission::assertMultiple(permissionSet);

    try
    {
        encoding = System.Text.Encoding::get_UTF8();
        file     = new System.IO.StreamWriter(fileName, true, encoding);

        file.WriteLine("Привет из Axapta на сервере");

        file.Close();
    }
    catch
    {
        error(AifUtil::getClrErrorMessage());
    }

    CodeAccessPermission::revertAssert();
}
Спасибо за ответ!
К сожалению, всё также как и у меня.

X++:
 (08:35:07)
 "CLRObject"    
      "C:\Test.txt".
Старый 02.08.2011, 08:39   #16  
GBH is offline
GBH
MCITP
Аватар для GBH
MCP
MCBMSS
Ex AND Project
 
140 / 28 (1) +++
Регистрация: 28.06.2007
Цитата:
Сообщение от jonny Посмотреть сообщение
Класс TextIo позволяет задавать кодировку, используется так же как AsciiIo
http://msdn.microsoft.com/en-us/libr...=ax.50%29.aspx

Спасибо за информацию!
Но мне хочется разобраться именно с вариантом NET.
Старый 02.08.2011, 08:40   #17  
pedrozzz is offline
pedrozzz
Молодой, подающий надежды
Аватар для pedrozzz
MCBMSS
Лучший по профессии 2015
 
164 / 218 (8) ++++++
Регистрация: 18.02.2010
Адрес: Краснодар
У меня работает. Проверьте, есть ли у AOS доступ к каталогу.
За это сообщение автора поблагодарили: GBH (1).
Старый 02.08.2011, 09:31   #18  
mayk is offline
mayk
Участник
Аватар для mayk
 
43 / 65 (3) ++++
Регистрация: 07.03.2008
Цитата:
Сообщение от pedrozzz Посмотреть сообщение
У меня работает. Проверьте, есть ли у AOS доступ к каталогу.
Windows с включенным UAC очень не любит когда в корень пишут файлы.
К примеру в 7-ке не получится просто так создать файл в корне даже из под учетки с админскими правами. Получится только если запускать приложения по правому клику "запускать от имени администратора"
Старый 02.08.2011, 12:36   #19  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 432 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Цитата:
Сообщение от GBH Посмотреть сообщение
А как добиться работы данного кода на сервере?
У меня ругается на InteropPermission.
Для избежания этой ошибки в начале метода достаточно вставить

X++:
new InteropPermission(InteropKind::ClrInterop).assert();
Обсуждалось неоднократно...
Старый 02.08.2011, 14:02   #20  
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).
Теги
.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, время: 23:18.