9

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

问题是 C++ 标准库和 STL(例如std::stringstd::runtime_error)不适用于UNICODE字符串。我只能将std::string或 achar*传递给std::runtime_error,而且我很确定std::string不支持UNICODE

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

4

4 回答 4

9

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

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

typedef此外,在 C++ 中定义一个与 forUNICODE无关的字符串是一个很好的技巧:

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
于 2012-03-08T19:37:43.610 回答
2

乔希,

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

越来越多的工程师认为 std::string 非常适合 Windows 上的 unicode,并且是更快编写可移植和 unicode 正确程序的正确方法。

于 2012-03-10T18:49:19.363 回答
1

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

于 2012-03-08T19:37:52.833 回答
0

要使用 Windows Unicode API,只需使用宽字符串版本 - wstring 等。它对 Unicode 没有帮助exception::what(),但如果你真的需要 Unicode,你可以使用 UTF-8 编码。

于 2012-03-08T19:35:49.887 回答