Windows API在UNICODE
上看起来很大,你在Visual C ++中创build一个新项目,默认情况下将它设置为UNICODE
。
而我试图成为一名优秀的Windows程序员,我想使用UNICODE
。
问题是C ++标准库和STL(如std :: string ,或std :: runtime_error )不能很好地处理UNICODE
string。 我只能传递一个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;
…类似地定义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
乔希,
请看看我的答案: 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编码。