在C++ fmt库中显示Unicode无穷符号U+221E的异常问题
问题解决:Windows下fmt库无法显示∞符号的问题
核心结论
不要切换到「Use Multi-Byte Character Set」,保持「Use Unicode Character Set」即可,问题出在源码文件编码和控制台输出编码的适配,按以下步骤修复:
1. 消除C4566警告(源码编码问题)
警告提示\u221E无法在当前代码页1252表示,是因为你的源码文件默认用了西欧编码(1252),无法保存UTF-8字符∞。修复步骤:
- 右键VS项目 → 属性 → 配置属性 → C/C++ → 高级
- 将「编码」设置为「UTF-8 带签名」(或「UTF-8 不带签名」,带签名更易被VS识别)
- 保存设置后重新编译,警告会消失
2. 修复控制台输出为?的问题
Windows控制台默认使用GBK(代码页936),无法正确显示UTF-8编码的∞符号,需要强制控制台使用UTF-8输出:
- 在代码开头添加Windows API调用,设置控制台输出编码:
#include <windows.h> // ... SetConsoleOutputCP(CP_UTF8); - 完整示例代码:
#include <fmt/core.h> #include <fmt/color.h> #include <windows.h> int main() { SetConsoleOutputCP(CP_UTF8); fmt::print(fmt::styled("∞ >", fmt::emphasis::bold | fg(fmt::color::aquamarine))); return 0; }
3. 为什么不用setlocale?
setlocale(LC_ALL, "en_US.UTF-8")在Windows下对控制台的支持有限,因为C标准库的locale和Windows原生控制台编码机制不兼容,直接调用SetConsoleOutputCP是更可靠的方案。
内容的提问来源于stack exchange,提问作者Alix Blaine
相关产品推荐
相关产品推荐

