C++ UNICODE和STL

Jos*_*osh 9 c++ windows unicode stl c++-standard-library

Windows API看起来很重要UNICODE,您在Visual C++中创建了一个新项目,UNICODE默认情况下将其设置为.
我想成为一名优秀的Windows程序员,我想使用它UNICODE.

问题是C++标准库和STL(例如std :: stringstd :: runtime_error)不能很好地处理UNICODE字符串.我只能传递std :: string,或者传递char*std :: runtime_error,我很确定std :: string不支持UNICODE.

所以我的问题是,我应该如何使用诸如std :: runtime_error之类的东西?我应该UNICODE和常规混合ANSI吗?(我认为这是一个坏主意......)
只是ANSI在我的整个项目中使用?(不喜欢..)或者什么?

Kon*_*lph 9

一般来说,你不应该混合这两种编码.但是,异常消息只是开发人员感兴趣的东西(例如在日志文件中),并且永远不应该向用户显示(但请注意Jim的评论中的一个重要警告).

因此,如果您使用UNICODE整个面向用户的界面并且仍然std::exception在幕后使用开发人员消息,那么您就安全了.应该没有必要在两者之间进行转换.

此外,在C++中定义typedeffor UNICODE-independent字符串是一个很好的技巧:

typedef std::basic_string<TCHAR> tstring;
Run Code Online (Sandbox Code Playgroud)

...和类似定义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
Run Code Online (Sandbox Code Playgroud)

  • 我认为有一个论点是,对于像日志文件这样的情况,你应该使用Unicode字符串.日志文件通常将用户数据与系统数据混合,用户数据很可能包含Unicode内容.您可以始终假设ANSI异常,但一个很好的异常可能包括文件路径(对于文件未找到异常,可以说),该路径可能包含Unicode字符). (3认同)