昂首向深蓝 發表於 2013-12-18 00:16:13

为SQLite3提供一个ANSI到UTF8的互转函数

<P>在使用Sqlite3时必须要用到的</P>
<P>  使用方法:</P>
<P>  char* src = "...";//待转换的ANSI或UTF8字符串<BR>  char* dst = NULL;//保存由函数内部分配的内存指针, 不需要传入内存缓冲区的</P>
<P>  转换为UTF-8:to_utf8(src, &amp;dst);<BR>  转换为ANSI:to_gb(src, &amp;dst);</P>
<P>  返回值:零 - 失败, 非零 - 成功.<BR>  注意:如果操作成功, 需要手动释放函数内部分配的空间:</P>
<P><div class="codetitle"><span><a data="9931" class="copybut" id="copybut9931"><U>复制代码</U></a></span> 代码如下:</div><div class="codebody" id="code9931"><BR>if(dst)<BR>{<BR>&nbsp;&nbsp;&nbsp; free(dst);<BR>&nbsp;&nbsp;&nbsp; dst = NULL;<BR>}<BR></div></P>
<P>代码:</P>
<P><div class="codetitle"><span><a data="1645" class="copybut" id="copybut1645"><U>复制代码</U></a></span> 代码如下:</div><div class="codebody" id="code1645"><BR>#include &lt;windows.h&gt;<BR>#include &lt;stdio.h&gt;int to_utf8(char* psrc, char** ppdst)<BR>{<BR>&nbsp;&nbsp;&nbsp; int ret,ret2;<BR>&nbsp;&nbsp;&nbsp; wchar_t* pws = NULL;<BR>&nbsp;&nbsp;&nbsp; char* putf = NULL;</P>
<P>&nbsp;&nbsp;&nbsp; ret = MultiByteToWideChar(CP_ACP, 0, psrc, -1, NULL, 0);<BR>&nbsp;&nbsp;&nbsp; if(ret&lt;=0){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *ppdst = NULL;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; pws = (wchar_t*)malloc(ret*2);<BR>&nbsp;&nbsp;&nbsp; if(!pws){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *ppdst = NULL;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; MultiByteToWideChar(CP_ACP, 0, psrc, -1, pws, ret);<BR>&nbsp;&nbsp;&nbsp; ret2 = WideCharToMultiByte(CP_UTF8, 0, pws, -1, NULL, 0, NULL, NULL);<BR>&nbsp;&nbsp;&nbsp; if(ret2&lt;=0){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(pws);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; putf = (char*)malloc(ret2);<BR>&nbsp;&nbsp;&nbsp; if(!putf){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(pws);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; if(WideCharToMultiByte(CP_UTF8, 0, pws, ret, putf, ret2, NULL, NULL)){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *ppdst = putf;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(pws);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1;<BR>&nbsp;&nbsp;&nbsp; }else{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(pws);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(putf);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *ppdst = NULL;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<BR>&nbsp;&nbsp;&nbsp; }<BR>}</P>
<P>int to_gb(char* psrc, char** ppdst)<BR>{<BR>&nbsp;&nbsp;&nbsp; int ret, ret2;<BR>&nbsp;&nbsp;&nbsp; wchar_t* pws = NULL;<BR>&nbsp;&nbsp;&nbsp; char* pgb = NULL;<BR>&nbsp;&nbsp;&nbsp; ret = MultiByteToWideChar(CP_UTF8, 0, psrc, -1, NULL, 0);<BR>&nbsp;&nbsp;&nbsp; if(ret&lt;=0){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *ppdst = NULL;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; pws = (wchar_t*)malloc(ret*2);<BR>&nbsp;&nbsp;&nbsp; if(!pws){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *ppdst = NULL;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; MultiByteToWideChar(CP_UTF8, 0, psrc, -1, pws, ret);<BR>&nbsp;&nbsp;&nbsp; ret2 = WideCharToMultiByte(CP_ACP, 0, pws, -1, NULL, 0, NULL, NULL);<BR>&nbsp;&nbsp;&nbsp; if(ret2&lt;=0){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(pws);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; pgb = (char*)malloc(ret2);<BR>&nbsp;&nbsp;&nbsp; if(!pgb){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(pws);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *ppdst = NULL;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; if(WideCharToMultiByte(CP_ACP, 0, pws, -1, pgb, ret2, NULL, NULL)){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *ppdst = pgb;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(pws);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1;<BR>&nbsp;&nbsp;&nbsp; }else{*ppdst = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(pgb);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(pws);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<BR>&nbsp;&nbsp;&nbsp; }<BR>}<BR></div></P>
<P>by: 女孩不哭</P>
頁: [1]
查看完整版本: 为SQLite3提供一个ANSI到UTF8的互转函数