如何在C++中打印UTF-8字符?

5

1
取决于您使用的字体,是Unix还是Windows,以及您是编写控制台还是GUI API。 - John Knoeller
跨平台控制台,最好的翻译 - y2k
这些字符不属于ASCII字符集,这意味着在打印它们之前您必须选择包含它们的字体。对于控制台应用程序,没有跨平台的方法来选择字体。我认为在Windows上根本无法做到这一点。 - John Knoeller
3个回答

3
只需将适当的字节输出到终端,并确保终端使用UTF-8编码来显示您的数据。C++本身相对于UTF8不太敏感,它只是一个uint_8数组。
(除非您想在带有UTF-8的字符串上使用某种字符定向操作。那么您需要使用UTF-8操作函数,而不是数组索引和常规字符串操作例程。)
例如:sprintf("%c%c%c\n", 0xE2, 0x99, 0xA0);

1

嗯,你知道这是可能的,因为你的浏览器可以渲染它们。在Windows上,你可以使用charmap.exe小程序来发现它们的Unicode代码点:

  • ♠ = 0x2660
  • ♣ = 0x2663
  • ♥ = 0x2665
  • ♦ = 0x2666

挑战在于让C/C++程序显示它们。除非你使用类似Qt或wxWidgets这样的跨平台UI库,否则以任何非平台特定的方式都不可能实现。在Windows图形用户界面程序中,你可以在WM_PAINT消息处理程序中这样做:

  case WM_PAINT: {
      hdc = BeginPaint(hWnd, &ps);
      HFONT hFont = CreateFont(16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, L"Arial Unicode MS");
      HGDIOBJ oldFont = SelectObject(hdc, hFont);
      RECT rc = {0, 0, 666, 16};
      DrawTextEx(hdc, L"\x2660\x2663\x2665\x2666", -1, &rc, DT_LEFT, 0);
      SelectObject(hdc, oldFont);
      DeleteObject(hFont);
      EndPaint(hWnd, &ps);
    }
    break;

0
在 C++ 中: std::wcout << L"wstr [" << wstr << L']' << std::endl;
在 C 中: printf("%ls\n\n",wstr);

5
wchar_t不能保证是UTF-16编码,它肯定不会是UTF-8编码。 - jamesdlin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接