C/C++控制台输出中文乱码解决
Windows系统cmd控制台默认是GBK编码,用UTF8编码保存的源文件经编译后,其内中文在控制台输出为乱码,解决方法如下:
以下代码在Windows环境下用Clang编译器通过测试
C语言:
#include <stdio.h> #ifdef _WIN32 #include <windows.h> #endif int main() { #ifdef _WIN32 //控制台显示乱码纠正 SetConsoleOutputCP (65001); CONSOLE_FONT_INFOEX info = { 0 }; // 以下设置字体来支持中文显示。 info.cbSize = sizeof(info); info.dwFontSize.Y = 16; info.FontWeight = FW_NORMAL; wcscpy(info.FaceName, L"NSimSun");//指定新宋体字体 SetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &info); #endif //程序开始 printf("中文乱码解决"); return 0; }
C++语言:
#include <iostream> using namespace std; #ifdef _WIN32 #include <windows.h> #endif int main() { #ifdef _WIN32 //控制台显示乱码纠正 SetConsoleOutputCP (65001); CONSOLE_FONT_INFOEX info = { 0 }; // 以下设置字体来支持中文显示。 info.cbSize = sizeof(info); info.dwFontSize.Y = 16; info.FontWeight = FW_NORMAL; wcscpy(info.FaceName, L"NSimSun");//指定新宋体字体 SetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &info); #endif cout << "中文乱码解决!" << endl; return 0; }
以上方法,治标不治本,有时候打印路径的时候会出现方框之类的错误显示。
以下解决方案可有效解决此问题:
C语言:
#include <stdio.h> #include <windows.h> void utf8ToGbk(char *utf8String, char *gbkString); int main() { char text[MAX_PATH]="中文测试"; char retText[MAX_PATH]={"\0"}; utf8ToGbk(text,retText); //程序开始 printf("%s",retText); return 0; } void utf8ToGbk(char *utf8String, char *gbkString) { wchar_t *unicodeStr = NULL; int nRetLen = 0; nRetLen = MultiByteToWideChar(CP_UTF8, 0, utf8String, -1, NULL, 0); //求需求的宽字符数大小 unicodeStr = (wchar_t *)malloc(nRetLen * sizeof(wchar_t)); nRetLen = MultiByteToWideChar(CP_UTF8, 0, utf8String, -1, unicodeStr, nRetLen); //将utf-8编码转换成unicode编码 nRetLen = WideCharToMultiByte(CP_ACP, 0, unicodeStr, -1, NULL, 0, NULL, 0); //求转换所需字节数 nRetLen = WideCharToMultiByte(CP_ACP, 0, unicodeStr, -1, gbkString, nRetLen, NULL, 0); //unicode编码转换成gbk编码 free(unicodeStr); }
C++语言:
#include <iostream> #include <windows.h> void utf8ToGbk(char *utf8String, char *gbkString); using namespace std; int main(int argc, char **argv) { //程序开始 char text[MAX_PATH]="中文测试"; char retText[MAX_PATH]={"\0"}; utf8ToGbk(text,retText); cout << retText << endl; return 0; } void utf8ToGbk(char *utf8String, char *gbkString) { wchar_t *unicodeStr = NULL; int nRetLen = 0; nRetLen = MultiByteToWideChar(CP_UTF8, 0, utf8String, -1, NULL, 0); //求需求的宽字符数大小 unicodeStr = (wchar_t *)malloc(nRetLen * sizeof(wchar_t)); nRetLen = MultiByteToWideChar(CP_UTF8, 0, utf8String, -1, unicodeStr, nRetLen); //将utf-8编码转换成unicode编码 nRetLen = WideCharToMultiByte(CP_ACP, 0, unicodeStr, -1, NULL, 0, NULL, 0); //求转换所需字节数 nRetLen = WideCharToMultiByte(CP_ACP, 0, unicodeStr, -1, gbkString, nRetLen, NULL, 0); //unicode编码转换成gbk编码 free(unicodeStr); }