【问题标题】:How to use Unicode in C++ Setfill()如何在 C++ Setfill() 中使用 Unicode
【发布时间】:2020-12-15 04:23:26
【问题描述】:

更新 #2: Unicode 不能用于 Setfill。现在正在寻找替代品。

感谢所有帮助过的人!

更新:感谢 jkb,我意识到我正在使用指针。但是,现在我仍然坚持如何将 unicode 放入char 以便在SetFill() 中使用。这是我的新问题。


原问题:

我正在尝试为我的 Setfill() 使用 Unicode Character,但我不明白为什么这不起作用。 Setfill() 想要一个 Char,而 'line' 是一个在 std::cout 中显示得很好的 Char。但是我收到错误:“setfill 的字符类型错误”

char line = u8"\u2501";

cout << setfill(line) << setw(10) << "┛"; // 错误:setfill 的字符类型错误

cout << line << endl; // 正确显示行

我已经搜索了与在 Setfill 中使用 Unicode 相关的内容,但我没有看到任何接近我需要的内容。上面的代码我试过了,直接粘贴了这个字符:Setfill('━'),但是还是不行。

如果我被卡住了,我希望能向正确的方向点头。

提前谢谢你!


编辑:我已经根据jkb所说的更改了第一行代码:

line 不是 char 类型,它是 char *(指针)类型。 – jkb

以前是这样的:

const char* line = u8"\u2501";

【问题讨论】:

  • line 不是char 类型,它是char *(指针)类型。
  • u8"\u2501"char8_t[4],而不是 char,并且无法将 Unicode 字符传递给它,因为代码点 > 127 需要超过 1 个字节

标签: c++ unicode


【解决方案1】:

如果要输出宽字符,需要使用wostream。

std::wcout << std::setfill(L'\u2501') << std::setw(10) << L'\u251b' << std::endl;

应该做你想做的。

您可能需要在 Linux 上正确设置语言环境:

std::setlocale(LC_ALL, "");

在尝试输出任何内容之前调用main。没有这个,它将使用不支持 unicode 的默认 C 语言环境。

【讨论】:

  • 我已尝试使用它,但我仍然不会在控制台上显示此行中的任何内容。我现在会更多地研究wcout 以进行故障排除。谢谢克里斯。
  • 试试 std::wcout
  • 即使是宽流,您也可能无法处理 BMP 之外的字符
【解决方案2】:

Unicode 有多种格式。 UTF-8 是一种将大多数典型英文字符编码为单个字节的格式。但是,要对数以万计的 Unicode 字符中的许多字符进行编码,需要的不仅仅是一个字节。

但是,setfill() 会适应它所使用的流。 cout 不是宽字符(UTF-16、16 位、2 字节)流。所以你选择的角色不合适。

在另一个答案中提供。以下代码可能会满足您的需求。

std::wcout << std::setfill(L'\u2501') << std::setw(10) << L'\u251b' << std::endl;

函数wcoutcout的宽字符版本。

【讨论】:

  • 感谢您指定 Setfill 不能与 Unicode 一起使用。我还是 C++ 的新手,所以我认为我可以做一些事情来让它工作或强制它。我现在会寻找替代方案。另外,我正在为此在 Windows 而不是 Linux 上工作,对此感到抱歉。我没想过在我的问题中包含这个。
  • 根据 Chris Dodd 的出色意见更正了我的答案。
  • "16 位,2 字节" 这取决于实现。
  • 没有“Unicode-8”或“Unicode-16”这样的东西。 Unicode 只是一个字符集,即从数字(称为代码点)到字形的映射。该数字以各种方式(编码)编码,称为 UTF-1、7、8、9、16、32...
  • 是否有将 cout 用于 UTF-16 的实现?我没有意识到这一点。你有一个例子吗?我不得不承认我的大部分经验是在 Windows 和一些 8 位嵌入式系统上的。 (根据 phuclv 的评论更正了 UTF/Unicode 术语的评论)。谢谢 phuclv。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
  • 2013-09-23
  • 2016-04-16
  • 1970-01-01
  • 2013-07-10
  • 2013-08-19
  • 1970-01-01
相关资源
最近更新 更多