字符集转码, 字符集探测, LIB-ZC

LIB-ZC 对字符集转码做了封装, 支持字符集探测

字符集

extern const char *zvar_charset_chinese[];

= { "UTF-8", "GB18030", "BIG5", "UTF-7", 0 }

extern const char *zvar_charset_japanese[];

= { "UTF-8", "EUC-JP", "JIS", "SHIFT-JIS", "ISO-2022-JP", "UTF-7", 0 }

extern const char *zvar_charset_korean[];

= { "UTF-8", "KS_C_5601", "KS_C_5861", "UTF-7", 0 }

extern const char *zvar_charset_cjk[];

= { "UTF-8", "GB18030", "BIG5", "EUC-JP", "JIS", "SHIFT-JIS", "ISO-2022-JP", "KS_C_5601", "KS_C_5861", "UTF-7", 0 }

char *zcharset_correct_charset(const char *charset);

修正字符集名称, 如 "GBK' => "GB18030", "KS_C_5861" => "EUC-KR"

字符集转码

int zcharset_iconv(const char *from_charset, const char *src, int src_len,
  const char *to_charset, zbuf_t *result, int *src_converted_len,
  int omit_invalid_bytes_limit, int *omit_invalid_bytes_count);

字符集转码, 有点复杂, 建议再次封装

返回目标字符串的长度; 返回 -1: 错

简单用法

zbuf_t *result = zbuf_create(-1);
zcharset_iconv("GB18030", "abcdef", 6, "UTF-8" , result, 0, 0, 0);

例子: 字符集转码

类似 Linux 的程序 iconv

https://gitee.com/linuxmail/lib-zc/blob/master/sample/charset/iconv.c

字符集探测

char *zcharset_detect(const char **charset_list, const char *data, int size, zbuf_t *charset_result);

探测字符串 data 是什么字符集, 结果存储(覆盖)到 charset_result, 并返回 */
charset_list 是字符集列表, NULL 结尾

char *zcharset_detect_cjk(const char *data, int size, zbuf_t *charset_result);

如上, 探测范围 "中日韩"

字符集探测问答

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

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/sample/charset/detact.c

京ICP备18054515号-2 eli960@qq.com qq: 1537212398