Skip to content

Latest commit

 

History

History
147 lines (116 loc) · 3.39 KB

README-cn.md

File metadata and controls

147 lines (116 loc) · 3.39 KB

ExIconv

这是一个C语言编码自动解析库

对于跨平台开发,推荐使用C++版estring,支持conan包管理器:https://github.com/sunxfancy/estring

整合了libiconv和libcharsetdetect 实现了自动读取文本并判断编码形式,转换为UTF-32方便处理

使用示例:

#include "stdio.h"
#include "exiconv.h"
#define BUFFER_SIZE 4096

int main(int argc, const char * argv[]) {
    FILE* f = fopen(argv[1], "r");
    size_t outsize;
    echar_t* str = autoreadfile(f, &outsize);
    printf("echar_len = %d\n", estrlen(str));
    char* utf8_str = conv2utf8(str, &outsize);
    printf("utf8:%s\n", utf8_str);
    fclose(f);
    return 0;
}

核心接口:

typedef uint32_t echar_t;
struct FILE;


/**
 * @brief 将UTF-32的字符串转换为utf8编码,便于输出
 * 
 * @param data UTF-32格式的字符串数组
 * @param outsize 转换后的C字符串长度
 * 
 * @return 转换后的字符串,会自动新malloc空间,用过后由调用者释放
 */
extern char* 
conv2utf8 (const echar_t* data, size_t* outsize);


/**
 * @brief 将utf8编码转换为内部UTF-32格式
 * 
 * @param data C风格字符串数组
 * @param outsize 转换后的UTF-32字符串长度
 * 
 * @return 转换后的字符串,会自动新malloc空间,用过后由调用者释放
 */
extern echar_t*
utf8conv2echar (const char* data, size_t* outsize);




/**
 * @brief 将UTF-32的字符串转换为utf8编码,便于输出
 * 
 * @param data UTF-32格式的字符串数组
 * @param outsize 转换后的C字符串长度
 * 
 * @return 转换后的字符串,会自动新malloc空间,用过后由调用者释放
 */
extern char* 
echar2code (const echar_t* data, size_t* outsize, const char* encode);


/**
 * @brief 将指定编码转换为内部UTF-32格式
 * 
 * @param data C风格字符串数组
 * @param outsize 转换后的UTF-32字符串长度
 * 
 * @return 转换后的字符串,会自动新malloc空间,用过后由调用者释放
 */
extern echar_t*
code2echar (const char* data, size_t* outsize, const char* encode);




/**
 * @brief 自动读取文件下的文本内容,识别文本编码,并自动转换位为UTF-32的内部编码格式
 * 
 * @param f 文件指针,读模式打开
 * @param outsize 转换后的字符串长度
 * 
 * @return 转换后的字符串,会自动新malloc空间,用过后由调用者释放
 */
extern echar_t*
autoreadfile (FILE* f, size_t* outsize);


/**
 * @brief 自动识别文本格式,并转换为内部使用的UTF-32
 * 
 * @param data 传入的字符串原始数据
 * @param outsize 转换后的字符串长度
 * 
 * @return 转换后的字符串,会自动新malloc空间,用过后由调用者释放
 */
extern echar_t*
autoreadchar (const char* data, size_t* outsize);


/**
 * @brief 分析该段字符串的编码
 * 
 * @param data 字符串元数据,必须\0结尾,否则可能异常
 * @return 编码名称,如果为NULL则分析失败
 */
extern const char*
encodedetect (const char* data);

/**
 * @brief 分析该文件的编码
 * 
 * @param data 文件指针
 * @return 编码名称,如果为NULL则分析失败
 */
extern const char*
fileencodedetect (FILE* f);


/**
 * @brief 字符串长度计算
 * 
 * @param str 要测量的字符串,必须0结尾
 * @return 长度
 */
extern size_t
estrlen (const echar_t* str);


/**
 * 释放字符串使用
 */
#define FreeStr(p) free_str((void**)&p)

extern void
free_str(void** p);