2017-06-14 55 views
-1

我的代碼:控制檯中使用printf的C++ unicode字符?

#include <iostream> 
#include <windows.h> 

using namespace std; 

int pos[9]; 

int main() { 
    printf(" %c ║ %c ║ %c ", pos[0], pos[1], pos[2]); 
    printf("═══╬═══╬═══"); 
    printf(" %c ║ %c ║ %c "), pos[3], pos[4], pos[5]; 
    printf("═══╬═══╬═══"); 
    printf(" %c ║ %c ║ %c "), pos[6], pos[7], pos[8]; 
    system("pause"); 
} 

我的控制檯輸出:

Console

我知道有這樣做的其他方式,但關鍵是要實現這一點與printf的:|有任何想法嗎?

+0

@CodyGray不太清楚你的意思..那些字符和我用的完全一樣.. –

+0

啊,不要緊。什麼是您的控制檯的字體設置爲?什麼是您的系統(ANSI)代碼頁?請注意,您實際上並未打印Unicode字符; Windows中的Unicode始終是兩個字節的UTF-16格式('wchar_t')。但是由於您使用的是IBM PC字符集中的字符,因此您可能可以使用窄字符。 –

+1

問題是你的輸出設備,而不是代碼太多。 – chux

回答

1

要使用printf,並假設您使用美國本地化的Windows,控制檯代碼頁爲437(運行chcp進行檢查),那麼如果將源文件保存在代碼頁437中,以下更正的代碼將起作用。方法是使用Notepad ++並在菜單上設置Encoding->Character sets->Western European->OEM-US。這樣做的缺點是你的源代碼在大多數編輯器中不能很好地顯示,除非它們特別支持cp437,甚至Notepad ++在沒有再次設置編碼的情況下重新打開文件時不能正確顯示它。

#include <stdio.h> 
#include <stdlib.h> 
#include <io.h> 
#include <fcntl.h> 

int main() 
{ 
    char pos[9] = {'X','O','X','O','X','O','X','O','X'}; 
    printf(" %c ║ %c ║ %c \n", pos[0], pos[1], pos[2]); 
    printf("═══╬═══╬═══\n"); 
    printf(" %c ║ %c ║ %c \n", pos[3], pos[4], pos[5]); 
    printf("═══╬═══╬═══\n"); 
    printf(" %c ║ %c ║ %c \n", pos[6], pos[7], pos[8]); 
    system("pause"); system("pause"); 
} 

在Windows上,因爲API是本地UTF-16,更好的方法是使用下面的代碼,將文件保存爲UTF-8 W/BOM:

#include <stdio.h> 
#include <stdlib.h> 
#include <io.h> 
#include <fcntl.h> 

int main() 
{ 
    char pos[9] = {'X','O','X','O','X','O','X','O','X'}; 
    _setmode(_fileno(stdout), _O_U16TEXT); 
    wprintf(L" %C ║ %C ║ %C \n", pos[0], pos[1], pos[2]); 
    wprintf(L"═══╬═══╬═══\n"); 
    wprintf(L" %C ║ %C ║ %C \n", pos[3], pos[4], pos[5]); 
    wprintf(L"═══╬═══╬═══\n"); 
    wprintf(L" %C ║ %C ║ %C \n", pos[6], pos[7], pos[8]); 
    system("pause"); 
} 

輸出(包括例如:

X ║ O ║ X 
═══╬═══╬═══ 
O ║ X ║ O 
═══╬═══╬═══ 
X ║ O ║ X 
Press any key to continue . . . 
+0

在第一個例子中,程序可以通過'conin_cp = GetConsoleCP();''conout_cp = GetConsoleOutputCP();''SetConsoleCP(437);''SetConsoleOutputCP(437)'設置控制檯輸入/輸出代碼。然後在退出時恢復原始代碼頁;缺點是如果程序崩潰或終止,代碼將不會被恢復。 – eryksun

+0

請注意,第一個示例使用默認的C語言環境。如果程序調用'setlocale(LC_CTYPE,「)」,在這種情況下CRT將從系統區域ANSI代碼頁轉碼(即字節 - > unicode->字節)到控制檯的輸入代碼頁,它將不起作用。 ANSI代碼頁(例如1252)可能不會映射這些框圖文字。 – eryksun