Jos*_*osh 9 c++ windows unicode stl c++-standard-library
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
在我的整个项目中使用?(不喜欢..)或者什么?
一般来说,你不应该混合这两种编码.但是,异常消息只是开发人员感兴趣的东西(例如在日志文件中),并且永远不应该向用户显示(但请注意Jim的评论中的一个重要警告).
因此,如果您使用UNICODE
整个面向用户的界面并且仍然std::exception
在幕后使用开发人员消息,那么您就安全了.应该没有必要在两者之间进行转换.
此外,在C++中定义typedef
for 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)