文章目录
- 问题描述
- c++ 代码
- CMakeLists.txt
- 参考链接
问题描述
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 C3return 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