为SQLite3提供一个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: 女孩不哭



相关阅读:
CSS设置未知大小图片在已知大小容器水平垂直居中
163的邮件用phpmailer发送(实例详解)
PHP使用Pear发送邮件(Windows环境)
Windows10任务栏图标透明化让界面更漂亮
Win10应用商店可以打开点击软件的时候出现闪退问题怎么办?
又一个PHP实现的冒泡排序算法分享
asp.net图片上传实例
CSS HACK收集:关于IE6/FF/google等浏览器hack的方法详细
Android 控制wifi 相关操作实例
详解ASP.NET页面生命周期
Android开发常见问题总结
用CSS3实现Win8风格的方格导航菜单效果
Oracle中如何把表和索引放在不同的表空间里
js实现卡片式项目管理界面UI设计效果
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 北戴河-济南西 虢镇-新乡 福山口-燕山 金华-徐闻 渠旧-凭祥 武夷山-六盘水 民权-余姚 镇赉-刘家河 福州-西乡 南头-唐家湾 会同-海石湾 赤峰-康庄 周家-吉林 古田北-武夷山北 文昌-临高南 滦县-霸州 西安北-平遥古城 林西-包头 南宁-金鸡村 绵阳-陇西 运城-德州 高密-新干 新松浦-大虎山 麻山-永安乡 南阳-新乡 广州东-分宜 盘关-松河 东莞东-渠县 威舍-柳州 宇宙地-二道沟 保定-金昌 低庄-衡阳 白河东-襄阳东 进贤-兴国 南平北-龙游 东乡-遂溪 奉化-临海 福州南-惠东 保定-北京东 新绛-深州 大青沟-霍林郭勒 酒泉-安康 枣庄西-涡阳 坪石-黔江 集宁南-黄陵南 任丘-古田 胶州-蕲春 丹阳-丹徒 永甸-天桥 巨宝-工农湖 宁武-临汾 许昌东-汉口 辽阳-苏州北 新窝铺-风水沟 柳州-萍乡 虢镇-郴州 葫芦岛-建阳 惠州南-松江南 南平北-高密 呼和浩特东-白银西 冠豸山-聊城 安达-红旗营 滁州-临海 遵义-宁波 蔡家沟-德惠 渭南-祁县 深圳-盘锦 温州南-福鼎 安庆西-邵东 开通-碧州 济南东-靖边 黄山-贵溪 饶平-霞浦 陆川-息烽 晋城-广水 信阳东-庆盛 四平-兴国 江油-文水 交城-济南 平庄-大平房 现在的从东莞到桂林的票价钱数是多少
山东泰安到徐州丰县有多少公里
泉州东到永和镇锦岭南区怎么坐车·
昆明到厦门列车火车票价格
一到六年级有什么课文跟记金华的双龙洞一样是游览顺序的
张家界在那个省
青岛火车列车站到流亭机场打车要多长时间到
从枣强到天津站的列车火车时间表
如果有东西要邮寄到“深圳市平山南部日立环球宿舍c2307宿舍”
晚上10点以后有从大连到四平或沈阳的客车吗在哪坐啊急死了
北京到云南7日游相关问题
从深圳机场去重庆开县坐飞机怎么走
重庆到遵义 列车火车
北京植物园内有黄叶村曹雪芹故居,请问那个是真的吗?
从吉林省延吉市到山东省济宁市鱼台县怎么走
巴中到北京零担有什么物流
一般情况重庆到垫江在哪里坐车
从溧阳到常州的汽车时刻及票价。
从土门新村到青羊区东胜街怎样做公交车
莱西到邹城的列车火车
开车从郑州到太原怎么坐车需要多长时间
北京到承德市的动车或城际火车列车详细时间
急需天门山怎么去?
长沙到武汉高铁票怎么买便宜
邹城到北京多长时间坐汽车
从市区万红一村到张家港港城驾校乘几路公交车
上饶——玉山的客车汽车最晚一班是几点的
1月去梅里雪山
海宁到鹰潭有动车吗..?
宿州到蒙城有长途汽车吗多少钱走几分钟能到

Copyright © 2016 phpStudy |