将一个std::u8string复制成一个c风格的utf8字符串
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,所以我不会在复制到原始文件时使用它 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'[=10=]';
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'[=10=]';
return dest;
}
在我看来,简单地利用 built-in 复制并向 C 代码提供 .data()
会更容易:
std::u8string orig = u8"abc";
auto copy = orig;
c_api(copy.data(), copy.size());
通过这样做,您可以让复制的字符串管理自己的生命周期,并使大小与数据处于同等地位。这适用于 std::basic_string
的任何字符类型。作为额外的好处,它也适用于 std::vector
.
将没有编码的字符串复制到 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,所以我不会在复制到原始文件时使用它 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'[=10=]';
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'[=10=]';
return dest;
}
在我看来,简单地利用 built-in 复制并向 C 代码提供 .data()
会更容易:
std::u8string orig = u8"abc";
auto copy = orig;
c_api(copy.data(), copy.size());
通过这样做,您可以让复制的字符串管理自己的生命周期,并使大小与数据处于同等地位。这适用于 std::basic_string
的任何字符类型。作为额外的好处,它也适用于 std::vector
.