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

在使用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: 女孩不哭

时间: 2024-10-21 19:48:14

为SQLite3提供一个ANSI到UTF8的互转函数_SQLite的相关文章

语音通信-有人能提供一个imsdroid能正常运行并能接电话的源码么?

问题描述 有人能提供一个imsdroid能正常运行并能接电话的源码么? 本人正在做一个基于imsdroid的语音通话的项目.可是集成了代码之后,发现不能接听电话.希望有人能提供一份imsdroid的源码,万分感谢. 我每次拨打电话之后,接听电话的时候会报错提示是没有找到匹配的解码器.可是我发现我的在选项中选的解码器应该是没有问题的 ,我不知道是不是我的代码有问题. 如果有人做过imsdroid相关的项目,能正常接听电话.希望能提供一份简单的demo就可以了. 再次万分感谢.

技术-求助:提供一个入侵阿里的思路

问题描述 求助:提供一个入侵阿里的思路 谁能提供一个入侵阿里的思路.当然,不是真的去做,只是想知了解学习这个思路本身涉及 到的知识和技术. 解决方案 要给你的思路就是"水无常形兵无常态",作为阿里这样面向全球的服务器,能对他发起攻击取得成功的人必然非常少.如果这种技术公开到可以在一个免费和公开的论坛中随便讨论的话,那么阿里早歇菜了. 解决方案二: 就算有,也仅仅只是涉及小范围的漏洞,不久就会被发现并且补上

各位能不能提供一个MFC框架的C++计费系统,要是完整的实验报告和可直接运行的代码,希望大神帮帮忙吧

问题描述 各位能不能提供一个MFC框架的C++计费系统,要是完整的实验报告和可直接运行的代码,希望大神帮帮忙吧 高手有赏追加30金币,说到做到,为了应付学校的生产实习来着,还请各位理解............................................ 解决方案 那你google下吧,只是一个现成的报告,自己找找.我要睡觉了,懒得帮你了. 解决方案二: 一般代写论文是300~500每篇,折合成"金币"大约是6000~10000,而且因为"金币"没

c++-请教:一个完整的C++程序如何提供一个接口给其他软件使用

问题描述 请教:一个完整的C++程序如何提供一个接口给其他软件使用 如题.我用C++做了一个软件,现在想提供一个dll给另一个软件使用.要如何做?是直接在这个C++程序上做接口,还是另外建一个工程来生成dll? 请教大神们啦~谢谢 解决方案 要看另一个软件是需要如何和你的程序交互. 用到你程序的一部分,那么开放dll 只是传递数据的话,提供数据传递的标准,让它自己实现 希望整体嵌入你的程序,那么你实现一个OLE Server,让它用OLE Container嵌入你的程序. 如果那个程序不在本地,

技术-菜鸟急求!!哪位大神可以提供一个从零基础开始的extjs5教程,最好是视频教程

问题描述 菜鸟急求!!哪位大神可以提供一个从零基础开始的extjs5教程,最好是视频教程 小弟实习生一枚,现在跟着团队做一个项目 需要用到extjs5的前台技术 以前一点都没有接触到 哪位大神有教程 送小弟一份 解决方案 最好的教程就是自己动手做一做,然后对照官方文档,官方文档写的很详细 解决方案二: 有js基础自己啃api+下载的DEMO就好了.. 没有js基础直接学ext还是比较难..

ubuntu 14.04-ubuntu 输入gedit,结果如图,我是小白,能不能提供一个简单易操作的方法

问题描述 ubuntu 输入gedit,结果如图,我是小白,能不能提供一个简单易操作的方法 10C 解决方案 建议还是使用vi或vim吧. 解决方案二: 或许在tty1终端下不支持,试试terminal,应该就可以打开了 解决方案三: 你这是在tty终端环境下,不是在x视窗下,gedit是一个gtk的图形界面程序,在这个环境下当然不能运行了 解决方案四: 装个vim吧,那个好用 解决方案五: gedit是图形界面的编辑器,要去图形界面下打开,纯字符界面还是用vim吧. 解决方案六: 字符界面,用

c++-“使用拷贝初始化时,只能提供一个初始值”是什么意思?

问题描述 "使用拷贝初始化时,只能提供一个初始值"是什么意思? <C++ Primer>第五版,中文版.88 页. 提供两个初始值是什么样的? when we use the copy initialization form (i.e., when we use =) (§ 3.2.1, p. 84), we can supply only a single initializer; 解决方案 你不可能用两个值来初始化对象吧 解决方案二: 这句话的意思是当你是用拷贝初始化的

JDBC中SQLData是如何实现的?最好提供一个范例

问题描述 JDBC中SQLData是如何实现的?最好提供一个范例 当我们创建自定义类型,并映射到mysql数据库时,如何建立该类型和sql类型的映射? 用户自定义的数据类型通过setObject()方法映射到SQL类型时,需要实现SQLData接口? 最好提供一个完整范例 解决方案 补充一下,连接方式是JDBC,数据库是mysql,知道使用hibernate或者mybatis可以直接映射, 但是目前在学习jdbc,希望了解的指点一下 解决方案二: 网友提供的hibernate 的一个范例 解决方

方法-请高手提供一个可行的reportViewer的打印思路

问题描述 请高手提供一个可行的reportViewer的打印思路 接到一个很简单的要求,有一个小表格,要从数据库中提出相应的格子中后进行打印,虽然填充字段很少,但条数很多,由于表格很小,A4幅面的纸要纵向打3个,前面都很简单,用reportViewer很快搞定,问题出在打印排版上,由于要产生很多页,因为表格和页幅的不能很精确控制,在后面会发生表跨页的问题,影响使用.不知各位高手能提供有效的思路. 我想了几个方法都未成功: 1.在一页上做了三个同样的小表格分了三组,进行不同数据源的字段绑定,在最后