10

我想使用 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 字符?

4

5 回答 5

6

默认情况下,CRT 会将文件的所有输出视为 ANSI。您可以在程序开始时使用此行更改它

_setmode(_fileno(stdout), _O_WTEXT);

很好的参考@http ://www.siao2.com/2008/03/18/8306597.aspx

仅供参考,双向语言支持在大多数命令提示符中都是有限的,据我了解,这是导致此问题的限制。为什么不/支持它是我无法回答的。

于 2013-02-04T16:51:32.477 回答
4

您不能使用标准 C++ 工具可移植地打印宽字符串。

相反,您可以使用开源 {fmt} 库来便携式打印 Unicode 文本。例如(https://godbolt.org/z/nccb6j):

#include <fmt/core.h>

int main() {
  fmt::print("أَبْجَدِيَّة عَرَبِيَّة‎中文&quot;);
}

印刷

أَبْجَدِيَّة عَرَبِيَّة‎中文

这需要使用/utf-8MSVC 中的编译器选项进行编译。

wcout为了比较,在 Linux ( https://godbolt.org/z/h9WKsY ) 上写入:

std::wcout << L"أَبْجَدِيَّة عَرَبِيَّة‎中文&quot;;

印刷

???????????? ?????????????

除非您将全局语言环境切换为 eg en_US.utf8。Windows 上存在类似的问题,没有标准的方法来修复它(您必须使用非标准 CRT 函数或 Windows API)。

免责声明:我是 {fmt} 的作者。

于 2020-12-29T23:28:46.080 回答
2

我刚读了这篇文章

“总结...

如果您使用 Visual C++,则不能使用 UTF-8 将文本打印到 std::cout。

如果你仍然想,请阅读这篇关于如何使 wcout 和 cout 工作的惊人的长文章,但它并没有真正给出一个简单的解决方案 - 最终落入重新定义流缓冲区......” http://alfps.wordpress .com/2011/12/08/unicode-part-2-utf-8-stream-mode/

(来自这个博客http://blog.cppcms.com/post/105

于 2013-02-10T00:55:08.047 回答
1

你可以试试这个:

我假设您能够仅呈现中文文本。这表示你有中文字体文件。

您请尝试仅使用阿拉伯语文本。如果您能够渲染,则表示您的系统中有阿拉伯字体。

但是当你混合使用阿拉伯文 + 中文时,你需要强制选择一个包含两个字形集的字体文件。我认为 wcout 拾取的默认字体文件没有阿拉伯字形。

我假设你可能会得到阿拉伯 unicode 的盒子。

于 2013-02-14T19:55:21.643 回答
1
#include <iostream>
#include <io.h>
#include <fcntl.h>

int main() {
    _setmode(_fileno(stdout), _O_U16TEXT); // or _O_WTEXT
    std::wcout << L"أَبْجَدِيَّة عَرَبِيَّة‎中文" << std::endl;
}

http://www.cplusplus.com/forum/beginner/126557/

于 2017-11-03T03:43:45.263 回答