AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.12.2013, 15:07   #41  
DreamCreator is offline
DreamCreator
Moderator
Аватар для DreamCreator
Axapta Retail User
 
553 / 45 (3) +++
Регистрация: 04.11.2004
Адрес: Казань
:)
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Ну а если "руками" дописать этот BOM (0xEF 0xBB 0xBF) в файл перед конвертированными данными?..
Вот только что так и сделал На C# написал консольное приложение, которое принимает путь к файлу, который надо переконвертировать в UTF-8 и в него же записывает результат с BOM:
X++:
 static void Main(string[] args)
        {
            string path = args[0];            
                
            System.Text.Encoding encodingUTF = System.Text.Encoding.UTF8;
            System.Text.Encoding encodingWin = System.Text.Encoding.ASCII;

            string content = "";

            using (FileStream fs = File.Open(path, FileMode.Open))
            {
                StreamReader sr = new StreamReader(fs, Encoding.Default);
                content = sr.ReadToEnd();
            }

            using (FileStream fsw = File.OpenWrite(path))
            {
                Byte[] info = new UTF8Encoding(true).GetBytes(content);

                fsw.WriteByte(0xEF);
                fsw.WriteByte(0xBB);
                fsw.WriteByte(0xBF);

                fsw.Write(info, 0, info.Length);
            }
        }
Почему-то работает гораздо быстрее чем линуксовый конвертер recode )
Старый 07.12.2013, 22:37   #42  
handy-comp is offline
handy-comp
Участник
 
96 / 78 (3) ++++
Регистрация: 27.09.2012
Попробуйте такой вариант, насколько помню работал, у самого нет под рукой 3-ки проверить:
X++:
    Com objStream = new Com('ADODB.Stream');
    ;
    
    objStream.CharSet('utf-8');
    objStream.Open();
    objStream.WriteText('тест');
    objStream.SaveToFile(@'c:\test.txt');
    objStream.Close();
За это сообщение автора поблагодарили: DreamCreator (3), Alenka (1).
Старый 17.12.2013, 02:49   #43  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 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.
Старый 17.12.2013, 11:13   #44  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Решение нашлось

X++:
//pkoz 17.12.2013
server static str oem2Char(str strSource)
{
    str     ret;

    System.Text.Encoding    encAnsi;
    System.Text.Encoding    enc866;

    System.Byte[]           bytesAnsi;
    System.Byte[]           bytes;
    ;
    new InteropPermission(InteropKind::ClrInterop).assert();

    encAnsi     = System.Text.Encoding::get_Default();
    enc866      = System.Text.Encoding::GetEncoding(866);

    bytesAnsi   = encAnsi.GetBytes( strSource );
    
    bytes = System.Text.Encoding::Convert(enc866, encAnsi, bytesAnsi);
    ret = encAnsi.GetString(bytes);
    return ret;
}
За это сообщение автора поблагодарили: gl00mie (7), demoded (2),  (1).
Старый 17.12.2013, 11:21   #45  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
X++:
    str dos2win(str _source, int _srcCodePage = 866, int _destCodePage = 1251)
    {
        System.Text.Encoding    encodingSource  = System.Text.Encoding::GetEncoding(_srcCodePage);    
        System.Text.Encoding    encodingDest    = System.Text.Encoding::GetEncoding(_destCodePage);        
        System.Byte[]           buff            = encodingSource.GetBytes(_source);        
        str                     dest            = encodingDest.GetString(buff);
        return  dest;
    }
UPD: Упс, опередили)
__________________
За это сообщение автора поблагодарили: Logger (10), Ace of Database (3), Weez (3).
Старый 09.07.2014, 09:29   #46  
demianimp is offline
demianimp
Участник
 
202 / 104 (4) +++++
Регистрация: 10.10.2013
А как кодеровку менять в AX 3 ?
Старый 09.05.2015, 10:37   #47  
Russland is offline
Russland
MCTS
Аватар для Russland
MCBMSS
 
267 / 116 (4) +++++
Регистрация: 17.10.2005
Адрес: Донеччина, Україна
Полезно для экспорта csv в utf8 daxdilip: Tip - How to write to utf-8 encoding format using CommaTextIo Class
__________________

В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню
Теги
.net, ansi, ascii, cp866, utf8, законченный пример, полезное

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Создание текстового файла в кодировке DOS Pismarkina DAX: Программирование 5 18.06.2012 14:57
Файлы XML, CSV, HTML в кодировке Unicode EVGL DAX: База знаний и проекты 3 16.01.2009 14:23
Вывод отчета в файл в пакетном режиме Egor_bl DAX: Программирование 16 09.10.2006 19:10
Отчет записать сразу как RTF файл st_msav DAX: Программирование 2 17.01.2006 18:52
считать/записать данные в файл Valia DAX: Программирование 7 19.11.2003 11:59

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 06:07.