фишки MSVC касаемо Unicode Character Set

Тема в разделе "LANGS.C", создана пользователем varnie, 12 янв 2008.

  1. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    здравствуйте, дружыщща.

    нигде не могу информацию о том, как корректно работать с строковыми типами данных в MSVC, чтобы тем самым обеспечить работоспособность кода, перенесенного с одной Студии на другую, имеющую разные настройки проджекта.

    допустим, есть такой кусочег кода:
    Код (Text):
    1. #include "stdafx.h"
    2. #include <afxwin.h>
    3. #include <iostream>
    4.  
    5. using namespace std;
    6.  
    7. int main()
    8. {
    9.    CFileFind finder;
    10.    BOOL bWorking = finder.FindFile(("*.*"));
    11.    while (bWorking)
    12.    {
    13.       bWorking = finder.FindNextFile();
    14.       cout << (LPCTSTR) finder.GetFileName() << endl;
    15.    }
    16.    return 0;
    17. }
    если в св-вах проджекта стоит Character Set: not set;
    то все окей
    если же указать Character Set: use UNICODE Character Set;
    то получаем
    хочу научиться писАть так, чтобы работа с строковыми типами данных в коде корректно работала при _любых_ выставленных "Character Set"-aх у проджектов.

    подскажите пару финтов? спасибо.
     
  2. roman_pro

    roman_pro New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    291
    Использовать TCHAR, который раскрывается в char при ANSI настройках и в wchar при UNICODE.
    Код (Text):
    1. #include <tchar.h>
    2. TCHAR Str[]=_T("some string");
     
  3. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    хорошо, это понятно...
    а если я работаю с MFC классами, как в моем примере выше? кстати, этот пример из MSDN. как его дополнить, чтобы ему были глубоко фиолетовы конкретные выставленные настройки проджекта в плане Character Set?
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    BOOL bWorking = finder.FindFile(_T("*.*"));
     
  5. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    n0name
    уже пробовал.
    в случае, когда в св-вах проджекта указано: Character Set: use UNICODE Character Set
    вместо списка файлов при запуске получаем
     
  6. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    varnie
    Код (Text):
    1. virtual BOOL FindFile(LPCTSTR pstrName = NULL, DWORD dwUnused = 0);
    и вообще, CFileFind работает почти везде с CString, к-рый по сути CStringT
     
  7. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    Код (Text):
    1. #include "stdafx.h"
    2. #include <afxwin.h>
    3. #include <iostream>
    4.  
    5. using namespace std;
    6.  
    7. int _tmain(int argc, _TCHAR* argv[])
    8. {
    9.     CFileFind finder;
    10.     BOOL bWorking = finder.FindFile(TEXT("*.*"));
    11.     while (bWorking)
    12.     {
    13.         bWorking = finder.FindNextFile();
    14.         [b]wcout[/b] << (LPTSTR)finder.GetFileName().GetString() << endl;
    15.     }
    16.     return 0;
    17. }
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    не прокатит если будет multi-byte.
    я бы юзал cout << T2A(finder.GetFileName().GetString()) << endl;
     
  9. flankerx

    flankerx New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2004
    Сообщения:
    423
    Адрес:
    Moscow, Russia
    http://www.tech-archive.net/Archive/VC/microsoft.public.vc.language/2007-07/msg00018.html
    Код (Text):
    1. #ifndef UNICODE
    2. #define STDTCOUT std::cout
    3. #else
    4. #define STDTCOUT std::wcout
    5. #endif
     
  10. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    nobodyzzz
    прогнал при всех разных настройках кодировки проджекта - во всех случаях работает верно.
    n0name
    твой вариант не завелся вообще, хотя я испробовал все 3 параметра для кодировки.
    flankerx
    да, вариант с глобальным дефайном работает. но неужели все так сложно в MS VC королевстве? :-(

    интересно то, что в этом дефолтном примере из MSDN не приведено таки общее решение, учитывающее различные параметры проджекта в плане кодировки.

    моя проблема, что я фактически не знаком вообще со Студией, т.к. все это время писал на чистом C++, игнорируя мир IDE... а сейчас вся эта микрософтовская лабудень с кодировками, миллионами макросов итд меня сбивает с толку.
    подскажите, как с этим подружиться все же?
     
  11. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Так уж получилось. Для std::basic_stream есть перегрузка для преобразования char в wchar_t, а вот наоборот - нет. Поэтому проще использовать во всех случаях std::wcout.

    Не MFC единым живёт человек, есть куча альтернатив.
     
  12. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    IceStudent
    Можно подробней?
    Только не о VCL и QT.
    И ещё можете какие библиотеки посоветовать ,типа буста, для ежедневной рутины.
    Так сказать джентельменский C++ набор библиотек кодера.
     
  13. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Тогда промолчу :)

    Так это зависит от задач, возникающих в процессе "ежедневной рутины", да и оффтоп.
     
  14. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    IceStudent
    эти сведения запомню, спасибо.
    да, это так, и тут сложно и поспорить:)
    но MFC в подавляющем большинстве случаев, равно как и сама Студия, значится в требованиях у контор.
     
  15. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Ну тогда остаётся учить эту либу и пытаться "жить" по её правилам. Так что tchar.h в помощь.