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

所属分类: 数据库 / SQLite 阅读数: 277
收藏 0 赞 0 分享

在使用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字符串比较时的大小写问题解决方法,本文总结了比较字符串时的大小写问题的3种解决方案,需要的朋友可以参考下
收藏 0 赞 0 分享

Sqlite数据库里插入数据的条数上限是500

sqlite每次只能插入的数据不能超过500条数据,大家在使用的时候需要注意一下。
收藏 0 赞 0 分享

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

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

SQLite教程(二):C/C++接口简介

这篇文章主要介绍了SQLite教程(二):C/C++接口简介,本文讲解了C/C++接口概述、核心对象和接口、参数绑定等内容,需要的朋友可以参考下
收藏 0 赞 0 分享

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

这篇文章主要介绍了SQLite教程(三):数据表和视图简介,本文讲解了创建数据表、表的修改、表的删除、创建视图、删除视图等内容,需要的朋友可以参考下
收藏 0 赞 0 分享

SQLite教程(四):内置函数

这篇文章主要介绍了SQLite教程(四):内置函数,本文讲解了聚合函数、核心函数、日期和时间函数、,需要的朋友可以参考下
收藏 0 赞 0 分享

SQLite教程(五):索引和数据分析/清理

这篇文章主要介绍了SQLite教程(五):索引和数据分析/清理,本文讲解了创建索引、删除索引、重建索引、数据分析、数据清理等内容,需要的朋友可以参考下
收藏 0 赞 0 分享

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

这篇文章主要介绍了SQLite教程(五):数据库和事务,本文讲解了Attach数据库、Detach数据库、事务等内容,需要的朋友可以参考下
收藏 0 赞 0 分享

SQLite教程(六):表达式详解

这篇文章主要介绍了SQLite教程(六):表达式详解,本文讲解了常用表达式、条件表达式、转换表达式等内容,需要的朋友可以参考下
收藏 0 赞 0 分享

SQLite教程(八):命令行工具介绍

这篇文章主要介绍了SQLite教程(八):命令行工具介绍,本文罗列了所有内置命令,并对命令作用做了说明,然后给出了常用示例,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多