将STD :: U8String复制到一个UTF8字符的C风格字符串中

Copy a std::u8string into a c-style string of utf8 characters

本文关键字:字符 UTF8 风格 字符串 一个 复制 U8String STD      更新时间:2023-10-16

将没有编码的字符串复制为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::copystd::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