12

为什么

cout<< "привет";

运作良好,而

wcout<< L"привет";

才不是?(在 Qt Creator for linux 中)

4

1 回答 1

16

GCC 和 Clang 默认将源文件视为 UTF-8。您的 Linux 终端很可能也配置为 UTF-8。因此,cout<< "привет"在 UTF-8 终端中打印了一个 UTF-8 字符串,一切都很好。

wcout<< L"привет"取决于适当的区域设置配置,以便将宽字​​符转换为终端的字符编码。需要初始化语言环境才能进行转换(默认的“经典”又名“C”语言环境不知道如何转换宽字符)。用于std::locale::global (std::locale (""))Locale 以匹配环境配置或std::locale::global (std::locale ("en_US.UTF-8"))使用特定的 Locale(类似于此 C 示例)。

这是工作程序的完整来源:

#include <iostream>
#include <locale>
using namespace std;
int main() {
  std::locale::global (std::locale ("en_US.UTF-8"));
  wcout << L"привет\n";
}

g++ test.cc && ./a.out这个打印“привет”(在 Debian Jessie 上)。

另请参阅此答案,了解在标准输出中使用宽字符的危险。

于 2013-09-07T17:25:08.547 回答