【发布时间】:2014-11-08 16:20:26
【问题描述】:
我的配置:
- 编译器: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。
【问题讨论】:
-
看wstring_convert和codecvt的en.cppreference.com/w/cpp/locale/wstring_convert
-
strlen(str.c_str())... -
和
char16_t cstr[si+1];- VLA 不是有效的 C++。 -
@JDS:不幸的是,没有任何方面可以连接“系统”和“UTF”世界。 (但是,您可以转换 within the "system" world 并在 UTF 世界中使用
wstring_convert,如果您愿意执行一些类设计杂技。) -
...最后,
mbrtoc16只转换一个字符。