|
|
#1 |
|
Участник
|
записать файл в UTF-кодировке
Здравствуйте!
Требуется из Аксапты создавать текстовый файл в кодировке UTF-8 (Обычный asciiio создаёт файл в windows-1251). Как такое сотворить? Возможно, кто-нибудь знает способ перекодироки "на лету" или внешнюю утилиту перекодировки, которую можно было бы запустить программно сразу после создания файла |
|
|
|
|
#2 |
|
Banned
|
Можно по такой схеме: Axapta -> XML -> XSLT -> CSV
|
|
|
|
|
#3 |
|
Участник
|
Это мой запасной вариант :-)
Только почему нельзя пропустить фазу XSLT? Разве не достаточно будет XMLDocument.save(filename); ? |
|
|
|
|
#4 |
|
Banned
|
Можно. Если вы создаете XML.
|
|
|
|
|
#5 |
|
Участник
|
Рискну предложить свой вариант на основе виндовых функций
__________________
Axapta v.3.0 sp5 kr2 |
|
|
|
| За это сообщение автора поблагодарили: ivas (1), xenikk (1), gl00mie (5), slava (1), Logger (5), Just_smile (1), freezok (1), DreamCreator (3), Vasil (1), kvg6 (3), Ace of Database (5), PMS (1). | |
|
|
#6 |
|
Участник
|
Спасибо!
|
|
|
|
|
#7 |
|
Участник
|
|
|
|
|
|
#8 |
|
Участник
|
Цитата:
странно в 2009-й функция Utf2Ansi() валится с ошибкой "Метод вызван с недопустимыми параметрами" на вызове
X++: buf.string(0, _utf8); |
|
|
|
|
#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. |
|
|
|
|
#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). | |
|
|
#11 |
|
Боец
|
Ещё простой вариант:
X++: TextBuffer textBuffer;
;
textBuffer = new TextBuffer();
textBuffer.setText("Строка");
textBuffer.toFile(@"C:\utf8.txt", FileEncoding::UTF8); |
|
|
|
|
#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 работает корректно, но хотелось бы на сервере добиться работы. Заранее спасибо. |
|
|
|
|
#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). | |
|
|
#14 |
|
Участник
|
Класс TextIo позволяет задавать кодировку, используется так же как AsciiIo
http://msdn.microsoft.com/en-us/libr...=ax.50%29.aspx |
|
|
|
| За это сообщение автора поблагодарили: someOne (5). | |
|
|
#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". |
|
|
|
|
#16 |
|
MCITP
|
Цитата:
Сообщение от jonny
Класс TextIo позволяет задавать кодировку, используется так же как AsciiIo
http://msdn.microsoft.com/en-us/libr...=ax.50%29.aspx Спасибо за информацию! Но мне хочется разобраться именно с вариантом NET.
|
|
|
|
|
#17 |
|
Молодой, подающий надежды
|
У меня работает. Проверьте, есть ли у AOS доступ к каталогу.
|
|
|
|
| За это сообщение автора поблагодарили: GBH (1). | |
|
|
#18 |
|
Участник
|
Windows с включенным UAC очень не любит когда в корень пишут файлы.
К примеру в 7-ке не получится просто так создать файл в корне даже из под учетки с админскими правами. Получится только если запускать приложения по правому клику "запускать от имени администратора" |
|
|
|
|
#19 |
|
Участник
|
|
|
|
|
|
#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). | |