02.12.2005, 12:58 | #1 |
Участник
|
записать файл в UTF-кодировке
Здравствуйте!
Требуется из Аксапты создавать текстовый файл в кодировке UTF-8 (Обычный asciiio создаёт файл в windows-1251). Как такое сотворить? Возможно, кто-нибудь знает способ перекодироки "на лету" или внешнюю утилиту перекодировки, которую можно было бы запустить программно сразу после создания файла |
|
02.12.2005, 13:23 | #2 |
Banned
|
Можно по такой схеме: Axapta -> XML -> XSLT -> CSV
|
|
02.12.2005, 13:53 | #3 |
Участник
|
Это мой запасной вариант :-)
Только почему нельзя пропустить фазу XSLT? Разве не достаточно будет XMLDocument.save(filename); ? |
|
02.12.2005, 14:05 | #4 |
Banned
|
Можно. Если вы создаете XML.
|
|
02.12.2005, 14:12 | #5 |
Участник
|
Рискну предложить свой вариант на основе виндовых функций
__________________
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 |
Участник
|
Спасибо!
|
|
24.11.2010, 18:11 | #7 |
Участник
|
|
|
24.11.2010, 18:15 | #8 |
Участник
|
Цитата:
странно в 2009-й функция Utf2Ansi() валится с ошибкой "Метод вызван с недопустимыми параметрами" на вызове
X++: buf.string(0, _utf8); |
|
24.11.2010, 19:29 | #9 |
Участник
|
Еще - в 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 |
Участник
|
Угу, насчет .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 |
Боец
|
Ещё простой вариант:
X++: TextBuffer textBuffer; ; textBuffer = new TextBuffer(); textBuffer.setText("Строка"); textBuffer.toFile(@"C:\utf8.txt", FileEncoding::UTF8); |
|
01.08.2011, 09:35 | #12 |
MCITP
|
Цитата:
Сообщение от 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 |
Молодой, подающий надежды
|
Быть может так получится:
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 |
Участник
|
Класс TextIo позволяет задавать кодировку, используется так же как AsciiIo
http://msdn.microsoft.com/en-us/libr...=ax.50%29.aspx |
|
|
За это сообщение автора поблагодарили: someOne (5). |
02.08.2011, 08:36 | #15 |
MCITP
|
Цитата:
Сообщение от 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 |
MCITP
|
Цитата:
Сообщение от jonny
Класс TextIo позволяет задавать кодировку, используется так же как AsciiIo
http://msdn.microsoft.com/en-us/libr...=ax.50%29.aspx Спасибо за информацию! Но мне хочется разобраться именно с вариантом NET. |
|
02.08.2011, 08:40 | #17 |
Молодой, подающий надежды
|
У меня работает. Проверьте, есть ли у AOS доступ к каталогу.
|
|
|
За это сообщение автора поблагодарили: GBH (1). |
02.08.2011, 09:31 | #18 |
Участник
|
Windows с включенным UAC очень не любит когда в корень пишут файлы.
К примеру в 7-ке не получится просто так создать файл в корне даже из под учетки с админскими правами. Получится только если запускать приложения по правому клику "запускать от имени администратора" |
|
02.08.2011, 12:36 | #19 |
Участник
|
|
|
02.08.2011, 14:02 | #20 |
Участник
|
Я бы все таки сделал так:
X++: FileName fileName; str fileContent; ; new InteropPermission(InteropKind::ClrInterop).assert(); System.IO.File::WriteAllText(fileName, fileContent, System.Text.Encoding::get_UTF8()); CodeAccessPermission::revertAssert(); Удачи
__________________
http://www.axdevposts.blogspot.com Пришел, уведел.... отойди, дай другому увидеть! |
|
|
За это сообщение автора поблагодарили: someOne (2). |