如何使用 C++ 将 ISO-2022-KR 编码转换为 UTF-8 编码?

Posted

技术标签:

【中文标题】如何使用 C++ 将 ISO-2022-KR 编码转换为 UTF-8 编码?【英文标题】:How to convert ISO-2022-KR encoding to UTF-8 encoding using C++? 【发布时间】:2020-10-22 15:09:49 【问题描述】:

我有这些字符 (Bw@e),它们以 charset="iso-2022-kr" 编码。这些字符的十六进制值为 28 0E 42 77 40 65 0F 29。

在 Unix iconv 中有一个 API 可以将编码从 iso-2022-kr 转换为 utf-8。

示例:iconv -f iso-2022-kr -t utf8 输入 > 输出。

转换为 UTF-8 后,Hex 值为:28 EC B0 A8 EC 9E A5 29 (차장)

如果使用以下链接对上述十六进制值 (UTF-8) 进行解码:https://software.hixie.ch/utilities/cgi/unicode-decoder/utf8-decoder

结果: 作为原始字符:

(차장)

我正在寻找可以将编码从 iso-2022-kr 转换为 UTF-8 编码的 C++ 源代码。我已经处理了以 UTF-8 编码的解码部分。 任何帮助将不胜感激。

【问题讨论】:

iconv 也是一个库 (libiconv),它是可用的最佳选项之一。 【参考方案1】:

这是一个快速而肮脏的 C++ 程序,它演示了如何使用 iconv 库接口(可能需要与 -liconv 链接):

#include <cstdio>
#include <cstdlib>
#include <iconv.h>

int main()     
  iconv_t conv = iconv_open("utf-8", "iso-2022-kr");
  if (conv == reinterpret_cast<iconv_t>(-1)) 
    std::perror("iconv_open");
    return EXIT_FAILURE;
  

  char iso2022kr_buf[] = "\x28\x0E\x42\x77\x40\x65\x0F\x29";
  char utf8_buf[128];
  std::size_t kr_bytes = sizeof iso2022kr_buf - 1;
  std::size_t utf8_bytes = sizeof utf8_buf;    
  char *as_iso2022kr = iso2022kr_buf;
  char *as_utf8 = utf8_buf;

  std::size_t len = iconv(conv, &as_iso2022kr, &kr_bytes, &as_utf8, &utf8_bytes);
  if (len == static_cast<std::size_t>(-1)) 
    std::perror("iconv");
    return EXIT_FAILURE;
  
  *as_utf8 = '\0';
  for (const char *c = utf8_buf; c != as_utf8; c++) 
    std::printf("%02hhX ", *c);
  
  std::putchar('\n');

  std::puts(utf8_buf);
  
  iconv_close(conv);
  return 0;

在行动:

$ g++ -O -Wall -Wextra iconv_demo.cpp
$ ./a.out
28 EC B0 A8 EC 9E A5 29 
(차장)

【讨论】:

以上是关于如何使用 C++ 将 ISO-2022-KR 编码转换为 UTF-8 编码?的主要内容,如果未能解决你的问题,请参考以下文章

C++:如何将 std::string 的内容写入 UTF-8 编码文件?

FFMPEG 如何将 MJPEG 编码数据复用到 mp4 或 avi 容器 c++

如何将编码从 C 转换为 C++?

如何将超过 65536 字节的二进制数据编码为 c++ 上的 websocket 帧

如何在不将单独的帧图像写入磁盘的情况下从 C++ 程序中生成的多个图像编码视频?

使用 MATLAB 编码器将 MATLAB 转换为 C++