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

随心笔谈2年前发布 admin
187 0 0

文章摘要

这篇文章介绍了两个C语言函数,`to_utf8` 和 `to_gb`,用于字符编码转换。这两个函数的主要目的是将普通的字符编码转换为UTF-8编码,以及将UTF-8编码转换为GB编码。文章详细描述了函数的实现逻辑,包括对源字符进行多字节到宽字符的转换,以及对目标编码的处理。此外,文章还提到了函数如何处理内存分配和错误情况(如返回值为负数)。整体来看,文章的核心内容是围绕字符编码转换的实现细节展开的。

#include

#include 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;

    }

}

© 版权声明

相关文章