[英]UTF 16 to UTF8 using utf8 library in c++
我正在使用此库在C ++中进行从UTF16到UTF8的转换。
该示例建议采用以下方法将utf16转换为utf8:
unsigned short utf16string[] = {0x41, 0x0448, 0x65e5, 0xd834, 0xdd1e};
vector<unsigned char> utf8result;
utf16to8(utf16string, utf16string + 5, back_inserter(utf8result));
assert (utf8result.size() == 10);
utf16to8的定义如下:
template <typename u16bit_iterator, typename octet_iterator>
octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result);
我有一个char数组,其中包含UTF16中的字符。 如果我不知道我的UTF16字符数组的大小(有效字符数),能否告诉我是否仍然可以使用该库?
不能。显然,您无法对大小未知的容器中存储的数据做任何有意义的事情。 您应该知道它包含多少元素。
供您参考,可能可以使用C ++ 11中引入的u16string。
#ifdef WIN32
#include <codecvt>
#else
#include <uchar.h>
#endif
string toUTF8(const u16string& u16str) {
string result;
#ifdef WIN32
wstring_convert<codecvt_utf8_utf16<char16_t>, char16_t> convertor;
result = convertor.to_bytes(u16str);
#else
mbstate_t mbs;
mbrlen(NULL, 0, &mbs); /* initialize mbs */
int length = 0;
char buffer [MB_CUR_MAX];
for (int i= 0; i < u16str.size(); i++){
length = c16rtomb(buffer, u16str[i], &mbs);
if ((length == 0) || (length>MB_CUR_MAX)){
break;
}
for (int j = 0; j < length;j++){
result += buffer[j];
}
}
#endif
return result;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.