C ++ UTF8 в UTF16 Linux с использованием iconv - PullRequest
0 голосов
/ 10 марта 2011

Я работаю с поставщиком, который работает в 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;

}

1 Ответ

0 голосов
/ 06 февраля 2013

функция iconv переводит адреса указателей в строки и, по мере преобразования, указывает на следующий элемент массива char. когда он заканчивает, вывод фактически указывает на последний элемент массива, он может быть нулевым или чем-то еще. вам нужно сохранить начальный адрес выходной строки во временном местоположении. перед подачей вывода на iconv сделайте следующее char * tempoutput = output;

и затем после вызова iconv return tempoutput;

и не забудьте освободить (выходной) и возвращаемая строка также постоянна, вам нужно освободить ее после использования convert.

...