问题描述
Linux 系统默认使用的是 UTF-8 编码,并且 c++ 中没有标准库可以直接将中文字符转为 GBK 编码/内码。因此需要借助 iconv
库来实现。
在实现代码之前,可以在一下在线工具网站进行中文字符到各个编码的双向转换:
汉字字符集编码查询:https://www.qqxiuzi.cn/bianma/zifuji.php
c++ 代码
#include <iconv.h>
#include <iomanip>
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
// 将字符串转换为十六进制 GBK 编码, 例如 C4 E3 格式
string StringToGBK(const string &str) {
// 初始化 iconv 转换器
iconv_t cd = iconv_open("GBK", "UTF-8");
if (cd == (iconv_t)-1) {
cerr << "无法打开iconv转换器" << endl;
return "";
}
// 输入字符串和输出字符串
const char *inbuf = str.c_str();
size_t inbytesleft = str.size();
string outstr;
outstr.resize(str.size() * 2); // 预留足够的空间来存储转换后的结果
char *outbuf = &outstr[0];
size_t outbytesleft = outstr.size();
// 进行转换
size_t result = iconv(cd, (char **)&inbuf, &inbytesleft, &outbuf, &outbytesleft);
if (result == (size_t)-1) {
cerr << "转换失败: " << str << endl;
iconv_close(cd);
return "";
}
// 关闭 iconv 转换器
iconv_close(cd);
// 调整输出字符串的大小
outstr.resize(outstr.size() - outbytesleft);
// 转为十六进制 GBK 编码, 例如 C4 E3 格式
stringstream res_ss;
for (const char &character : outstr) {
res_ss << hex << setw(2) << setfill('0') << uppercase << static_cast<int>(static_cast<unsigned char>(character)) << " ";
}
return res_ss.str();
}
int main() {
// 编码
string str = "你好";
cout << StringToGBK(str) << endl;
// C4 E3 BA C3
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
project(encode_test)
# 查找 iconv 库的位置并添加到链接目录中
find_package(Iconv REQUIRED)
include_directories(
include
${ICONV_INCLUDE_DIRS}
)
file(GLOB_RECURSE SRC_FILES src/*)
add_executable(encode_test
${SRC_FILES}
)
target_link_libraries(encode_test
${ICONV_LIBRARIES}
)
参考链接
c++最全进制转化(含算法和函数分析):https://blog.csdn.net/qq_43621422/article/details/100586558