C ++ 11给我们带来了UTF-8字面量的u8前缀,几年前我认为这很酷,并在代码中添加了以下内容:
std::string myString = u8"?";
Run Code Online (Sandbox Code Playgroud)
一切都很好,但是在C ++ 20中出现了问题,因为u8创建了char8_t *,并且与仅使用char的std :: string不兼容,因此似乎不再可以编译了。
我应该创建一个新的utf8string吗?在C ++ 20世界中,如果我们有更显式的类型与标准std :: string完全不匹配,那么一致的正确方法是什么?
我有一个用 C++17 编写的代码库,它大量使用 UTF-8,以及u8c++11 中引入的字符串文字来指示 UTF 编码。然而,c++20 将C++ 中u8文字的含义从生成 a charor更改const char*为 a char8_tor const char8_t*;后者不能隐式指针转换为const char*.
我希望这个项目能够支持在 C++17 和 C++20 模式下运行而不会出现中断;可以采取什么措施来支持这一点?
目前,该项目使用的char8别名使用文字的类型结果u8:
// Produces 'char8_t' in C++20, 'char' in anything earlier
using char8 = decltype(u8' ');
Run Code Online (Sandbox Code Playgroud)
但这种方法存在一些问题:
char不保证是无符号的,这使得从数值生成代码点不可移植(例如,char8{129}用 中断char,但不能用 中断char8_t)。
char8char与C++17 中没有区别,后者可能会破坏现有代码,并可能导致错误。
从第 2 点继续,不可能在 C++17 中重载char …
首先,我只想在控制台中使用波罗的海字符并用它们执行 CMD 命令,但问题是从默认/标准控制台 C++ 应用程序开始的。
\n#include <iostream>\nint main() {\n string output = "\xc4\x81\xc4\x81\xc4\x81\xc4\x8d\xc4\x8d\xc4\x8d\xc4\x93\xc4\x93\xc4\x93\xc4\x93";\n\n cout << output << endl;\n}\nRun Code Online (Sandbox Code Playgroud)\n早些时候,我在堆栈上提出了这个问题 - How to use UTF8characters in DEFAULT C++ Project OR when using mysql Connector for C++ in Visual Studio 2019 (Latin7_general_ci to UTF-8)?
\n我在测试中发现:如果我将 UTF8 字符串转换为 Latin1 字符串,然后 cout 或打印十六进制值,我会在控制台中输出一些特殊字符。例如 -
\n**char s2[256] = "\\xc3\\xa9";** printed is outputted as "\xc4\xb7" THAT MEANS I need to convert strings into correct HEX values when it is needed, and some …Run Code Online (Sandbox Code Playgroud)