2012-05-19 29 views
2

嗯,我使用的libcurl在C++中的Visual Studio 2008和Windows 7專業版32位發送使用UTF-8字符的請求,但問題是,我得到的編碼錯誤。 �abe而不是çabe用於UTF-8請求的cURL。它始終是這樣,當它應該被CABE安倍

一兩件事,而我是在我的本地服務器測試我注意到,這是第一次我收到這樣echo $_POST['post'];一個PHP的服務器,並談到�abe但如果我對其進行編碼,它來自正確的:echo utf8_encode($_POST['post']);談到çabe這是我想。

,但事情是,我沒有在接收數據的服務器控制,我想送它已經用UTF-8編碼。

我該怎麼做?

這裏是我的崗位部分

struct curl_httppost *formpost=NULL; 
struct curl_httppost *lastptr=NULL; 
std::string post = "çabe"; 
url_formadd(&formpost, 
     &lastptr, 
     CURLFORM_COPYNAME, "post", 
     CURLFORM_COPYCONTENTS, post.c_str(), 
     CURLFORM_END); 

@edit

據DietrichEpp,看看我的有UTF-8,我可以簡單地測試例如在不同字符的長度「C」 所以我試圖printf("%d\n", (int) strlen("ç")); - 它應該打印出2或3 UTF-8,或1別的東西。

,並沒有打印出來1,這樣就可能是這個原因,我怎麼能解決這個問題?

我想將其設置爲UTF-8,或者至少能夠把一個函數來設置它的捲曲的後場使用時要UTF8。

+0

專門的庫我懷疑這是設置一個頭像'Content-Type:application/x-www-form-urlencoded; charse T = UTF-8'。但是,您處於服務器的擺佈之中,服務器可能會忽略您,並且您無能爲力。 –

+0

這不僅僅是這個,即使你穿上Get像myaddress.php嗎?param =çaça它給了這個錯誤,並且服務器處理它,它是一個着名的電子郵件網站。 – Grego

+1

網址不以utf8編碼。 http://en.wikipedia.org/wiki/Percent-encoding –

回答

1

如果你想發送UTF-8編碼數據,你需要必須使用UTF-8編碼。例如「C」在UTF-8編碼可以portabily拼寫\xC3\xA7

std::string post = "\xC3\xA7abe"; 

Visual Studio 2008中應能自動save file in UTF-8,節省你在做自己該編碼的麻煩。如果您在ISO 8859-1卡住的工作,這特定的轉碼爲UTF-8可以很容易地(左優化作爲exercice)來實現的:

std::string utf8_from_iso8859_1(std::string str) 
{ 
    std::string res; 
    for (std::string::iterator i = str.begin(); i < str.end(); i++) { 
    if (0 <= *i && *i < 0x80) 
     res += *i; 
    else { 
     res += 0xC0 | ((*i >> 6) & 0x03); 
     res += 0x80 | (*i & 0x3F); 
    } 
    } 
    return res; 
} 

然後用

std::string post = "çabe"; 
std::string encoded = utf8_from_iso8859_1(post); 
url_formadd(&formpost, 
    &lastptr, 
    CURLFORM_COPYNAME, "post", 
    CURLFORM_COPYCONTENTS, encoded.c_str(), 
    CURLFORM_END); 

從其他編碼轉換將需要一個特定的映射,你最好的選擇將使用像libiconv

+0

在C++ 11中,可以用'u8「çabe」'來完成。 (或者通過確保正確的編譯器配置,但這不是真正的可移植性。)將字符串文字傳遞給'utf8_from_iso8859_1'與直接使用字符串文字一樣危險......任何一種方式都會假定執行字符集。 – Potatoswatter

+0

@Patatoswatter對,我明確地說:「顯然你正在ISO 8859-1工作。在描述轉碼技巧之前,在這個具體案例中[...]「。它*會*假定ISO 8859-1源編碼。 我對C++ 11並不熟悉,但是我的理解是,即使'u8'也不會將外部編碼轉換爲UTF-8。它*要求*源程序已經是UTF-8編碼。 – kmkaplan

+0

是的,答案沒有錯,我只是提到這個修補程序同樣是平臺特定的。不,「u8」代表UTF-8,接受8859-1源程序的編譯器必須對其進行轉碼。該標準是關於輸出的具體規定,並故意使規範獨立於源代碼編碼。 – Potatoswatter

相關問題