【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

相关推荐
冰橙子id1 小时前
linux-远程访问管理(sshd,scp,sftp)
linux·网络·ssh
还债大湿兄1 小时前
《C++内存泄漏8大战场:Qt/MFC实战详解 + 面试高频陷阱破解》
c++·qt·mfc
光电的一只菜鸡2 小时前
ubuntu之坑(十五)——设备树
linux·数据库·ubuntu
saynaihe4 小时前
ubuntu 22.04 anaconda comfyui安装
linux·运维·服务器·ubuntu
企鹅与蟒蛇4 小时前
Ubuntu-25.04 Wayland桌面环境安装Anaconda3之后无法启动anaconda-navigator问题解决
linux·运维·python·ubuntu·anaconda
珊瑚里的鱼4 小时前
LeetCode 692题解 | 前K个高频单词
开发语言·c++·算法·leetcode·职场和发展·学习方法
程序设计实验室4 小时前
小心误关了NAS服务器!修改Linux的电源键功能
linux·nas
AI+程序员在路上4 小时前
QTextCodec的功能及其在Qt5及Qt6中的演变
开发语言·c++·qt
Risehuxyc4 小时前
C++卸载了会影响电脑正常使用吗?解析C++运行库的作用与卸载后果
开发语言·c++
渡我白衣7 小时前
Linux操作系统之信号:信号的产生
linux