【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

相关推荐
奔跑吧 android1 小时前
【linux kernel 常用数据结构和设计模式】【数据结构 2】【通过一个案例属性list、hlist、rbtree、xarray数据结构使用】
linux·数据结构·list·kernel·rbtree·hlist·xarray
汉克老师2 小时前
第十四届蓝桥杯青少组C++选拔赛[2023.2.12]第二部分编程题(5、机甲战士)
c++·算法·蓝桥杯·01背包·蓝桥杯c++·c++蓝桥杯
Mr_Xuhhh3 小时前
项目需求分析(2)
c++·算法·leetcode·log4j
NiKo_W3 小时前
Linux 文件系统与基础指令
linux·开发语言·指令
PAK向日葵3 小时前
【C/C++】面试官:手写一个memmove,要求性能尽可能高
c语言·c++·面试
Jared_devin4 小时前
二叉树算法题—— [蓝桥杯 2019 省 AB] 完全二叉树的权值
数据结构·c++·算法·职场和发展·蓝桥杯
搞全栈小苏4 小时前
基于Qt QML和C++的MQTT测试客户端(CMakeLists实现)
xml·c++·qt
啊?啊?4 小时前
18 从对象内存到函数调用:C++ 虚函数表原理(继承覆盖 / 动态绑定)+ 多态实战
开发语言·c++·多态原理
bkspiderx4 小时前
C++标准库:文件流类
开发语言·c++
Darkwanderor5 小时前
Linux 的权限详解
linux