char8_t 和 unsigned char 的转义序列

Escape sequences for char8_t and unsigned char

尝试使用转义序列构建 char8_t 字符串(不依赖 file/compiler 编码),我遇到了 MSVC 问题。

我想知道这是一个错误,还是依赖于实现。
有解决方法吗?

constexpr char8_t s1[] =     u8"\xe3\x82\xb3 \xe3\x83\xb3 \xe3\x83\x8b \xe3\x83\x81 \xe3\x83\x8f";
constexpr unsigned char s2[] = "\xe3\x82\xb3 \xe3\x83\xb3 \xe3\x83\x8b \xe3\x83\x81 \xe3\x83\x8f";
//constexpr char8_t s3[] = u8"コ ン ニ チ ハ";

static_assert(std::equal(std::begin(s1), std::end(s1),
                         std::begin(s2), std::end(s2))); // Fail on msvc

Demo

注意: 最终目标是用 std::filesystem::path(s1);

替换 std::filesystem::u8path(s2)(自 C++20 起不推荐使用 std::filesystem::u8path

这是 MSVC 中的一个错误,我希望在 Microsoft 实施 C++23 期间的某个时候得到修复。

从历史上看,字符和字符串文字中的数字转义序列在 C++ 标准中没有很好地指定,这导致了许多核心问题。这些问题已在本文的 P2029; a paper adopted for C++23 in November of 2020. The reported MSVC bug (along with an additional one related to non-encodeable characters) is discussed in the "Implementation impact" 部分解决。

如其他评论者所述,使用 universal-character-names(UCN)如 \u1234 将是避免依赖源文件编码的首选解决方案。