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 字节的跨度。具有采用 u8
和 char
字符串的辅助方法。
base64 编码用于编码二进制数据。您可以在其中对字符串进行编码,而辅助方法可以让这变得更容易。
我让辅助方法有了不同的名称,以明确我们将字符串编码为字符串。 base64::encode
的输出可以反馈到 base64::encode
,但如果不是有意这样做将很容易导致错误。
Return一个u8string
,因为结果确实编码为utf-8字符。
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 字节的跨度。具有采用 u8
和 char
字符串的辅助方法。
base64 编码用于编码二进制数据。您可以在其中对字符串进行编码,而辅助方法可以让这变得更容易。
我让辅助方法有了不同的名称,以明确我们将字符串编码为字符串。 base64::encode
的输出可以反馈到 base64::encode
,但如果不是有意这样做将很容易导致错误。
Return一个u8string
,因为结果确实编码为utf-8字符。