2011-03-09 131 views
0

我正在使用在Windows上運行的供應商,並且需要UTF16中的文本。我在Linux上運行,它是UTF8。我試圖使用iconv從UTF8轉換爲UTF16,所以我可以通過套接字連接發送。我在這裏發現了一篇文章stackOverflow,並試圖遵循該代碼,但是沒有任何內容從我的函數返回。有沒有人有任何從UTF-8轉換爲UTF-16的經驗?謝謝。C++ UTF8到UTF16 Linux使用iconv

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; 

}

+0

libiconv或者你在使用命令行工具嗎? +1對於sbi的評論。 – 0xC0000022L 2011-03-10 04:18:55

+0

確切的輸出是什麼?你有沒有「轉換不可用」的信息?它報告的「字節轉換:」是什麼? – 2011-03-14 20:36:04

+0

@NemanjaTrifunovic - 當我正在瀏覽它時,Bytes_converted有一些荒謬的數字,看起來像垃圾,但輸出是空白的。 – tankmr 2011-03-15 20:15:09

回答

0

所述的iconv函數採用指針的地址串和它S轉換它指向的字符數組的下一個元素。當它完成時,輸出實際上指向數組的最後一個元素,它可以是null或其他東西。 您需要將輸出字符串的起始地址保存在臨時位置。 在將輸出輸出到iconv之前,請執行以下操作: char * tempoutput = output;

然後在iconv調用後返回tempoutput;

並且不要忘記釋放(輸出) 並且返回的字符串也是暫時的,您需要在使用convert之後釋放它。