2009-08-27 73 views
0

C++標準庫中的大多數文本都提到wstring等價於字符串,除了在wchar_t而不是char上進行參數化,然後繼續僅演示字符串。C++ wstring如何從以NULL結尾的wchar_t數組中分配

嗯,有時候,有一些特定的怪癖,這裏是一個:我似乎無法從NULL終止的16位字符數組中分配一個wstring。問題是分配愉快地使用空字符和任何垃圾作爲實際字符。這裏是一個非常小的減少:

typedef unsigned short PA_Unichar; 
PA_Unichar arr[256]; 
fill(arr); // sets to 52 00 4b 00 44 00 61 00 74 00 61 00 00 00 7a 00 7a 00 7a 00 
// now arr contains "RKData\0zzz" in its 10 first values 
wstring ws; 
ws.assign((const wchar_t *)arr); 
int l = ws.length(); 

在這一點上或者是未預期的6(號碼「RKData」字符的),但更大。在我的測試中,它是29.爲什麼是29?不知道。內存轉儲不顯示第29個字符的任何特定值。

所以問題:這是我的標準C++庫(Mac OS X Snow Leopard)中的錯誤,還是我的代碼中的錯誤? 我該如何將一個16位字符的空終止數組賦給一個wstring?

由於

+0

排序問題? – obelix 2009-08-27 11:54:36

+0

只需在黑暗中拍攝一張雙空終止符 – Skurmedel 2009-08-27 11:56:55

+0

@obelix,空字符的大小寫都相同。 – 2009-08-27 11:57:09

回答

9

在大多數的Unix(Mac OS X的爲好),whar_t表示UTF-32單碼點,而不是16位UTF-16點樣在窗戶。

所以,你需要:

  1. 或者:

    ws.assing(arr,arr + length_of_string); 
    

    這會使用ARR作爲迭代器和複製每個短整型到wchar_t的。 但是,如果您的字符位於BMP或代表UCS-2 (16位傳統編碼),這將工作

  2. 正確使用utf-16:將utf-16轉換爲utf-32 - 您需要找到代理對並將它們合併到單個代碼點。

0

我認爲你的代碼將工作,只是通過檢查。但你總是可以解決這個問題:

ws.assign(static_cast<const wchar_t*>(arr), wcslen(arr)); 
+0

如果ws.assign通過挑出空字符找不到字符串的正確終止點,爲什麼wcslen?我認爲Artyom擊中了頭 - wchar_t!=無符號短。 – 2009-08-27 12:07:11

3

只要做到這一點。你沒有在你的代碼中,你爲wstring分配了一個無符號短褲數組,並且你使用了一個強制轉換來關閉編譯器。 wchar_t!=無符號短。你當然不能認爲他們有相同的尺寸。