2017-06-14 53 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