我的配置:
我有这个方法:
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。
答案 0 :(得分:2)
我不知道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将会丢失,但它可以正常工作。
答案 1 :(得分:0)
mbrtoc16()转换单个字符,并返回为转换char16_t而消耗的多字节字符数。
为了实现这种转换,一般方法是:
A)调用mbrtoc16()。
B)保存转换后的字符,跳过消耗的字符数。
C)您是否消耗了想要转换的整个字符串?如果不是,请返回步骤A.
此外,可能存在转换错误。您必须检查mbrtoc16()的返回值并执行您想要执行的操作,以处理转换错误(原始多字节字符串是注释有效)。
最后,您不应该假设char16_t字符串的最大大小等于或小于多字节字符串的大小。它可能是;但是,在一些奇怪的地方,我认为它理论上可以更多。