0

私は、Windows 上で動作し、UTF16 のテキストを想定しているベンダーと協力しています。私はLinuxで実行しており、UTF8です。ソケット接続で送信できるように、iconv を使用して UTF8 から UTF16 に変換しようとしています。ここで記事を見つけたstackOverflow、そのコードに従おうとしましたが、関数から何も返されません。UTF-8 から UTF-16 に変換した経験のある人はいますか? ありがとう。

char * Convert( char *from_charset, char *to_charset, char *input )
{
size_t input_size, output_size, bytes_converted;
char * output;
char * tmp;
iconv_t cd;

cd = iconv_open( to_charset, from_charset);
if ( cd == (iconv_t) -1 )
{
    //Something went wrong with iconv_open
    if (errno == EINVAL)
    {
        char * buffer;
        sprintf(buffer, "Conversion from %s to %s not available", from_charset, to_charset);
        cout << buffer << endl;
    }
    return NULL;
}

input_size = strlen(input);
output_size = 2 * input_size;
output = (char*) malloc(output_size+1);

bytes_converted = iconv(cd, &input, &input_size, &output, &output_size);
cout << "Bytes converted: " << bytes_converted << endl;
if ( iconv_close (cd) != 0)
    cout<< "Error closing iconv_error" << endl;

return output;

}

4

1 に答える 1

0

iconv 関数は文字列へのポインターのアドレスを取得し、変換中に char 配列の次の要素を指します。出力が実際に配列の最後の要素を指している場合、それはnullまたは他の何かになる可能性があります。出力文字列の開始アドレスを一時的な場所に保存する必要があります。出力を iconv に渡す前に、次の char * tempoutput = output を実行します。

そして、iconv 呼び出しの後、tempoutput を返します。

free(output) を忘れないでください。返された文字列も存在するため、convert を使用した後に解放する必要があります。

于 2013-02-06T04:37:33.840 に答える