2011-03-30 18 views
2

をiconvを使用してwstringのをUTF-8から変換する:この私がwstringのにUTF-8文字のベクトルを変換したいC++、私は次のことを実行し、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; 

} 

が、上記のコードリターン結果:

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

iconv result最初のcharを別のcharに変換します。

注:私はUCS-4 -internalでWCHAR_Tを交換する場合WSTRは何も含まれていません。

助けてくださいか?

ありがとうございました!

+0

wchar_tが32ビット(UCS-4を保持するには十分)であるとは思わないようにしてください。 – ognian

+0

追加の注記として:文字列定数(つまり 'str')を参照するときは、後で偶然にそれを変更しようとしないために 'const'を使います。 – Mario

答えて

0

(これまでのところ、それを使用していたことはありません)私はあなたの入力を期待する(char str[] = "¡Hola!";)マルチバイト文字列としてエンコードされていない - それはあなたを使用して、より可能性の高いシンプルなANSI文字列ですローカル/現在のコードページは'¡'を表します。言い換えれば:あなたの既存の文字列で(const char[]を使用して)'¡'がどこかに127 mbstowcs()上記の値を持つ単一のバイトに格納されるが、それは適切な'¡'を表現するために、おそらく2バイトを使用することが期待される(今のところはこれをチェックしませんでした)と値は、あなたの'¡'用途にも期待できない/許さ何かあるかもしれません。

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