【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

相关推荐
程序员与背包客_CoderZ12 分钟前
高性能分布式KV存储引擎RocksDB入门与C/C++编码实战
c语言·开发语言·数据库·c++·分布式·分布式数据库·rocksdb
进击的_鹏14 分钟前
从零开始的 Redis 学习
服务器·数据库·c++·redis·缓存
实心儿儿27 分钟前
Linux —— 传输层协议TCP
linux·服务器·tcp/ip
祖力5539 分钟前
Linux应用软件编程:目录IO与framebuffer
linux·运维·算法·framebuffer·目录io
词却1 小时前
Linux基础:常用基本命令与软件包管理
linux
_Narcissus_1 小时前
链表算法题和静态链表
数据结构·c++·笔记·算法·链表·ai·力扣
布莱克6051 小时前
C++拷贝构造与拷贝赋值运算符的区别详解
开发语言·c++
2401_890603402 小时前
Linux 进程控制
linux·运维·服务器
啦啦啦啦啦zzzz2 小时前
时间轮定时器
linux·服务器·网络·c++·定时器
神威难绷泪3 小时前
Linux应用软件编程:目录IO framebuffer
linux