2

我有一个运行以下命令的 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;

}

我想将一个 UTF-8 字符向量转换为 wstring,但上面的代码返回了这个结果:

 mbstowcs results: rc = 18446744073709551615
    str:¡Hola!
    wstr:
    iconv_open errno = 2
    iconv results: rc = 0
    str:¡Hola!
    wstr:�Hola!

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

注意:如果我替换 UCS-4 -INTERNAL 中的 WCHAR_T,则 wstr 不包含任何内容。

有什么帮助吗?

谢谢!

4

2 回答 2

0

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

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

于 2011-03-30T09:43:06.570 回答
0

可以使用boost吗?

http://www.boost.org/doc/libs/1_46_1/libs/serialization/doc/codecvt.html

于 2011-03-30T08:51:22.970 回答