2012-02-10 128 views
1

我們的引擎中內置了一個評論系統,它允許程序員爲各種暴露的變量/對象提供註釋,然後由GUI前端用於工具提示和幫助。如何處理C++中的Unicode字符

最近,某些工具提示開始崩潰,經過大量浪費時間後,我將其跟蹤到字符:,除非我誤會,否則它是unicode字符,並且在ASCII中不可用。

考慮到this answer考慮,我假設wstring將解決問題。在對更大的項目進行更改之前,我創建了一個測試項目,以查看wstring是否可以解決問題。雖然該項目不會崩潰,但行爲並非如預期的wstring

#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    string someString = "successive attack that DOESN’T result"; 
    wstring someWString = L"successive attack that DOESN’T result"; 

    cout << someString << endl; 
    wcout << someWString << endl; 

    return 0; 
} 

//Console Output// 
successive attack that DOESNÆT result 
successive attack that DOESNPress any key to continue . . . 

我讀this article前一段時間,我想我明白與字符集相關的問題,但顯然並非如此。我希望能夠解決這個問題,並且很好地解釋發生了什麼以及將來如何避免類似的問題。

+0

也許源文件本身不正確編碼編碼。它的編碼是什麼? – 2012-02-10 16:08:42

+2

IIRC控制檯不支持非代碼頁字符。你的工具提示是否有效? – Rup 2012-02-10 16:10:05

+0

@NiklasB .:我不確定我會如何檢查?我正在使用Visual Studio 2008在上面的示例中創建一個新項目和源文件。我不知道如何檢查源文件本身的編碼...?在項目屬性中,我嘗試了'使用多字節字符集'和'使用Unicode字符集',輸出沒有區別。 – Samaursa 2012-02-10 16:13:03

回答

4

由於您使用Visual Studio,我假設您使用的是Windows。 Windows控制檯不支持unicode。它使用OEM字符集。您可以使用CharToOemW/OemToCharW在兩者之間進行轉換。顯然它不能代表所有的Unicode字符。

Windows使用UTF16作爲其系統API。如果您的工具提示使用Windows API,則可能是您想要使用的wstring。但是,您可以使用UTF8,並在調用Windows API之前將其轉換爲UTF16。該轉換可以使用MultiByteToWideChar/WideCharToMultiByte執行。

+0

我可以做一個臨時修復以獲得固定的構建(例如,遇到它時立即忽略unicode字符)?然後我將開始將所有字符串轉換爲'wstring'(這將需要相當長的一段時間)。 – Samaursa 2012-02-10 16:27:33

+0

如果您跳過值> 127的所有字符,則只會獲得ASCII字符。 – rasmus 2012-02-10 16:29:58

+1

UTF8的優勢在於您可以繼續使用常規字符串,即不需要將所有字符串轉換爲wstring。相反,您需要在調用unicode(UTF16)Windows API時進行轉換。 – rasmus 2012-02-10 16:45:13

1

既然你正在處理Unicode字符,它會如果設置字符集使用Unicode字符在項目屬性中設置是適當的。

另一個可能的問題可能是源文件的編碼。處理Unicode字符時的最佳做法是讓您的源文件編碼爲UTF-8,特別是您定義像這樣的字符串文字的文件。請注意,UTF-8沒有BOM可能會很麻煩,因爲Visual Studio需要這個BOM,以便它可以正確解釋文件內容。將您的文件(我用記事本++本),並將其轉換使它們在utf-8

+0

我在NPP(保存爲UTF-8或UCS-2)中嘗試了相同的方法,但它沒有幫助(儘管我使用沒有VS的原始'cl')。我認爲問題在於控制檯不理解輸出。 – 2012-02-10 16:23:46

+0

我的經驗是,如果程序使用Unicode字符集並且不能正確顯示字符串文字,則很可能是因爲源文件的編碼錯誤。 – LihO 2012-02-10 16:26:10

+0

但說實話我沒有用控制檯試過。 – LihO 2012-02-10 16:26:49