acl  3.5.3.0
charset_conv.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 
4 #include "string.hpp"
5 #include "pipe_stream.hpp"
6 
7 struct ACL_VSTRING;
8 
9 namespace acl {
10 
12 {
13 public:
14  charset_conv(void);
15  ~charset_conv(void);
16 
17  /**
18  * 设置是否允许将无效的字符集直接拷贝
19  * @param onoff {bool} 当为 true 时,则转码过程中如果遇到了
20  * 非法字符集,则直接拷贝,否则则跳过,默认情况下是直接拷贝
21  */
22  void set_add_invalid(bool onoff);
23 
24  /**
25  * 转换函数
26  * @param fromCharset {const char*} 源字符集
27  * @param toCharset {const char*} 目标字符集
28  * @param in {const char*} 输入的源数据地址(非空)
29  * @param n {size_t} 输入源数据的长度(>0)
30  * @param out {string*} 存储转换结果
31  * @return {bool} 转换是否成功
32  */
33  bool convert(const char* fromCharset, const char* toCharset,
34  const char* in, size_t n, string* out);
35 
36  /**
37  * 如果转换失败, 该函数返回出错原因
38  * @return {const char*} 出错原因
39  */
40  const char* serror(void) const;
41 
42  /**
43  * 重置转码状态, 该解析器便可重复使用, 但在再次使用前需要调用
44  * set(from, to) 设置源字符集与目标字符集
45  */
46  void reset(void);
47 
48  /* 流式分析过程:update_begin->update->update ... ->update_finish */
49 
50  /**
51  * 初始化流式分析的相关参数
52  * @param fromCharset {const char*} 源字符集
53  * @param toCharset {const char*} 目标字符集
54  * @return {bool} 初始化是否成功
55  */
56  bool update_begin(const char* fromCharset, const char* toCharset);
57 
58  /**
59  * 以流式方式进行字符集转换
60  * @param in {const char*} 源字符串
61  * @param len {size_t} in 字符串长度
62  * @param out {string*} 存储转换结果
63  * @return {bool} 当前转换过程是否成功
64  */
65  bool update(const char* in, size_t len, string* out);
66 
67  /**
68  * 流式转换结束后需要调用此函数提取最后的转换结果
69  * @param out {string*} 存储转换结果
70  */
71  void update_finish(string* out);
72 
73  /**
74  * 创建字符集转换器
75  * @param fromCharset {const char*} 源字符集
76  * @param toCharset {const char*} 目标字符集
77  * @return {charset_conv*} 如果输入参数非法,或源字符集
78  * 与目标字符集相同,或不支持两个字符集间的转换则返回NULL,
79  * 用完后需要调用 delete 删除
80  */
81  static charset_conv* create(const char* fromCharset,
82  const char* toCharset);
83 
84  // pipe_stream 虚函数重载
85 
86  virtual int push_pop(const char* in, size_t len,
87  string* out, size_t max = 0);
88  virtual int pop_end(string* out, size_t max = 0);
89  virtual void clear();
90 
91 private:
92  bool m_addInvalid; // 如果遇到无效的字符集,是否直接拷贝
93  string m_errmsg;
94  string* m_pBuf;
95  char m_fromCharset[32];
96  char m_toCharset[32];
97  void* m_iconv;
98  ACL_VSTRING* m_pInBuf;
99  ACL_VSTRING* m_pOutBuf;
100  const char* m_pUtf8Pre;
101 };
102 
103 } // namespace acl
#define ACL_CPP_API