我需要确保任何Unicode符号/字符串都能正确输入和输出。
这当然是可能的,不过让Windows命令提示符控制台正确支持Unicode需要一些特殊的技巧。不幸的是,我认为标准库函数的任何实现都不会做到这一点。
您会在Stack Overflow上找到很多关于此问题的提问,但是这个
问题是一个好的例子。基本上,控制台默认使用所谓的“OEM”代码页(有些错误)。您需要将其更改为UTF-8代码页,其值由
CP_UTF8
定义。为此,您需要调用
SetConsoleCP
函数(设置输入代码页)和
SetConsoleOutputCP
函数(设置输出代码页)。代码应该类似于以下内容:
if (!SetConsoleCP(CP_UTF8))
{
}
if (!SetConsoleOutputCP(CP_UTF8))
{
}
为了提高稳定性,您可能还需要确保先支持UTF-8代码页,而后再尝试设置和使用它。您可以通过调用IsValidCodePage
函数来实现。例如:
if (IsValidCodePage(CP_UTF8))
{
// We're all good, so set the console code page...
}
你还需要将默认字体(“光栅字体”)更改为包含所需Unicode字符字形的字体,例如Lucida Console或Consolas(
参考)。使用
SetCurrentConsoleFontEx
函数轻松实现。
不幸的是,该功能在Vista之前的Windows版本中不存在。如果您绝对需要支持这些旧操作系统,则唯一我知道的方法是调用未记录的
SetConsoleFont
函数。通常,我会强烈建议
不要使用未记录的函数,但我认为在这里问题较小,因为您只会在旧操作系统中使用它。您知道这些不会改变。在新版本中可用时,请调用支持的函数。以下是示例未经测试的代码:
bool IsWinVistaOrLater()
return false;
}
void SetConsoleToUnicodeFont()
else
}
请注意,我已经将添加所需的错误检查留给读者作为练习。这里的重点是技术和可读性;用错误处理来混淆问题只会让事情更加混乱。
我不知道如何在Linux上完成任何这样的操作。我猜想这需要的工作量要少得多,因为人们告诉我该操作系统在内部使用UTF-8。无论哪种方式,你都必须自己解决;让Windows运行良好已经足够了!