UTF-8与cpp案例所需的解释

Not*_*ist 8 c++ utf-8 visual-studio

我在Windows 7 64bit上安装了Microsoft Visual Studio 2010.(在项目属性中,"字符集"设置为"未设置",但每个设置都会导致相同的输出.)

源代码:

  using namespace std;
  char const charTest[] = "árvízt?r? tükörfúrógép ÁRVÍZT?R? TÜKÖRFÚRÓGÉP\n";
  cout << charTest;
  printf(charTest);
  if(set_codepage()) // SetConsoleOutputCP(CP_UTF8); // *1
    cerr << "DEBUG: set_codepage(): OK" << endl;
  else
    cerr << "DEBUG: set_codepage(): FAIL" << endl;
  cout << charTest;
  printf(charTest);
Run Code Online (Sandbox Code Playgroud)

*1:包括windows.h弄乱东西,所以我从一个单独的cpp中包含它.

已编译的二进制文件包含字符串作为正确的UTF-8字节序列.如果我将控制台设置为带有chcp 65001和发出的UTF-8 type main.cpp,则字符串会正确显示.

测试(控制台设置为使用Lucida Console字体):

D:\dev\user\geometry\Debug>chcp
Active code page: 852

D:\dev\user\geometry\Debug>listProcessing.exe
?írv??zt??r?? t??k?Ârf??r??g??p ?üRV??ZT??R?É T??K??RF?ÜR?ôG?ëP
?írv??zt??r?? t??k?Ârf??r??g??p ?üRV??ZT??R?É T??K??RF?ÜR?ôG?ëP
DEBUG: set_codepage(): OK
??rv??zt??r?? t??k??rf??r??g??p ??RV??ZT??R?? T??K??RF??R??G??P
árvízt?r? tükörfúrógép ÁRVÍZT?R? TÜKÖRFÚRÓGÉP
Run Code Online (Sandbox Code Playgroud)

这背后的解释是什么?我可以以某种方式要求cout工作printf吗?

附件

许多人说Windows控制台根本不支持UTF-8字符.我是匈牙利的匈牙利人,我的Windows设置为英语(日期格式除外,它们设置为匈牙利语),西里尔字母仍然与匈牙利字母一起正确显示:

同时在控制台上的匈牙利语和西里尔字母

(我的默认控制台代码页是CP852)

Ser*_*lov 4

这里的区别在于 C++ 运行时和 C 库处理系统区域设置的方式。

要使用 std::cout 获得相同的结果,您可以尝试std::ios::imbue方法和std::locale

但这里描述了 utf-8 和 C++ 的主要问题

C++03 提供两种字符串文字。第一种包含在双引号内,生成 const char 类型的以 null 结尾的数组。第二种定义为 L"",生成 const wchar_t 类型的空终止数组,其中 wchar_t 是宽字符。这两种文字类型都不支持 UTF-8、UTF-16 或任何其他类型的 Unicode 编码的字符串文字。

所以无论如何,它都是特定于实现的,因此不可移植,因为标准 C++ 输出流无法理解 utf-8。


归档时间:

查看次数:

1327 次

最近记录:

9 年,6 月 前