Инициализация класса

Тема в разделе "LANGS.C", создана пользователем cresta, 1 сен 2007.

  1. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    cresta
    Что-то здесь не так. Если строки в сорцах в кодировке win1251, а ты выводишь их в консоль — естесственно, что кодировка не та будет, если в консоли не win1251. Надо либо набирать строки в консольной кодировке, либо преобразовывать их при выводе. Если уж ты хочешь исправить вывод, то определяй консольную кодировку через GetConsoleOutputCP.
     
  2. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    В консоли я посмотрел - там GetConsoleOutputCP возвращает DOS codepage 866, что соответствует WIN codepage 1251.
    Данные у меня из базы берутся, там тоже utf8, но отбражаются почему-то неправильно.
    Я просто данные пропустил через CharToOem, и всё выводится в читабельном виде:

    Код (Text):
    1. int __cdecl printf(const char * format, ...){
    2.     char szBuff[2048];
    3.     char oemBuff[2048];
    4.     int retValue;
    5.     DWORD cbWritten;
    6.     va_list argptr;
    7.          
    8.     va_start( argptr, format );
    9.     retValue = wvsprintf( szBuff, format, argptr );
    10.     va_end( argptr );
    11.  
    12.     oemBuff[0]=0;
    13.     CharToOem ( szBuff, oemBuff );
    14.    
    15.     WriteFile(  GetStdHandle(STD_OUTPUT_HANDLE), oemBuff, retValue,
    16.                 &cbWritten, 0 );
    17.  
    18.     return retValue;
    19. }
     
  3. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Cresta
    В консоли cp-866
    используй libiconv c gnu.org
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    wsd

    Я наоборот хочу избавиться от разного рода либ или свести их количество и размеры к минимуму :)
    В принципе меня не тяготит вызвать одну функцию. Это проще, чем пристегивать ещё одну либу.
     
  5. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Cresta
    Эта либа тебе на всю жизнь пригодится!
    Она из любой кодировки в любую выжимает!!!
    Мож её статически или динамически пристёгиать!!!
    Там в принципе не код а чистые таблицы кодировок...
    А API вообще мизерный.

    Пробуй.
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Я к тому, что если в консоли будет отличная от 866 кодировка, то твоя прога будет в пролёте. Чтобы это не случилось, используй перекодирование с учётом кодовой страницы:
    Код (Text):
    1. MultiByteToWideChar(CP_ACP, src, src_len, middle_buf...);
    2. WideCharToMultiByte(GetConsoleOutputCP(), middle_buf, -1, out_buf...);
    3. printf(out_buf);
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    мож лучше SetConsoleOutputCP просто?
     
  8. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    IceStudent

    Вон ты о чём. Понял.

    n0name
    Пробовал устанавливать через SetConsoleOutputCP - ничего не меняется. Хотя и смысла никакого не было - кодировка то верная. Ввод правильно воспроизводится, вывод - кракозяблы. Хотя и для ввода и для вывода установлена одинаковая кодировка (сравнивал результат от GetConsoleCP и GetConsoleOutputCP). Только CharToOem нормально отображает.

    wsd
    Ок, попробую.