|
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). |
24.11.2010, 18:11 | #6 |
Участник
|
|
|
24.11.2010, 18:15 | #7 |
Участник
|
Цитата:
странно в 2009-й функция Utf2Ansi() валится с ошибкой "Метод вызван с недопустимыми параметрами" на вызове
X++: buf.string(0, _utf8); |
|
24.11.2010, 19:29 | #8 |
Участник
|
Еще - в 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 |
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 работает корректно, но хотелось бы на сервере добиться работы. Заранее спасибо. |
|
18.01.2012, 12:01 | #10 |
Участник
|
У меня на тройке этот вариант не работает - в UTF8 выводятся кракозябры:
ABCDEFGabcdefgАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдежзийклмнопрстуфхцчшщьыъэюя123 ABCDEFGabcdefgАБВГДЕЖЗРЙКЛМНОПРСТУФХЦЧШЩЬЫЪРЮЯабвгдежзийклмнопрстуфхцчшщьыъэюя123 ABCDEFGabcdefgАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдежзийклмнопрстуфхцчшщьыъэюя123 |
|
20.06.2012, 17:50 | #11 |
Участник
|
Спасибо! Но есть одно но, класс плохо себя ведет со скобочками и цивфрами после 4-ки, а точнее добавляет после этих символов кряказябры... Как быть в таких случаях?
Пример: На входе ABCDEFGabcdefgАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдежзийклмнопрстуфхцчшщьыъэюя123( Ны выходе ABCDEFGabcdefgАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдежзийклмнопрстуфхцчшщьыъэюя123(Џ Последний раз редактировалось freezok; 20.06.2012 в 17:53. |
|
21.06.2012, 09:36 | #12 |
Участник
|
Решил проблему добавлением пустоты в конце строки(проблема была толко если символ скобка или цифры 4-9 были в конце строки)
|
|
02.12.2005, 16:57 | #13 |
Участник
|
Спасибо!
|
|
24.11.2010, 20:10 | #14 |
Участник
|
Угу, насчет .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 |
Боец
|
Ещё простой вариант:
X++: TextBuffer textBuffer; ; textBuffer = new TextBuffer(); textBuffer.setText("Строка"); textBuffer.toFile(@"C:\utf8.txt", FileEncoding::UTF8); |
|
17.12.2013, 02:49 | #16 |
Участник
|
Цитата:
Попробовал применить такой подход для строчек - не получилось В чем может быть проблема ? Изначально задача стояла переписать на .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. Кодировка
Цитата:
1. Љ®¤Ёа®ўЄ
Цитата:
1. Кодировка
Цитата:
1. Љ®¤Ёа®ўЄ
Процитированный джобик вывел что-то типа Цитата:
4. Љ®¤Ёа®ўЄ <---> 4. Кодировка <---> 4. ?R¤ЁаRўЄ
Последний раз редактировалось Logger; 17.12.2013 в 03:11. |
|
02.08.2011, 14:02 | #17 |
Участник
|
Я бы все таки сделал так:
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). |
03.08.2011, 09:55 | #18 |
MCITP
|
Вопрос, возможно, глупый, но не могу разобраться. :-(
Всё работает как и надо. Только перед записью, мне необходимо удалить файл. Использую 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 Что я делаю нет? Заранее спасибо. |
|
03.08.2011, 10:12 | #19 |
Участник
|
__________________
Axapta v.3.0 sp5 kr2 |
|
03.08.2011, 10:22 | #20 |
MCITP
|
|
|