2013-10-11 84 views
0
int main() 
{ 
    char str[200] = {0}; 
    char out[500] = {0}; 

    str[0]=0x00; str[1]=0x52; str[2]=0x00; str[3]=0x65; str[4]=0x00; str[5]=0x73; str[6]= 0x00; str[7]=0x74; 

    for(int i=0;i<sizeof(str);i++) 
    cout<<"-"<<str[i]; 
    changeCharEncoding("UCS-2","ISO8859-1",str,out,sizeof(out)); 
    cout<<"\noutput : "<<out; 
    for(int i=0;i<sizeof(out);i++) 
    cout<<":"<<out[i]; 
} 

//encoding function 
int changeCharEncoding(const char *from_charset, const char *to_charset, const char *input, char *output, int out_size) 
{ 
    size_t input_len = 8; 
    size_t output_len = out_size; 
    iconv_t l_cd; 
    if ((l_cd = iconv_open (to_charset, from_charset)) == (iconv_t) -1) 
    { 
      return -1; 
    } 
    int rc = iconv(l_cd, (char **)&input, &input_len, (char **)&output, &output_len); 
    if (rc == -1) 
    { 
      iconv_close(l_cd); 
      return -2; 
    } 
    else 
    { 
      iconv_close(l_cd); 
    } 
} 

請建議我一種將16位數據轉換爲8位的方法。我嘗試過使用iconv。同時建議我是否還有其他事情要做。需要將16位數據轉換爲8位

+0

通過它非常清晰這將是困難的。你打算怎麼處理你的溢出?如果您要轉換字符集,您需要非常確定源代碼和目標編碼,並且您需要一種機制來處理不正確的轉換。 – 2013-10-11 19:45:17

+1

「數據」是什麼意思?而「轉換」是什麼意思,甚至?你是否想要做Unicode文本的ASCII表示? –

+0

另外,C ** XOR ** C++?選擇一個。 – 2013-10-11 19:48:27

回答

0

一般來說 - 不能任意16位數據轉換成8個數據,你將失去一些數據

,如果你想轉換編碼 - 同樣的規則適用,因爲你不能一些符號轉換成8位ASCII,所以他們會丟失,針對不同的平臺,您可以使用不同的功能:

的Windows:WideCharToMultiByte

的* nix:iconv

+0

我已經在上面的代碼中使用過iconv,但它工作不一樣。而且我知道一些數據會丟失,所以這不是問題 – user2843171

+0

爲什麼你認爲它不起作用?是內存錯誤,錯誤的結果,空的結果? –

+0

它顯示錯誤的結果 – user2843171

1

它看起來像你想CONVER牛逼UTF-16UTF-8之間編碼: 試着改變你的changeCharEncoding()呼籲:

changeCharEncoding("UTF-16","UTF-8",str,out,sizeof(out)); 

產生的UTF-8輸出應該

刀攀猀琀 

在一個旁註:有在你的代碼幾件事情,你應該考慮改進。例如,changeCharEncodingmain都聲明爲返回int,而您的實現不會。

+0

我想他希望它是「休息」。聽起來像是BOM問題! – Roddy

+0

不,'UTF-16'輸入是'Rest',當轉換爲'UTF-8'編碼時,得到的結果是 – Pankrates

+0

那麼這是錯誤的。UTF-16(或UCS-2)中的「休息」應該是UTF-8中的「休息」(或ISO8859-1) – Roddy

0

我懷疑你有一個字節序的問題:嘗試改變這種

changeCharEncoding("UCS-2","ISO8859-1",str,out,sizeof(out)); 

這個

changeCharEncoding("UCS-2BE","ISO8859-1",str,out,sizeof(out));