在C++中定义Unicode时映射格式说明符?

在C++中定义Unicode时映射格式说明符?,c++,windows,format-specifiers,tchar,C++,Windows,Format Specifiers,Tchar,当_tprintf映射到wprintf时,是否将格式说明符%s映射到%ls 我使用_T宏将字符串映射到ASCII或Unicode,具体取决于是否定义了_Unicode 但是,像_tprintf%s、_ttextstring这样的调用给我带来了麻烦,因为定义_UNICODE时类型不一致 我认为%ls应该用于Unicode字符串 定义了_UNICODE后,如何将%s直接映射到%ls?有没有像“T”这样的奇特功能?解决方案是不使用“tprintf”,而是使用std::wcout wcout同时支持an

当_tprintf映射到wprintf时,是否将格式说明符%s映射到%ls

我使用_T宏将字符串映射到ASCII或Unicode,具体取决于是否定义了_Unicode

但是,像_tprintf%s、_ttextstring这样的调用给我带来了麻烦,因为定义_UNICODE时类型不一致

我认为%ls应该用于Unicode字符串


定义了_UNICODE后,如何将%s直接映射到%ls?有没有像“T”这样的奇特功能?

解决方案是不使用“tprintf”,而是使用std::wcout

wcout同时支持ansi字符和wchar\t字符 wcout比XXXprintf更安全,因为它知道应该打印什么样的参数以避免像printf%s,'a'这样的失败; 它是可移植的,而tprintf不是 它是多态的,可以与其他流(如fstream)一起工作,而tprintf则不是。 xxxcout的唯一缺点是它倾向于使可执行文件膨胀一点,并且比printf系列慢一点,但我真的认为它在你的应用程序中会是一个真正的缺点

放弃PrtTF类函数,支持C++流。< /P> 但是,像_tprintf%s、_ttextstring这样的调用会导致 麻烦,因为定义_UNICODE时类型不一致

您还应将_tdecorator用于第一个字符串文字,即_tprint的格式说明符字符串:

这在ANSI版本中扩展为:

printf("%s", "text string"); // %s maps to char* ANSI string
wprintf(L"%s", L"text string"); // %s maps to wchar_t* Unicode string
并且在Unicode版本中:

printf("%s", "text string"); // %s maps to char* ANSI string
wprintf(L"%s", L"text string"); // %s maps to wchar_t* Unicode string

说%s应该已经匹配了_T的行为,并给出了覆盖该行为的公式。那么wcout打印ASCII和Unicode没有问题吗?那为什么要用cout呢?如果定义了UNICODE,wcout是否会映射到类似于tprintf的东西?@NicolasLykkeIversen:那么为什么要使用cout呢?因为大多数非微软世界使用UTF-8,他们的wchar\u t是一个完整的4字节。如果定义了UNICODE,wcout是否会映射到类似于\u tprintf的东西?它使用重载,它是一个C++机制,与许多其他的人一起完成通用代码,所以如果在同一个C++程序中有一个ASCII字符串和一个Unicode字符串,那么WcOutt就应用到像WcOUT这样的字符串,这就是:STD::W%s关于%ls说明符呢?%s对于Unicode是否足够?@NicolasLykkeIversen:在Unicode版本中,%s映射到wchar\u t*Unicode字符串。在ANSI版本中,%s映射到char*ANSI字符串。就这么简单。或者我在您的问题中遗漏了什么?那么%ls和%S用于什么?%s说明符在wprint上下文中被解释为Unicode,而在printf上下文中被解释为ASCII?或者编译器正在做一些特殊的事情?还有,_T和_tprintf是特定于Windows的吗?@NicolasLykkeIversen:是的,_T和_tprintf是特定于Windows的,就像它们所属的所谓TCHAR模型一样。在现代C++/Win32代码中,我建议只使用Unicode,并避免TCHAR模型的复杂性,这是为了与过时的ANSI版本保持向后兼容性。