C++ UNICODE and STL

C++ UNICODE and STL

本文关键字:STL and UNICODE C++      更新时间:2023-10-16

Windows API在UNICODE上似乎很大,您可以在Visual C++中创建一个新项目,默认情况下它会将其设置为UNICODE
我想成为一名优秀的Windows程序员,我想使用UNICODE

问题是C++标准库和STL(如std::stringtd::runtime_error)不能很好地与UNICODE字符串配合使用。我只能将std::stringchar*传递给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

Josh,

请看一下我的答案: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编码。