【问题标题】:Does a `std::u8string` have to be UTF-8?`std::u8string` 必须是 UTF-8 编码吗?
【发布时间】:2022-12-15 05:20:34
【问题描述】:

C++20 添加了char8_t,(我相信)它旨在帮助更好地支持 UTF-8。

标准要求 u8"abc" 形式的字符串常量是 char8_t[] 数组中的有效 UTF-8。这些常量也可以变成std::u8strings。

但是,我在 C++ 标准中找不到任何内容表明 std::u8string 必须或什至应该包含 UTF-8 字符串。 std::stringstd::u8string 在 UTF-8 支持方面实际上有什么区别吗?

【问题讨论】:

  • char8_t - 用于 UTF-8 字符表示的类型,需要足够大以表示任何 UTF-8 代码单元(8 位)。它具有与 unsigned char 相同的大小、符号和对齐方式(因此,与 charsigned char 具有相同的大小和对齐方式),但是是不同的类型。
  • std::u8stringstd::basic_string<char8_t>
  • 区别在于std::stringstd::basic_string<char>char可以是有符号或无符号类型,而char8_t只是无符号类型。
  • 标准要求 u8"abc" 形式的字符串常量是有效的 UTF-8“:我不明白为什么这是真的。据我所知,格式错误的 UTF-8 序列是允许的,例如 u8"\xff"
  • 这回答了你的问题了吗? how std::u8string will be different from std::string?

标签: c++ utf-8


【解决方案1】:

不,c++ 不要求您在 u8strings 中存储有效的 utf8。从编译器的角度来看,std::u8stringstd::string 具有完全相同的语义。

但是“在实践中”,您可以期望采用 u8string 参数的函数期望该字符串是有效的 utf8。即使他们接受无效的 utf8,他们也绝对不会期望您的字符串是 latin1 编码的。 std::string 绝对不能这样说。

【讨论】:

  • 这就是我的想法(在接受您的答案有效之前,我只会给人们短暂的时间来弹出新信息,以防我们都错过了一些东西)。
猜你喜欢
  • 2020-05-21
  • 2014-05-11
  • 2013-09-11
  • 2011-05-23
  • 1970-01-01
  • 2013-09-26
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
相关资源
最近更新 更多