Visual Studio 2019使用C++无法正确打印无穷大符号∞的问题求解
C++ Windows平台正确打印无穷大符号∞的解决方案
- 你遇到的乱码、报错本质是Windows控制台默认使用CP1252/GBK编码,不支持UTF-8编码的∞字符,同时存在编码设置时机错误、宽窄字符输出混用、源文件编码不匹配三类问题。
- 警告C4566明确提示当前编译器代码页(1252)无法表示Unicode字符\u221E,C2664错误与输出∞无关,属于代码其他位置的内存操作问题,修复编码问题后可进一步排查。
方案1:修改控制台输出代码页为UTF-8(推荐)
这是最省心的方案,不需要改动原有打印逻辑:
- 程序启动第一时间调用Windows API设置控制台输出代码页为65001(UTF-8对应代码页)
- 将所有.cpp源文件保存为UTF-8编码格式(VS可通过「文件→高级保存选项」设置)
- 如果你使用自定义封装的打印函数,只要函数底层输出的是UTF-8编码字符串,设置完代码页后直接传入∞即可正常显示。
示例代码:
#include <windows.h> #include <cstdio> // 输出逻辑示例 void print_buff() { printf("modifies strength by 9 ∞\n"); } int main() { // 所有输出操作执行前先设置代码页 SetConsoleOutputCP(CP_UTF8); print_buff(); return 0; }
方案2:使用宽字符输出
如果不想修改全局代码页,可使用宽字符输出实现,注意不能混用宽字符输出和普通窄字符输出,会导致缓冲区异常:
示例代码:
#include <cstdio> #include <locale.h> int main() { // Windows下UTF-8区域参数为".UTF-8",不是Linux的en_US.UTF-8 setlocale(LC_ALL, ".UTF-8"); // 两种写法都可以 wprintf(L"modifies strength by 9 %lc\n", 8734); // wprintf(L"modifies strength by 9 ∞\n"); return 0; }
std::cout输出写法
如果使用C++标准库流输出,需要给流注入UTF-8区域:
#include <iostream> #include <locale> #include <windows.h> int main() { SetConsoleOutputCP(CP_UTF8); std::cout.imbue(std::locale(".UTF-8")); std::cout << "modifies strength by 9 ∞" << std::endl; return 0; }
内容的提问来源于stack exchange,提问作者Bishop Minter
相关产品推荐
相关产品推荐

