C++;UNICODE和STL Windows API看起来很大,在代码> Unicode < /Code >,您在VisualC++中做了一个新项目,默认情况下它设置为 Unicode < /Code >。 我想成为一名优秀的Windows程序员,我想使用UNICODE 问题是C++标准库和STL(比如STD::string,或者STD::RunTimeOrthError)与 Unicode 字符串不太好。 我只能将std::string或char*传递给std::runtime\u错误,并且我非常确定std::string不支持UNICODE

C++;UNICODE和STL Windows API看起来很大,在代码> Unicode < /Code >,您在VisualC++中做了一个新项目,默认情况下它设置为 Unicode < /Code >。 我想成为一名优秀的Windows程序员,我想使用UNICODE 问题是C++标准库和STL(比如STD::string,或者STD::RunTimeOrthError)与 Unicode 字符串不太好。 我只能将std::string或char*传递给std::runtime\u错误,并且我非常确定std::string不支持UNICODE,c++,windows,unicode,stl,c++-standard-library,C++,Windows,Unicode,Stl,C++ Standard Library,所以我的问题是,我应该如何使用诸如std::runtime\u error之类的东西?我应该混合使用UNICODE和常规的ANSI吗?(我认为这是个坏主意…… 在我的整个项目中使用ANSI?(不喜欢…)或者什么?要使用Windows Unicode API,只需使用宽字符串版本-wstring等。它对异常::what()没有帮助,但是如果您确实需要Unicode,您可以使用UTF-8编码。一般来说,您不应该混合使用这两种编码。但是,异常消息只是开发人员感兴趣的东西(例如,在日志文件中),不应该向

所以我的问题是,我应该如何使用诸如std::runtime\u error之类的东西?我应该混合使用UNICODE和常规的ANSI吗?(我认为这是个坏主意……

在我的整个项目中使用ANSI?(不喜欢…)或者什么?

要使用Windows Unicode API,只需使用宽字符串版本-wstring等。它对
异常::what()
没有帮助,但是如果您确实需要Unicode,您可以使用UTF-8编码。

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

因此,如果您在整个面向用户的界面中使用
UNICODE
,而在后台仍然使用
std::exception
等作为开发人员消息,那么您是安全的。应该永远不需要在两者之间转换

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

typedef std::basic_string<TCHAR> tstring;
看看这篇关于CodeProject的文章(现在已经相当老了)。它涵盖了广泛使用STL时可能遇到的问题。它不应该那么糟糕,一般来说,使用宽字符串是值得的。

Josh

请看我的回答:


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

他们是例外,您认为您需要对它们进行国际化,并且确实需要unicode支持吗?您可以在整个过程中使用
std::wstring
<代码>std::runtime_error是一个不幸的例外(没有双关语!)。可能与@Björn相关,但不是重复。另一个问题的答案是关于使用
char*
存储UTF-8。这在这里没有帮助,因为WinAPI使用
wchar\u t
和UTF-16,所以答案无法调整。理想情况下,Windows将更新为支持UTF-8语言环境,并在默认情况下开始使用。我认为有一个论点是,对于日志文件之类的情况,应该使用Unicode字符串。日志文件通常将用户数据与系统数据混合在一起,用户数据很可能包含Unicode内容。您可以总是假设ANSI异常,但是一个好的异常可能包括一个文件路径(比如说,对于一个未找到的文件异常),并且该路径可能包括Unicode字符)。但是,如果我希望向用户显示错误消息,以便他们报告/识别问题,该怎么办?编辑:和吉姆·兰姆说的差不多。@Josh不幸的是,这是为数不多的几个需要转换的案例之一,例如,使用.Hmm,这篇文章已经非常过时了。例如,它说,
wchar\u t
无符号short
的typedef,这会导致重载问题。这在现代编译器上是不正确的。
#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