C++ 使用 u8 字符串作为无符号字符串

C++ Using u8 strings as unsigned strings

C++20 引入了 char8_t 作为 UTF-8 字符串和字符文字的类型。

char8_t 在很大程度上等同于 unsigned char,因此,任何算术、逻辑或按位运算都将作为无符号运算,发出无符号运算而不是有符号运算。

考虑一个 base64 转换算法,大多数实现严重依赖按位运算,其中带符号的运算通常具有不正确的语义。

可以接受带符号的字符串,或者只接受未指定符号的 char 字符串,并在对其进行操作之前重新解释该字符串,或者可以接受无符号的字符串。

如果我选择接受无符号字符串,并创建一个public API(例如面向用户的库函数),签名如下:

std::u8string base64::encode(std::u8string_view);

这会是错误的吗?比如,这是否意味着函数字符串旨在对 UTF-8 编码字符串进行操作,而不是对 8 位 ASCII 或二进制缓冲区进行操作?

我猜答案是“是”。

我可以为 std::basic_string<unsigned char>std::basic_string_view<unsigned char> 等创建别名,但是无法轻松地从中创建字符串文字,而可以轻松地编写 u8"Hello, world!" 和将其传递给函数。

所以在使用字符串文字时会更难使用。

有没有比这更好的接受和使用无符号字符串的方法?

std::u8string base64::encode(std::span<std::byte const> binaryData);
inline std::u8string base64::encode_string(std::u8string_view u8sv) {
  //todo call encode
}
inline std::u8string base64::encode_string(std::string_view sv) {
  //todo call encode
}

取一个 const 字节的跨度。具有采用 u8char 字符串的辅助方法。

base64 编码用于编码二进制数据。您可以在其中对字符串进行编码,而辅助方法可以让这变得更容易。

我让辅助方法有了不同的名称,以明确我们将字符串编码为字符串。 base64::encode 的输出可以反馈到 base64::encode,但如果不是有意这样做将很容易导致错误。

Return一个u8string,因为结果确实编码为utf-8字符。