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 char ベクトルを 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!";) がマルチバイト文字列としてエンコードされていないことが予想されます。ローカル/現在のコードページを使用して'¡'. または言い換えると: 既存の文字列 (を使用const char[])'¡'は、127 を超える値を持つ単一バイトに格納されていmbstowcs()ます'¡'。あなたの'¡'使用は、予期されていない/許可されていないものでさえあるかもしれません。

mbcstowcs()変換された文字列の文字数を返す必要があるため、そこでエラーが発生すると予想されますが、「18446744073709551615」は単に長すぎます。これが当てはまる場合、適切なテキストで独自のワイド文字列を定義し、代わりにそれを使用するときに、iconv を適切に使用できるはずです ( wchar_t wstr[] = L"¡Hola!";)。

于 2011-03-30T09:43:06.570 に答える
0

ブーストは使えますか?

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

于 2011-03-30T08:51:22.970 に答える