我想使用wcout显示混有中文的阿拉伯语消息。
以下代码没问题:
#include <iostream>
using namespace std;
int main()
{
wcout.imbue(locale("chs"));
wcout << L"中文"; // OK
}
但是,以下代码不起作用:
#include <iostream>
using namespace std;
int main()
{
wcout.imbue(locale(/* What to place here ??? */));
wcout << L"أَبْجَدِيَّة عَرَبِيَّة中文"; // Output nothing. VC++ 2012 on Win7 x64
// Why does the main advantage of unicode not apply here?
}
我认为在采用unicode之后,不应该弃用代码页的概念。
Q1。 wout显示这样一个文本的机制是什么?
Q2。为什么Windows作为基于unicode的操作系统不支持在其控制台窗口中输出unicode字符?
答案 0 :(得分:7)
默认情况下,CRT会将所有输出文件视为ANSI。你可以在程序开头用这一行改变它
_setmode(_fileno(stdout), _O_WTEXT);
一个很好的参考@ http://www.siao2.com/2008/03/18/8306597.aspx
仅供参考双向语言支持在大多数命令提示中受到限制,据我所知,这是导致此问题的限制。它不被/不支持的原因是我无法回答的。
答案 1 :(得分:4)
您无法使用标准 C++ 工具可移植地打印宽字符串。
相反,您可以使用 the open-source {fmt} library 可移植地打印 Unicode 文本。例如 (https://godbolt.org/z/nccb6j):
#include <fmt/core.h>
int main() {
fmt::print("أَبْجَدِيَّة عَرَبِيَّة中文");
}
印刷品
أَبْجَدِيَّة عَرَبِيَّة中文
这需要使用 MSVC 中的 /utf-8
编译器选项进行编译。
为了比较,在 Linux (https://godbolt.org/z/h9WKsY) 上写入 wcout
:
std::wcout << L"أَبْجَدِيَّة عَرَبِيَّة中文";
印刷品
???????????? ?????????????
除非您将全局语言环境切换为例如en_US.utf8
。 Windows 上也存在类似的问题,没有标准的方法来修复它(您必须使用非标准的 CRT 函数或 Windows API)。
免责声明:我是 {fmt} 的作者。
答案 2 :(得分:3)
我刚读过这篇文章
“摘要......
如果使用Visual C ++,则无法使用UTF-8将文本打印到std :: cout。
如果您仍然想要,请阅读这篇关于如何使wcout和cout正常运行的这篇令人惊讶的文章,但它并没有真正提供一个简单的解决方案 - 最终重新定义了流缓冲区...“ http://alfps.wordpress.com/2011/12/08/unicode-part-2-utf-8-stream-mode/
答案 3 :(得分:1)
你可以试试这个:
我假设您只能渲染中文文本。这表示您有中文字体文件。
请尝试使用仅限阿拉伯语的文字。如果您能够渲染,则表示您的系统中有阿拉伯字体。
但是当你混合使用阿拉伯语+中文时,你需要强制选择一个包含两个字形集的字体文件。我认为wcout拾取的默认字体文件没有阿拉伯字形。
我认为你可能会获得阿拉伯语unicodes的盒子。
答案 4 :(得分:0)
#include <iostream>
#include <io.h>
#include <fcntl.h>
int main() {
_setmode(_fileno(stdout), _O_U16TEXT); // or _O_WTEXT
std::wcout << L"أَبْجَدِيَّة عَرَبِيَّة中文" << std::endl;
}