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