gpt4 book ai didi

c++ - 从 char 转换为 char16_t

转载 作者:太空狗 更新时间:2023-10-29 21:42:35 27 4
gpt4 key购买 nike

我的配置:

  • 编译器:gnu gcc 4.8.2
  • 我用 C++11 编译
  • 平台/操作系统:Linux 64 位 Ubuntu 14.04.1 LTS

我有这个方法:

static inline std::u16string StringtoU16(const std::string &str) {
const size_t si = strlen(str.c_str());
char16_t cstr[si+1];
memset(cstr, 0, (si+1)*sizeof(char16_t));
const char* constSTR = str.c_str();
mbstate_t mbs;
memset (&mbs, 0, sizeof (mbs));//set shift state to the initial state
size_t ret = mbrtoc16 (cstr, constSTR, si, &mbs);
std::u16string wstr(cstr);
return wstr;
}

我非常想在 char 和 char16_T 之间进行转换(通过 std::string 和 std::u16string 以促进内存管理),但无论输入变量 str 的大小如何,它都只会返回第一个字符。如果 str= "Hello"它将返回 "H"。我不确定我的方法有什么问题。 ret的值为1。

最佳答案

我不知道 mbrtoc16() 一次只能处理一个字符。真是一只乌龟。下面是我生成的代码,运行起来非常棒:

static inline std::u16string StringtoU16(const std::string &str) {
std::u16string wstr = u"";
char16_t c16str[3] = u"\0";
mbstate_t mbs;
for (const auto& it: str){
memset (&mbs, 0, sizeof (mbs));//set shift state to the initial state
memmove(c16str, u"\0\0\0", 3);
mbrtoc16 (c16str, &it, 3, &mbs);
wstr.append(std::u16string(c16str));
}//for
return wstr;
}

对于它的对应方(当需要一种方式时,迟早会需要另一种方式):

static inline std::string U16toString(const std::u16string &wstr) {
std::string str = "";
char cstr[3] = "\0";
mbstate_t mbs;
for (const auto& it: wstr){
memset (&mbs, 0, sizeof (mbs));//set shift state to the initial state
memmove(cstr, "\0\0\0", 3);
c16rtomb (cstr, it, &mbs);
str.append(std::string(cstr));
}//for
return str;
}

请注意,如果无法将字符从 char16_t 转换为 char,c16rtomb 将会有损失(可能最终会打印一堆 '?',具体取决于您的系统),但它会正常工作。

关于c++ - 从 char 转换为 char16_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25842984/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com