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

 更新时间:2013年12月18日 00:16:13   作者:  
这篇文章主要为大家分享下ANSI与UTF8的互转函数,需要的朋友可以收藏下

在使用Sqlite3时必须要用到的

  使用方法:

  char* src = "...";//待转换的ANSI或UTF8字符串
  char* dst = NULL;//保存由函数内部分配的内存指针, 不需要传入内存缓冲区的

  转换为UTF-8:to_utf8(src, &dst);
  转换为ANSI:to_gb(src, &dst);

  返回值:零 - 失败, 非零 - 成功.
  注意:如果操作成功, 需要手动释放函数内部分配的空间:

复制代码 代码如下:

if(dst)
{
    free(dst);
    dst = NULL;
}

代码:

复制代码 代码如下:

#include <windows.h>
#include <stdio.h>int to_utf8(char* psrc, char** ppdst)
{
    int ret,ret2;
    wchar_t* pws = NULL;
    char* putf = NULL;

    ret = MultiByteToWideChar(CP_ACP, 0, psrc, -1, NULL, 0);
    if(ret<=0){
        *ppdst = NULL;
        return 0;
    }
    pws = (wchar_t*)malloc(ret*2);
    if(!pws){
        *ppdst = NULL;
        return 0;
    }
    MultiByteToWideChar(CP_ACP, 0, psrc, -1, pws, ret);
    ret2 = WideCharToMultiByte(CP_UTF8, 0, pws, -1, NULL, 0, NULL, NULL);
    if(ret2<=0){
        free(pws);
        return 0;
    }
    putf = (char*)malloc(ret2);
    if(!putf){
        free(pws);
        return 0;
    }
    if(WideCharToMultiByte(CP_UTF8, 0, pws, ret, putf, ret2, NULL, NULL)){
        *ppdst = putf;
        free(pws);
        return 1;
    }else{
        free(pws);
        free(putf);
        *ppdst = NULL;
        return 0;
    }
}

int to_gb(char* psrc, char** ppdst)
{
    int ret, ret2;
    wchar_t* pws = NULL;
    char* pgb = NULL;
    ret = MultiByteToWideChar(CP_UTF8, 0, psrc, -1, NULL, 0);
    if(ret<=0){
        *ppdst = NULL;
        return 0;
    }
    pws = (wchar_t*)malloc(ret*2);
    if(!pws){
        *ppdst = NULL;
        return 0;
    }
    MultiByteToWideChar(CP_UTF8, 0, psrc, -1, pws, ret);
    ret2 = WideCharToMultiByte(CP_ACP, 0, pws, -1, NULL, 0, NULL, NULL);
    if(ret2<=0){
        free(pws);
        return 0;
    }
    pgb = (char*)malloc(ret2);
    if(!pgb){
        free(pws);
        *ppdst = NULL;
        return 0;
    }
    if(WideCharToMultiByte(CP_ACP, 0, pws, -1, pgb, ret2, NULL, NULL)){
        *ppdst = pgb;
        free(pws);
        return 1;
    }else{*ppdst = 0;
        free(pgb);
        free(pws);
        return 0;
    }
}

by: 女孩不哭

相关文章

  • SQLite教程(三):数据表和视图简介

    SQLite教程(三):数据表和视图简介

    这篇文章主要介绍了SQLite教程(三):数据表和视图简介,本文讲解了创建数据表、表的修改、表的删除、创建视图、删除视图等内容,需要的朋友可以参考下
    2015-05-05
  • SQL中使用ESCAPE定义转义符详解

    SQL中使用ESCAPE定义转义符详解

    这篇文章主要介绍了SQL中使用ESCAPE定义转义符的相关资料,需要的朋友可以参考下
    2016-09-09
  • SQLite 入门教程三 好多约束 Constraints

    SQLite 入门教程三 好多约束 Constraints

    在上一篇随笔的结尾,我提到了约束, 但是在那里我把它翻译成了限定符,不太准确,这里先更正一下,应该翻译成约束更贴切一点。 那么什么是约束呢
    2013-12-12
  • SQLite中重置自动编号列的方法

    SQLite中重置自动编号列的方法

    这篇文章主要介绍了SQLite中重置自动编号列的方法,本文讲解了3种情况和其对应解决方法,需要的朋友可以参考下
    2015-03-03
  • 基于sqlite特殊字符转义的实现方法

    基于sqlite特殊字符转义的实现方法

    本篇文章是对sqlite特殊字符转义的实现方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • SQLite教程(一):SQLite数据库介绍

    SQLite教程(一):SQLite数据库介绍

    这篇文章主要介绍了SQLite教程(一):SQLite数据库介绍,本文讲解了什么是SQLite、SQLite的主要优点、和RDBMS相比SQLite的一些劣势、个性化特征等内容,需要的朋友可以参考下
    2015-05-05
  • SQLite教程(五):数据库和事务

    SQLite教程(五):数据库和事务

    这篇文章主要介绍了SQLite教程(五):数据库和事务,本文讲解了Attach数据库、Detach数据库、事务等内容,需要的朋友可以参考下
    2015-05-05
  • Sqlite 操作类代码

    Sqlite 操作类代码

    这两天用了用SQLite,感觉比SQL CE好用多了,最主要的是性能好多了.这一点对手持设备来讲很重要.闲话少说,下来将怎么在WM用.NET CF访问SQLite.
    2009-11-11
  • SQLite教程(十四):C语言编程实例代码(2)

    SQLite教程(十四):C语言编程实例代码(2)

    这篇文章主要介绍了SQLite教程(十四):C语言编程实例代码(2),本文讲解了高效的批量数据插入和数据查询代码实例,需要的朋友可以参考下
    2015-05-05
  • SQLite优化方法

    SQLite优化方法

    SQLite的数据库本质上来讲就是一个磁盘上的文件,所以一切的数据库操作其实都会转化为对文件的操作,而频繁的文件操作将会是一个很好时的过程,会极大地影响数据库存取的速度。
    2008-09-09

最新评论