将std :: u8string复制到utf8字符的c样式字符串中

时间:2019-07-02 19:58:47

标签: c++ utf-8 c-strings c++20 char8-t

将没有编码的字符串复制到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());
}

但是,对于utf8字符串,std::strcpy当然不会过载。

3 个答案:

答案 0 :(得分:8)

不需要

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()方法不能用于直接包含空终止符,因此在复制到原始char8_t*时不会使用它。 / p>

答案 1 :(得分:3)

除了使用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'\0';
    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'\0';
    return dest;
}

答案 2 :(得分:0)

在我看来,简单地利用内置复制并向C代码提供.data()会更容易:

std::u8string orig = u8"abc";
auto copy = orig;
c_api(copy.data(), copy.size());

这样做,您可以让复制的字符串管理自己的生存期,并使大小与数据相等。这对于std::basic_string的任何字符类型均适用。另外,它也适用于std::vector