C ++ UNICODE и STL - PullRequest
       22

C ++ UNICODE и STL

9 голосов
/ 08 марта 2012

Windows API кажется большим на UNICODE, вы создаете новый проект в Visual C ++ и он устанавливает его на UNICODE по умолчанию.
И я пытаюсь быть хорошим программистом Windows, я хочу использовать UNICODE.

Проблема в том, что стандартная библиотека C ++ и STL (такие как std :: string или std :: runtime_error ) не работают должным образомUNICODE строк.Я могу только передать std :: string или char* в std :: runtime_error , и я уверен, что std :: string не делаетне поддерживает UNICODE.

Итак, мой вопрос, как мне использовать такие вещи, как std :: runtime_error ?Стоит ли смешивать UNICODE и обычный ANSI?(Я думаю, что это плохая идея ...)
Просто использовать ANSI во всем моем проекте?(предпочитаю не ..) Или что?

Ответы [ 4 ]

9 голосов
/ 08 марта 2012

В общем, вы не должны смешивать эти две кодировки.Однако сообщения об исключениях представляют интерес только для разработчика (например, в файлах журналов) и никогда не должны показываться пользователю (но обратите внимание на комментарий Джима для получения важной оговорки).

Таким образом, вы в безопасности, если вы используете UNICODE для всего пользовательского интерфейса и все еще используете std::exception и т. Д. За кулисами для сообщений разработчиков.Не должно быть необходимости когда-либо конвертировать между ними.

Кроме того, это хороший прием для определения typedef для UNICODE -независимых строк в C ++:

typedef std::basic_string<TCHAR> tstring;

…и аналогично определить tcout, tcin и т. д. условно:

#ifdef UNICODE
    std::wostream& tcout = std::wcout;
    std::wostream& tcerr = std::wcerr;
    std::wostream& tclog = std::wclog;
    std::wistream& tcin = std::wcin;
#else
    std::ostream& tcout = std::cout;
    std::ostream& tcerr = std::cerr;
    std::ostream& tclog = std::clog;
    std::istream& tcin = std::cin;
#endif
2 голосов
/ 10 марта 2012

Josh

Пожалуйста, посмотрите мой ответ здесь: https://softwareengineering.stackexchange.com/questions/102205/should-utf-16-be-considered-harmful

Растет число инженеров, которые считают, что std :: string просто идеально подходит для Unicode в Windows и является правильным способом писать переносимые и Unicode-правильные программы быстрее.

1 голос
/ 08 марта 2012

Взгляните на эту (довольно старую) статью о CodeProject: Обновление приложения на основе STL для использования Unicode . В нем рассматриваются проблемы, которые могут возникнуть, если вы широко используете STL. Это не должно быть так плохо, и, вообще говоря, стоит использовать широкие строки.

0 голосов
/ 08 марта 2012

Чтобы работать с Windows Unicode API, просто используйте широкие строковые версии - wstring и т. Д. С exception::what() это не поможет, но для этого вы можете использовать кодировку UTF-8, если вам действительно нужен Unicode.

...