【iconv】Linux c++ 中文字符串转十六进制 GBK 编码/内码

文章目录

问题描述

Linux 系统默认使用的是 UTF-8 编码,并且 c++ 中没有标准库可以直接将中文字符转为 GBK 编码/内码。因此需要借助 iconv 库来实现。

在实现代码之前,可以在一下在线工具网站进行中文字符到各个编码的双向转换:

汉字字符集编码查询:https://www.qqxiuzi.cn/bianma/zifuji.php

c++ 代码

cpp 复制代码
#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

sh 复制代码
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

相关推荐
楚枫默寒6 小时前
Linux 编辑文件后自动添加修改日期
linux·运维·bash
2601_961194028 小时前
27考研刘晓艳单词pdf
linux·sql·ubuntu·华为·pdf·.net
2023自学中10 小时前
imx6ull 开发板 推流ov5640数据,虚拟机用 ffplay 拉流播放
linux·音视频·嵌入式·开发板
shandianchengzi10 小时前
【记录】Ghidra|Ubuntu 26.04 下 Ghidra 界面缩放完整指南
linux·ubuntu·逆向·ghidra
Soari10 小时前
Ubuntu 根分区文件系统损坏,系统启动时自动检查失败
linux·运维·ubuntu
杨云龙UP11 小时前
Oracle Health Check巡检脚本使用SOP V2.0:从HTML原始报告→生成Word专业巡检报告→交付客户_2026-06-03
linux·运维·数据库·sql·oracle·报告·巡检
广州灵眸科技有限公司11 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) Linux虚拟机准备
linux·运维·服务器
feng_you_ying_li12 小时前
C++复习二,继承与多态
c++
Peace12 小时前
【Prometheus】
linux·运维·prometheus
小小de风呀12 小时前
de风——【从零开始学C++】(十一):list的基本使用和模拟实现
开发语言·c++·list