将STD :: U8String复制到一个UTF8字符的C风格字符串中
Copy a std::u8string into a c-style string of utf8 characters
将没有编码的字符串复制为C弦非常容易:
auto to_c_str(std::string const& str) -> char* {
auto dest = new char[str.size() + 1];
return strcpy(dest, str.c_str());
}
但是如何使用std::u8string
做到这一点?是否有可以帮助您帮助的STL算法?
我尝试了:
auto to_c_str(std::u8string const& str) -> char8_t* {
auto dest = new char8_t[str.size() + 1];
return std::strcpy(dest, str.c_str());
}
但是,当然,std::strcpy
对UTF8字符串没有过多。
strcpy
不需要,因为您已经知道要复制的长度,因此请使用memcpy
:
char8_t* to_c_str(std::u8string const& str) {
auto dest = new char8_t[str.size() + 1];
return static_cast<char8_t*>(std::memcpy(dest, str.data(), str.size()+1));
}
或std::copy
:
char8_t* to_c_str(std::u8string const& str) {
auto dest = new char8_t[str.size() + 1];
std::copy(str.data(), str.data() + str.size() + 1, dest);
return dest;
}
由于u8string
自己的copy()
方法无法直接包含null-terminator,因此复制到RAW char8_t*
时,我不会使用它。
在使用 std::memcpy
中,您可以使用 std::u8string::copy
和 std::copy
。
auto to_c_str(std::u8string const& str) -> char8_t* {
auto dest = new char8_t[str.size() + 1];
str.copy(dest, str.size(), 0);
dest[str.size()] = u8' ';
return dest;
}
auto to_c_str(std::u8string const& str) -> char8_t* {
auto dest = new char8_t[str.size() + 1];
std::copy(str.begin(), str.end(), dest);
dest[str.size()] = u8' ';
return dest;
}
在我看来,简单地利用内置复制并将.data()
提供给C代码很容易:
std::u8string orig = u8"abc";
auto copy = orig;
c_api(copy.data(), copy.size());
这样做,您让复制的字符串管理自己的寿命,并且与数据的尺寸相等。这适用于任何char类型的std::basic_string
。作为额外的奖励,它也适用于std::vector
。
相关文章:
- 将utf16宽std::wstring转换为utf8窄std::string以获得罕见字符时出现问题
- 使用C++将越南语字符从ISO88591、UTF8、UTF16BE、UTF16LE和UTF16编码为十六进制,反之亦然
- 有没有非utf8字符这样的东西
- C++ 检查 UTF8 字符串包含指定的字符
- tiny-utf8:以字符/代码点为单位获取偏移量
- 如何将 UTF8 字符数组转换为 Windows 1252 字符数组
- 将STD :: U8String复制到一个UTF8字符的C风格字符串中
- C++ 中的波斯语字符 utf8
- 如何替换/忽略 C stdio.h getline() 中的无效 Unicode/UTF8 字符
- C URL用UTF8字符错误解码
- C :如何支持UTF8中的替代字符
- 比较UTF8编码的字符
- 使用 C++ 将 UTF8 字符打印到 Linux 控制台
- 在代表 UTF8 的有符号字符和无符号字符之间进行转换
- 将utf8编码的字符串转换为本地8位编码的字符串,并将无法确定的字符替换为空白
- 如何逐个字符处理 UTF8 wxString
- fastcgipp < utf8 字符没有输出
- UTF8字符到十六进制值字符串
- 从本地<String>计算一行中的 UTF8 字符
- 解码字符UTF8 escape在Boost Spirit