c++;使用iconv将UTF-8转换为wstring 我有一个C++ Linux应用程序,运行如下: int main() { using namespace std; char str[] = "¡Hola!"; wchar_t wstr[50]; size_t rc; memset(wstr, 0, sizeof(wstr)); rc = mbstowcs(wstr, str, 50); cout << "mbstowcs results: "; cout << "rc = " << rc << endl; cout << "str:" << str << endl; wcout << L"wstr:" << wstr << endl; setlocale(LC_CTYPE,""); iconv_t cd = iconv_open("WCHAR_T", "UTF-8"); cout << "iconv_open errno = "<< errno << endl; char *s = str; char *t = (char *)wstr; size_t s1 = strlen(str); size_t s2 = 50; rc = iconv(cd, &s, &s1, &t, &s2); cout << "iconv results: "; cout << "rc = " << rc << endl; cout << "str:" << str << endl; wcout << L"wstr:" << wstr << endl; }

c++;使用iconv将UTF-8转换为wstring 我有一个C++ Linux应用程序,运行如下: int main() { using namespace std; char str[] = "¡Hola!"; wchar_t wstr[50]; size_t rc; memset(wstr, 0, sizeof(wstr)); rc = mbstowcs(wstr, str, 50); cout << "mbstowcs results: "; cout << "rc = " << rc << endl; cout << "str:" << str << endl; wcout << L"wstr:" << wstr << endl; setlocale(LC_CTYPE,""); iconv_t cd = iconv_open("WCHAR_T", "UTF-8"); cout << "iconv_open errno = "<< errno << endl; char *s = str; char *t = (char *)wstr; size_t s1 = strlen(str); size_t s2 = 50; rc = iconv(cd, &s, &s1, &t, &s2); cout << "iconv results: "; cout << "rc = " << rc << endl; cout << "str:" << str << endl; wcout << L"wstr:" << wstr << endl; },c++,utf-8,wstring,C++,Utf 8,Wstring,iconv结果将第一个字符转换为另一个字符 注:如果我替换UCS-4-内部中的WCHAR\u T,则wstr不包含任何内容 有什么帮助吗 谢谢 可以使用boost吗 可以使用boost吗 如果不看iconv文档(到目前为止从未使用过),我希望您的输入(char str[]=“.Hola!”;)不会被编码为多字节字符串-更可能是一个简单的ANSI字符串,使用您的本地/当前代码页来表示”。或者换句话说:在您现有的字符串中(使用constchar[])“存储在单个字节中,其值大于127mbstowcs

iconv结果将第一个字符转换为另一个字符

注:如果我替换UCS-4-内部中的WCHAR\u T,则wstr不包含任何内容

有什么帮助吗


谢谢

可以使用boost吗


可以使用boost吗


如果不看iconv文档(到目前为止从未使用过),我希望您的输入(
char str[]=“.Hola!”;
)不会被编码为多字节字符串-更可能是一个简单的ANSI字符串,使用您的本地/当前代码页来表示
”。或者换句话说:在您现有的字符串中(使用
constchar[]
存储在单个字节中,其值大于127
mbstowcs()
但是,它可能会使用2个字节来表示正确的
(现在没有检查此项),并且
使用的值甚至可能是不期望/不允许的


我希望错误会发生在那里,因为
mbcstowcs()
应该返回转换字符串中的字符数-但是“18446744073709551615”太长了。如果这是真的,那么在用正确的文本定义自己的宽字符串并使用该字符串时,您也应该能够正确地使用iconv(
wchar_t wstr[]=L“Hola!”;
)。

无需查看iconv文档(迄今为止从未使用过它),我期待您的输入(
char str[]=“Hola!”
)没有被编码为多字节字符串-它更可能是一个简单的ANSI字符串,使用本地/当前代码页来表示
”。或者换句话说:在您现有的字符串中(使用
constchar[]
存储在单个字节中,其值大于127
mbstowcs()
但是,它可能会使用2个字节来表示正确的
(现在没有检查此项),并且
使用的值甚至可能是不期望/不允许的


我希望错误会发生在那里,因为
mbcstowcs()
应该返回转换字符串中的字符数-但是“18446744073709551615”太长了。如果这是真的,那么在用正确的文本定义自己的宽字符串并使用该字符串时,您也应该能够正确地使用iconv(
wchar\u t wstr[]=L“Hola!”;
)。

为了便于移植,不要假设wchar\u t是32位(足以容纳UCS-4),这是一个额外的注意:当引用字符串常量时(即您的
str
),您应该将其定义为
const
,以避免以后无意中尝试更改它。为了便于移植,请不要假设wchar\t为32位(足以容纳UCS-4),另请注意:在引用字符串常量(即
str
)时,您应该将其定义为
const
,以避免以后意外地尝试更改它。
 mbstowcs results: rc = 18446744073709551615
    str:¡Hola!
    wstr:
    iconv_open errno = 2
    iconv results: rc = 0
    str:¡Hola!
    wstr:�Hola!