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

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

字符集相关的方法:

  • 主要是为了解决跨平台的问题
  • 其次对一些常见操作做了封装
  • 命名空间: 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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值