C ++ UNICODE和STL

Windows API在UNICODE上看起来很大,你在Visual C ++中创build一个新项目,默认情况下将它设置为UNICODE
而我试图成为一名优秀的Windows程序员,我想使用UNICODE

问题是C ++标准库和STL(如std :: string ,或std :: runtime_error )不能很好地处理UNICODEstring。 我只能传递一个std :: string或一个char* std :: runtime_error ,而且我很确定std :: string不支持UNICODE

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

一般来说,你不应该混合这两种编码。 但是,异常消息只是开发人员感兴趣的东西(例如在日志文件中),绝不应该显示给用户(但是请注意Jim的一个重要的注意事项)。

所以,如果你使用UNICODE作为你的整个用户界面,并且在开发者消息的幕后仍然使用std::exception等,那么你就安全起来了。 应该没有必要在两者之间进行转换。

此外,在C ++中为UNICODE独立的字符串定义一个typedef是一个好方法:

 typedef std::basic_string<TCHAR> tstring; 

…类似地定义tcouttcin等条件:

 #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 

乔希,

请看看我的答案: https : //softwareengineering.stackexchange.com/questions/102205/should-utf-16-be-considered-harmful

越来越多的工程师认为std :: string对于Windows上的unicode来说是完美的,并且是更快地编写便携式和unicode正确程序的正确方法。

看看这个(现在比较老的)CodeProject上的文章: 升级基于STL的应用程序以使用Unicode 。 它涵盖了您在广泛使用STL时可能遇到的问题。 它不应该那么糟糕,一般来说,使用宽字符串是值得的。

要使用Windows Unicode API,只需使用宽字符串版本 – wstring等。它不会帮助exception::what() ,但是如果您确实需要Unicode,则可以使用UTF-8编码。