当前位置: 首页 > news >正文

LIB-ZC, 一个跨平台(Linux)平台通用C/C++扩展库, 字符集转码/字符集探测

LIB-ZC, 一个跨平台(Linux)平台通用C/C++扩展库, 字符集转码/字符集探测

字符集DNS/IP相关的方法:

  • 主要是为了解决跨平台的问题
  • 其次对一些常见操作做了封装
  • 命名空间: zcc::charset

常用变量

const char *chinese[] = {"UTF-8", "GB18030", "BIG5", "UTF-7", 0};
const char *japanese[] = {"UTF-8", "EUC-JP", "SHIFT-JIS", "ISO-2022-JP", "UTF-7", 0};
const char *korean[] = {"UTF-8", "EUC-KR", "UTF-7", 0};
const char *cjk[] = {"WINDOWS-1252", "UTF-8", "GB18030", "BIG5", "EUC-JP", "SHIFT-JIS", "ISO-2022-JP", "EUC-KR", "UTF-7", 0};

字符集转码

inline std::string convert(const char *from_charset, const char *data, int size, const char *to_charset, int *invalid_bytes = 0);
std::string iconv_convert(const char *from_charset, const char *src, int src_len, const char *to_charset, int *invalid_bytes = 0);
std::string uconv_convert(const char *from_charset, const char *src, int src_len, const char *to_charset, int *invalid_bytes = 0);
// 转码为 UTF-8
std::string convert_to_utf8(const char *from_charset, const char *data, int size);
inline std::string convert_to_utf8(const char *data, int size);
inline std::string convert_to_utf8(const char *from_charset, const std::string &data);
inline std::string convert_to_utf8(const std::string &from_charset, const std::string &data);
inline std::string convert_to_utf8(const std::string &data);

例子: 字符集转码

类似 Linux 的程序 iconv

https://gitee.com/linuxmail/lib-zc/blob/master/cpp_sample/charset/iconv.cpp

字符集探测

// detect_data *dd 是自己的识别数据库
// charset_list 给定字符集列表
std::string detect(detect_data *dd, const char **charset_list, const char *data, int size);
// 在 CJK 范围内探测字符集
std::string detect_cjk(const char *data, int size);
inline std::string detect_cjk(const std::string &data);

字符集探测问答

: 下面字符串是什么字符集

const char *s="\xb9\xe3\xb6\xab\xca\xa1";

: 至少有 4 种字符集编码是合法的:

SHIFT-JIS     ケ羝ォハ。
EUC-JP        鴻叫福
BIG5          嫘陲吽
GB18030       广东省

从经验看应该是 GB18030

通过本文提供的函数可以做到正确识别

例子: 字符集探测

https://gitee.com/linuxmail/lib-zc/blob/master/cpp_sample/charset/detect.cpp

其他工具

// 不规范字符集修正, 返回字符集大写
// 如: "KS_C_5601-1989" => "EUC-KR"
const char *correct_name(const char *charset);
// utf8 截短
int utf8_tail_complete(const char *ps, int length);
char *utf8_tail_complete_and_terminate(char *ps, int length);
std::string &utf8_tail_complete_and_terminate(std::string &s);
// 从前往后取前宽度为need_width的字符. 一个英文字符算 1, 一个中文字符算 2
// 去除连续的空格, 去除不可显示字符, 去除换行符
std::string utf8_get_simple_digest(const char *s, int len, int need_width);
inline std::string utf8_get_simple_digest(const std::string &s, int need_width);
// UTF-8 一个 utf8 字符的字节数
static inline int utf8_len(const unsigned char *buf);
static inline int utf8_len(int ch);

相关文章:

  • IO流——字节输入输出流:FileInputStream FileOutputStream
  • 视频内容原数据获取接口开发指南
  • 直线模组过载使用会有什么效果?
  • 数据驱动的温暖守护:智慧康养平台如何实现 “千人千面” 的精准照护?
  • Python 根据多个下标向列表中插入对应的值的巧妙方法:逆序插入
  • React8+taro开发微信小程序,实现lottie动画
  • 编程规范(c++)
  • ecovadis评分要求,如何提高ecovadis分数,未来展望
  • GitHub 趋势日报 (2025年04月10日)
  • STM32嵌入式开发从入门到实战:全面指南与项目实践
  • 《Vue Router实战教程》19.滚动行为
  • 原生多模态大模型时代:统一感知的智能跃迁
  • Vue 3 国际化实战:支持 Element Plus 组件和语言持久化
  • Git开发
  • 【Java集合】TreeSet、TreeMap源码解读
  • BERT - 直接调用transformers.BertModel, BertTokenizerAPI不进行任何微调
  • C++动态分配内存知识点!
  • vue2使用ezuikit-js播放萤石视频
  • 手撕红黑树
  • Python Lambda表达式详解
  • 企业网站模板 下载 论坛/友情链接教程
  • 事业单位备案网站/百度指数怎样使用
  • 最专业的外贸网站建设/徐州seo外包
  • 怎么做网站收广告费/香港百度广告
  • 制作logo免费网站/360网站推广
  • 广东网站建设有限公司/百度seo提高排名费用