2013-01-12 83 views
0

這是我的C++代碼,我試圖將收到的文件路徑編碼爲utf-8。C++字符編碼

#include <string> 
#include <iostream> 

using namespace std; 
void latin1_to_utf8(unsigned char *in, unsigned char *out); 
string encodeToUTF8(string _strToEncode); 

int main(int argc,char* argv[]) 
{ 

// Code to receive fileName from Sockets 
cout << "recvd ::: " << recvdFName << "\n"; 
string encStr = encodeToUTF8(recvdFName); 
cout << "encoded :::" << encStr << "\n"; 
} 

void latin1_to_utf8(unsigned char *in, unsigned char *out) 
{ 
while (*in) 
{ 
    if (*in<128) 
    { 
    *out++=*in++; 
    } 
    else 
    { 
    *out++=0xc2+(*in>0xbf); 
    *out++=(*in++&0x3f)+0x80; 
    } 
} 
*out = '\0'; 
} 

string encodeToUTF8(string _strToEncode) 
{ 
    int len= _strToEncode.length(); 
    unsigned char* inpChar = new unsigned char[len+1]; 
    unsigned char* outChar = new unsigned char[2*(len+1)]; 
    memset(inpChar,'\0',len+1); 
    memset(outChar,'\0',2*(len+1)); 
    memcpy(inpChar,_strToEncode.c_str(),len); 
    latin1_to_utf8(inpChar,outChar); 
    string _toRet = (const char*)(outChar); 
    delete[] inpChar; 
    delete[] outChar; 
    return _toRet; 
} 

並且輸出是

recvd ::: /Users/zeus/ÄÈÊÑ.txt 
encoded ::: /Users/zeus/AÌEÌEÌNÌ.txt 

latin1_to_utf8被作爲溶液Convert ISO-8859-1 strings to UTF-8 in C/C++提供的上述功能,看起來像它的工作原理。[答案已被接受。所以我認爲我必須犯一些錯誤,但我無法確定它是什麼。有人可以幫我解決這個問題,請。

我第一次在Codereview中發佈了這個問題,但我沒有得到任何答案。所以很抱歉重複。

+0

爲什麼你認爲有問題? – Mat

+0

@Mat我使用編碼的文件名將它發送回我的文件服務器,我無法發送它沒有正確的編碼,但正如你可以看到編碼後,它似乎有更多的字符 – Zeus

+0

是的,這是完全正常和預期。拉丁文中的每個127以上的字符都將用UTF-8中的兩個字節進行編碼。 – Mat

回答

0

您首先將原始Latin-1字符串輸出到期待特定編碼的終端,可能是Latin-1。然後,您將代碼轉換爲UTF-8並將其輸出到同一個終端,這會對其進行不同的解釋。經典mojibake。嘗試與輸出,而不是以下:

for(size_t i=0, len=strlen(outChar); i!=len; ++i) 
    std::cout << static_cast<unsigned>(static_cast<unsigned char>(outChar[i])) << ' '; 

注意這兩個石膏是首先得到了無符號字節值,然後獲得無符號值把它當作一個字符保持流。請注意,你的char可能已經沒有簽名,但是這是依賴於編譯的。

1

你使用任何平臺,或者你建立在std的頂部嗎?我相信很多人使用這種轉換,因此有圖書館。我強烈建議你使用libraray,因爲這個庫已經過測試,並且通常使用最好的方法。

,我發現這樣一個圖書館boost locale

這是標準的。如果你使用QT,我會建議你使用這個QT轉換庫(它是平臺獨立的)

QT

如果你想自己做(你想看看它是如何工作或任何其他原因) 1.確保分配內存! - 這在C,C++中非常重要。因爲你使用iostream來使用new來分配內存並刪除它以釋放它(這也是重要的C++不會知道什麼時候釋放它,這是開發者的工作 - C++是hardcore:D) 2.檢查你分配正確的內存大小。我期望unicode是更大的內存(它編碼更多的符號,有時使用大量的數字)。 3.如上所述從某處(終端或文件)讀取,但在新文件中輸出。之後,當你用文本編輯器打開文件時,確保你的編碼設置爲utf-8(你的文本編輯器必須知道如何解釋數據)

我希望有幫助。

+0

在我的公司,我們還爲所有UTF-8編碼的東西使用boost :: locale。奇蹟般有效。我強烈支持Teodor:使用現有的庫。 –