2010-02-19 105 views
2

我正在使用Visual Studio 2008(C++)。如何從一個字符數組中創建一個CString(在一個非Unicode應用程序中),該字節數組中包含以UTF8編碼的字符串?字節數組到UTF8 CString

感謝,

克雷布斯

編輯:澄清:我猜我問的是.. CStringA似乎並不能夠解釋一個UTF8字符串爲UTF8,而是作爲ASCII或當前代碼頁(我認爲)..我如何將此UTF8字符串轉換爲CStringW? (UTF-16 ..?)謝謝

回答

3

CStringW filename= CA2W(null_terminated_byte_buffer, CP_UTF8)應該這樣做。

+0

謝謝我要試試這個.. – krebstar 2010-02-19 06:08:10

+0

這是否適用於非unicode應用程序?似乎沒有工作.. = /我想我需要使用一個unicode版本的CFile以及..如何從非Unicode應用程序獲得一個? – krebstar 2010-02-19 06:22:25

+0

請詳細說明「似乎不起作用」。 – MSN 2010-02-19 06:27:01

0

UTF8的好處在於每個UTF8字符串也是一個有效的以NUL結尾的C字符串。這意味着您應該能夠簡單地將指針指向字節數組的第一個字符(const char *)並將其傳遞給CString,就像您以NUL結尾的C字符串一樣。

請注意,除非CString知道UTF8語義(我不熟悉CString才能確切知道它是如何工作的,但我懷疑它不是),但對ASCII C字符串有意義的某些操作可能會給出奇怪的UTF8 C字符串的結果。例如,反轉字符串中字節順序的Reverse()方法不會爲UTF8字符串做正確的事情,因爲它不知道將多字節字符保留在原始順序中,並且會顛倒多字節字符的字節。

0

對於大多數情況,您可以將UTF8視爲與ASCII相同。

unsigned char szUtf8String[nSize] = "whatever"; 
CString s = static_cast<char *>(szUtf8String); 

這適用於操作和寫入文件。 但是,您不能輕鬆顯示字符串,它會將其視爲ASCII並誤解任何非英文字符。

要顯示它,您需要轉換爲UTF16,然後可能返回ANSI(在本地代碼頁中)。

+0

謝謝,我該怎麼做..? – krebstar 2010-02-19 05:59:02

+0

在Windows上,您可以使用MultiByteToWideChar()和WideCharToMultiByte()。在任何平臺上,您都可以使用mbstowcs()和wcstombs()以及其他相關函數。 前者提供更多的控制權,但後者是標準的C++,並可在任何平臺上使用。 – 2010-02-24 07:02:38

0

繼上面的「MSN」回答後,我認爲你最終會想要一個CString,而不是CStringW。所以添加一個轉換回CString:

CStringW filenameW = CA2W(null_terminated_byte_buffer,CP_UTF8); CString filename = CW2T(filenameW);