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);
}

 

posted @ 2022-11-01 10:36  烟熏牛肉干  阅读(2858)  评论(0编辑  收藏  举报