2013-01-08 36 views
0

我一直在嘗試了ISO-8859字符集轉換爲UTF-8從獲得的代碼: Convert ISO-8859-1 strings to UTF-8 in C/C++ 這裏是我的代碼:ISO-8859爲UTF-8轉換C++

#include <iostream> 
#include <string> 

using namespace std; 
int main(int argc,char* argv[]) 
{ 
    string fileName ="ħëlö"; 
    int len= fileName.length(); 
    char* in = new char[len+1]; 
    char* out = new char[2*(len+1)]; 
    memset(in,'\0',len+1); 
    memset(out,'\0',len+1); 
    memcpy(in,fileName.c_str(),2*(len+1)); 


    while(*in) 
    { 
      cout << " ::: " << in ; 
      if(*in <128) 
      { 
        *out++ = *in++; 
      } 
      else 
      { 
        *out++ = 0xc2+(*in>0xbf); 
        *out++ = (*in++&0x3f)+0x80; 
      } 
    } 
    cout << "\n\n out ::: " << out << "\n"; 
    *out = '\0'; 
} 

但輸出是

::: ħëlö ::: ?ëlö ::: ëlö ::: ?lö ::: lö ::: ö ::: ? 

out ::: 

輸出'out'應該是一個utf-8字符串,它不是。我得到這個在Mac OS X ..

我在這裏做錯了什麼..?

+0

(1)缺少#include 。 (2)你期望成爲什麼樣的產出?請澄清。 (3)它與osx(標籤)有什麼關係?順便說一句:證實了在Linux上與gcc的行爲4.7.2 – steffen

+0

我不知道std :: cout將與您的UTF-8編碼字符串很好的行爲。這可能是問題,而不是轉換代碼。 – Steve

+0

在@ unwind的答案中修復指針問題後,請確保您的shell設置爲UTF-8:http://stackoverflow.com/questions/4606570/os-x-terminal-utf-8-issues – japreiss

回答

2

您正在循環中增加out指針,導致您失去跟蹤輸出開始的位置。傳遞給cout的指針是遞增的,因此它顯然不會指向生成的輸出的開始。

此外,out的終止發生在打印後發生,這當然是錯誤的。

此外,這依賴於源代碼和東西的編碼,不是很好。您應該以不同的方式表示輸入字符串,使用帶有十六進制值的單個字符或其他字符以保證安全。

1

ISO-8859-1沒有字符ħ,因此您的源不可能在ISO-8859-1中按照方法的要求。或者您的源代碼位於ISO-8859-1中,但ħ一旦保存後將替換爲?