Показать сообщение отдельно
Старый 17.12.2013, 02:49   #43  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,867 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от 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;

    }

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

Последний раз редактировалось Logger; 17.12.2013 в 03:11.