【发布时间】:2018-01-30 05:56:27
【问题描述】:
在 C++ 中用于完整 unicode 的正确工具是什么?
例如,我试过:
int main()
{
std::wstring name;
std::wcout << "Enter unicode: " << std::endl;
std::getline(std::wcin, name);
std::wcout << name << std::endl;
return 0;
}
当输入字符时,它并没有像我预期的那样工作:????或其他不在 Unicode BMP 中的内容。我得到一个空行打印出来。
纯字符串适用于最高 16 位的任何代码点,wstring、wcin、wcout 无法按我的预期工作,并且一些谷歌搜索并没有帮助我了解这可能是什么错误。
编辑(文件 I/O 也有问题!):
我想知道这是否与控制台 I/O 本身有关,并想尝试对文件 I/O 进行相同的实验。我查看了 api 并想出了编译和运行良好的这个:
int main()
{
std::string filename;
std::cout << "Enter file to append to: " << std::endl;
std::getline(std::cin, filename);
std::wifstream file;
std::wstringstream buff;
file.open(filename);
std::wstring txt;
buff << file.rdbuf();
file.close();
txt = buff.str();
std::wcout << txt << std::endl;
return 0;
}
但是当我将它指向我的文件时,它主要包含 lorem ipsum 和一些非 BMP 字符,它会将文件打印到第一个非 BMP 字符,然后提前停止。现代 C++ 中的 Unicode 设施真的可以这么糟糕吗?
我确定有人知道我在这里缺少的一些基本知识...
【问题讨论】:
-
谢谢老爷。我在 debian 上寻找平台中立的解决方案,纯 C++ 解决方案。此链接似乎提供了一个非常特定于 Windows 的答案。
-
您应该为 Unicode 字符串文字使用 L 前缀:std::wcout
-
好的,好的提示。在这种情况下不会影响我的错误。
-
它确实最终取决于输出流。例如,默认情况下,Windows 不支持标准控制台中的完整 unicode 字符集。 stackoverflow.com/questions/388490/… 所以你必须添加一些平台相关的调整。