经常写一些控制台小程序,常常会遇到输出中文乱码的问题,在windwos下可以使用MultiByteToWideChar转换字符编码,但跨平台就需要cppp-reiconv这样的第三方字符编码处理库,且开源。
一、下载cppp-reiconv库的源码和静/动态库
GitHub 地址: https://github.com/cppp-project/cppp-reiconv
二、自行编译cppp-reiconv库
虽然cppp-reiconv提供静/动态库,但它注明了“Environment”是“MSVC”,我在windows下使用的GCC编译器,所以还是自己编译一下,以保证兼容性。这里使用CMAKE(GUI)。
设置好源码目录和Build目录后,分别点Configure和Generate生成CMAKE配置文件。
在控制台使用mingw32-make进行make。
会在Build目录生成bin和lib目录,里面就是动态库和静态库(win下也可以链接.a文件)。include是头文件目录。
三、cppp-reiconv库使用实例
main.cpp:(文件编码是UTF8)
#include <iostream>
#include "reiconv.hpp"
using namespace std;
using namespace cppp::base::reiconv;
/**
* 将UTF-8编码的字符串转换为GBK编码的字符串
* @param str 输入的UTF-8编码的字符串
* @return 转换后的GBK编码的字符串
*/
std::string UTF8_GBK(const std::string& str)
{
// 将输入字符串复制到vector中,以便于接下来的编码转换
std::vector<char> vec(str.begin(), str.end());
// 执行编码转换,将UTF-8编码转换为GBK编码
auto res=encode("UTF-8","GBK",vec);
std::string str_c;
// 从转换结果中构造GBK编码的字符串
str_c = std::string(res.data(), res.size());
return str_c;
}
int main()
{
//system("chcp 936");
cout <<UTF8_GBK("Hi中文\nабвгдеёжзийкхфутс\n替朗讯一顺要工要在一一人有的和主产不为这" )<< endl;
}
vscode的task.json文件:
{
"tasks": [
{
"type": "cppbuild",
"label": "cppp-reiconv-v2.1.0-test Debug",
"command": "G:\\GCC64\\TDM-GCC-64\\bin\\g++.exe",
"args": [
"-static",
"-I",
"${fileDirname}\\include",
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe",
"-L",
"${fileDirname}",
"-lcppp-reiconv.static"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
}
],
"version": "2.0.0"
}
运行效果:
可见,在65001编码的控制台下,输出中文是乱码,在936编码的控制台下,输出中文正常。
四、其他
经测试“MSVC“的库无法用GCC链接。