2010-07-16 69 views
1

我想讓unicode在Visual Studio 2k8項目的窗口上工作,我不確定爲什麼我無法讓我的項目工作。我的機器安裝了所有的東部語言支持。我去了properties-> project defaults->字符集:它被設置爲「使用Unicode字符集」。這是我的測試代碼:爲什麼我的visual studio 2k8 C++項目不能使用unicode字符?

#include <stdio.h> 
#include <string> 

#define ARAB "گـگـگ گ لـلـل ل" 
#define CHINESE "大夨天太夫" 
#define VALUE CHINESE 
#define LARAB L"گـگـگ گ لـلـل ل" 
#define LCHINESE L"大夨天太夫" 
#define LVALUE LCHINESE 

void AttemptStdString(FILE* file) 
{ 
    std::string str(VALUE); 
    printf("%s: %s, length(%d)\n",__FUNCTION__,str.c_str(),str.length()); 
    fprintf(file, "%s = %s\n",__FUNCTION__, str.c_str()); 
}  

void AttemptStdWideString(FILE* file) 
{ 
    std::wstring str = LVALUE; 
    printf("%s: %s, length(%d)\n",__FUNCTION__,str.c_str(),str.length()); 
    fprintf(file, "%s = %s\n",__FUNCTION__, str.c_str()); 
}  

void AttemptWCharT(FILE* file) 
{ 
    wchar_t arry[] = {0x5927,0x5928,0x5929,0x592A,0x592B,0x0000}; 
    printf("%s: %s\n",__FUNCTION__,arry); 
    wprintf(L"%s: %s\n",__FUNCTION__,arry); 
    fprintf(file, "%s = %s\n",__FUNCTION__, arry); 
    fwprintf(file,L"AttemptWCharT = %s\n",arry); 
} 


int main() 
{ 
    FILE* outFile = fopen("output.txt", "w"); 
    AttemptStdString(outFile); 
    AttemptStdWideString(outFile); 
    AttemptWCharT(outFile); 
    fclose(outFile); 
    return 0; 
} 

I的結果在終端得到的是:

AttemptStdString:?????,長度(5)
AttemptStdWideString:「Y(Y)Y Y + Y,長度(5)
AttemptWCharT:「Y(Y)Y
Y +ý
?????? T:?????

結果在文件中得到的是:

AttemptStdString = ?????
AttemptStdWideString = 'Y(Y)Y Y +ý
AttemptWCharT =' Y(Y)Y
Y +ý
AttemptWCharT = ?????

我錯過了什麼「伏都教」我相信這是一件簡單的事情,會使這項工作,似乎我應該能夠打印我的人物,但它是失敗的。此外,我已經檢查過,我可以將這些字符粘貼到文本編輯器中,我打開該文件並顯示正常。我已經嘗試了視覺演播室終端的「Lucida Console」&「光柵字體」選項。請幫忙!我究竟做錯了什麼?

謝謝!

回答

2

問題並不完全是因爲你的代碼,而是你如何看待文本。您的文本編輯器可以知道文件包含Unicode的唯一方法是使用所需的BOM。你沒有寫出一個。在_wfopen()模式字符串中使用「ccs = UTF-16LE」。

控制檯存在類似問題,它無法顯示UTF-16編碼字符。它只處理8位字符,你必須使用UTF-8編碼和SetConsoleOutputCP()。

另一個問題是__FUNCTION__宏。這仍然是一個8位字符串。你必須使用%hs格式說明符。

+0

Hans感謝您的幫助,順便說一下它的「ccs = UTF-16LE」,並要求您執行以下操作:_wfopen(L「文件。txt「,L」w +,ccs = UTF-16LE「); 我發現模式」w「必須改變爲」w +「並且您還必須從fopen更改爲_wfopen。 – NSA 2010-07-16 22:15:59

1

默認情況下,Windows控制檯不顯示unicode字符。

+2

是的。柵格字體絕對不能處理Unicode,而Lucida Console是一種只處理* some *歐洲語言字符的混雜字體。 – DaveE 2010-07-16 18:52:47

+0

謝謝戴夫很高興知道,如果我的代碼不能正確使用unicode,如果我無法打印出來進行調試,我該如何判斷? – NSA 2010-07-16 20:03:33

+1

Windows控制檯的文本顯示很糟糕。 *也許*您可以選擇一種字體,如DejaVu Sans Mono,其中包含更多字符,但我認爲控制檯仍然完全無法顯示「複雜」(即非歐洲)腳本。您最好的選擇可能是將標準輸出重定向到一個文件。 – Philipp 2010-07-19 15:00:16

相關問題