Linux C++ 乱码字符转换问题 GBK转UTF8

2023-05-16

本例来源于CSDN的另一篇博客,但并非是复读机。原博客使用char类型作为输入,需要传递src_len和dst_len,用起来比较难受。本文使用std::string做了封装,不需要传递src_len和dst_len,代价就是在函数中动态分配了2src_len的空间。

#include <iostream>
#include <string>
#include <string.h>
#include <stdlib.h>
#include <iconv.h>
#include <fstream>

using namespace std;

bool encoding_convert(std::string const& src_str, std::string& dst_str, 
  std::string const& src_encoding, std::string const& dst_encoding)
{
  iconv_t cd;
  std::size_t src_len = src_str.size();
  std::size_t dst_len = src_len * 2;
  dst_str.resize(dst_len);
  cd = iconv_open(dst_encoding.c_str(), src_encoding.c_str());
  if (cd == 0)
  	return false;
  char* src_data = (char*)(src_str.data());
  char* dst_data = (char*)(dst_str.data());
  std::size_t left_len {dst_len};
  if (iconv(cd, &src_data, &src_len, &dst_data, &left_len) == -1)
  	return false;
  iconv_close(cd);
  dst_str.resize(dst_len-left_len);
  return true;
}

char const* GBK = "gbk";
char const* UTF8 = "utf8";

#define GBK_2_UTF8(src_str, dst_str) encoding_convert(src_str, dst_str, GBK, UTF8)
#define UTF8_2_GBK(src_str, dst_str) encoding_convert(src_str, dst_str, UTF8, GBK)


int main(int argc, char* argv[]) {
  std::string src = "\xc4\xe3\xba\xc3";
  std::string dst;
  std::fstream ofs("./result.txt", std::ios::out);
  
  GBK_2_UTF8(src, dst);
  std::cout << "Source GBK string:" << src << std::endl;
  std::cout << "Result UTF8 String: " << dst << std::endl;
  ofs << dst << std::endl;
  std::cout << "========================================" << std::endl;
  std::cout << std::endl;
  std::cout << std::endl;
  
  std::string src1 = "你好,小黄鸡,小黄鸭,小黄狗";
  std::string dst1;
  UTF8_2_GBK(src1, dst1);
  std::string res;
  GBK_2_UTF8(dst1, res);

  ofs << res << std::endl;
  ofs.close();

  std::cout << "Source UTF-8 string:" << src1 << std::endl;
  std::cout << "Result GBK string:" << dst1 << std::endl;
  std::cout << "Result UTF-8 string:" << res << std::endl;
  return EXIT_SUCCESS;
}

CMakeLists.txt


cmake_minimum_required(VERSION 2.6)
project(chat_room)

add_definitions(-std=c++14)


find_package(Boost REQUIRED COMPONENTS
  system
  filesystem
  serialization
  program_options
  thread
  )

include_directories(${Boost_INCLUDE_DIRS})

file( GLOB APP_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/*.h)
foreach( sourcefile ${APP_SOURCES} )
      file(RELATIVE_PATH filename ${CMAKE_CURRENT_SOURCE_DIR} ${sourcefile})
  if( "${filename}" STREQUAL "main.cpp")
      string(REPLACE ".cpp" "" file ${filename})
      add_executable(${file}  ${APP_SOURCES})
      target_link_libraries(${file} ${Boost_LIBRARIES})
      target_link_libraries(${file} pthread)
  endif()
endforeach( sourcefile ${APP_SOURCES})

程序输出如下,
在这里插入图片描述
result.txt文件内容如下,
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux C++ 乱码字符转换问题 GBK转UTF8 的相关文章

  • 应用程序中两个不同版本的库

    考虑一个场景 其中有两个不同版本的共享库 考虑 A 1 so 链接到 B so A 2 so 链接到 C so 现在 B so 和 C so 都链接到 d exe 当 B so 想要调用 A 1 so 中的函数时 它最终会调用 A 2 so
  • 如何在Linux上用C/C++编写Web服务器[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在考虑在 Linux 平台上开发一个小型 阅读 初级 Web 服务器 但我不知道从哪里开始 我希望它能够做的是 监听特定端口 接受
  • Linux 内核使用的设备树文件 (dtb) 可视化工具? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以图形化表示Linux内核中使用的硬件设备树的工具 我正在尝试了解特定 Arm 芯片组
  • 任何退出 bash 脚本但不退出终端的方法

    当我使用exitshell 脚本中的命令 该脚本将终止终端 提示符 有什么方法可以终止脚本然后停留在终端中吗 我的剧本run sh预计通过直接获取或从另一个脚本获取来执行 编辑 更具体地说 有两个脚本run2 sh as run sh ec
  • 对于任何真实数据集,数据压缩比的最小可能值是多少

    我在写信ZLIB类似于嵌入式硬件压缩器的 API 它使用 deflate 算法来压缩给定的输入流 在进一步讨论之前 我想解释一下数据压缩率 数据压缩率定义为未压缩大小与压缩大小之间的比率 压缩比通常大于一 这意味着压缩数据通常比未压缩数据小
  • 在本地主机上使用相同的 IP 和端口创建套接字

    我在 Linux 上看到奇怪的行为 我看到远程端和本地端都显示相同的 IP 和端口组合 以下是 netstat 输出 netstat anp 网络统计grep 6102 tcp 0 0 139 185 44 123 61020 0 0 0
  • 使用 ioctl 在 C++ 中以编程方式添加路由

    我编写了简单的 C 函数 添加了新路线 void addRoute int fd socket PF INET SOCK DGRAM IPPROTO IP struct rtentry route memset route 0 sizeof
  • 在 git 提交消息中使用任何 utf-8 字符是否安全?

    我发现使用 UTF8 字符 例如 很有用 请参阅here http www utf8icons com subsets dingbats 在提交消息中 重构 NewService 添加了更好的服务 OldServiceA 据我所见 它see
  • Python glob,操作系统,相对路径,将文件名放入列表中[重复]

    这个问题在这里已经有答案了 我正在尝试创建一个目录中所有文件的列表 其中文件名以 root 结尾 在阅读了论坛中的一些文章后 我尝试使用 glob 和 os listdir 的基本策略 但我都遇到了麻烦 首先 当我使用 import glo
  • 链接错误:命令行中缺少 DSO

    我对 Linux 使用 Ubuntu 14 04 LTS 64 位 相当陌生 来自 Windows 并且正在尝试移植我现有的 CUDA 项目 当通过链接时 usr local cuda bin nvcc arch compute 30 co
  • 如何从 C++ 程序中重新启动 Linux?

    我有一个 Qt 4 GUI 我需要在下拉菜单中提供一个选项 允许用户选择重新启动计算机 我意识到这对于以其他方式重新启动计算机的能力来说似乎是多余的 但选择需要保留在那里 我尝试使用 system 来调用以下内容 suid root she
  • Linux 使用 boost asio 拒绝套接字绑定权限

    我在绑定套接字时遇到问题 并且以用户身份运行程序时权限被拒绝 这行代码会产生错误 acceptor new boost asio ip tcp acceptor io boost asio ip tcp endpoint boost asi
  • 如何在 Linux 上通过 FTP 递归下载文件夹 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • 如何在不使用 IDE 的情况下在 Linux 上运行 Java 项目

    我是 Java 新手 基本上 我开发了一个java项目 其中包含Eclipse中的多个Java包 该项目在我安装了 redhat Linux 的桌面上运行正常 然而 我需要在一个更强大的没有安装X11的Linux服务器 redhat ent
  • 如何才能将 TCP 连接返回到同一端口?

    机器是 RHEL 5 3 内核 2 6 18 有时我在 netstat 中注意到我的应用程序有连接 建立了 TCP 连接本地地址 and 国外地址是一样的 其他人也报告了同样的问题 症状与链接中描述的相同 客户端连接到本地运行的服务器的端口
  • 在 docker 中重定向命令输出

    我想为我的服务器做一些简单的日志记录 它是一个在 Docker 容器中运行的小型 Flask 应用程序 这是 Dockerfile Dockerfile FROM dreen flask MAINTAINER dreen WORKDIR s
  • 批量删除文件名中包含 BASH 中特殊字符的子字符串

    我的目录中有一个文件列表 opencv calib3d so2410 so opencv contrib so2410 so opencv core so2410 so opencv features2d so2410 so opencv
  • ALSA:snd_pcm_writei 调用时缓冲区不足

    当运行我最近从灰烬中带回来的旧程序时 我遇到了缓冲区不足的情况 该程序将原始声音文件完全加载到内存中 2100 字节长 525 帧 并准备 ALSA 进行输出 44 1khz 2 通道 有符号 16 位 if err snd pcm set
  • 为什么 Linux 没有 DirectX API?

    在考虑现代显卡的 Windows 系统上 DirectX API 的驱动程序端实现时 我想知道为什么此实现在非 Windows 系统 尤其是 Linux 上不可用 由于明显缺乏此功能 我只能假设有一个我无视的充分理由 但在我的原始理解中 我
  • linux下无法创建僵尸进程

    嗯 我有一个奇怪的问题 我无法在我的项目中创建僵尸进程 但我可以在其他文件中创建僵尸进程 有简单的说明 int main if fork 0 printf Some instructions n else sleep 10 wait 0 r

随机推荐