当前位置:首页 > > 充电吧
[导读]        在上篇文章中介绍了多字节字符集和unicode字符集,今天介绍下两大字符集之间的转换方式。        首先谈谈的是微软对于unicode字符集的态度。在windows的开发体系下,

        在上篇文章中介绍了多字节字符集和unicode字符集,今天介绍下两大字符集之间的转换方式。

 

       首先谈谈的是微软对于unicode字符集的态度。在windows的开发体系下,unicode字符字符集被称为宽字节字符集,多字节字符集被称为窄字符集。微软对unicode字符集是大力支持的。从以下几点可以看出:从windows2000开始使用unicode进行开发;Windows CE 本身就是使用Unicode的一种操作系统,完全不支持ANSI版Windows API函数;新建的VC工程默认使用的是unicode字符集(utf16)。那么问题来了,作为一个C++程序员,是否该使用unicode字符集。

 

       为什么使用Unicode字符集?提升运行效率,比如Windows内核本身是基于unicode字符的,非unicode字符传进入要先转成unicode字符(《windows核心编程有详细解释》);在不同语言中可以方便交换数据,比如在英文版操作系统中输入中文路径,如果是非unicode字符同时又没有安装中文字符集,那么就会出现乱码。

 

         为什么不使用Unicode字符集?因为传统的势力很强大,很多跨平台的第三方库都是基于多字节字节集进行开发,还有就是编程习惯,比如在Windows下开发,大家耳熟能详的是计算字符串长度的函数是strlen,谁会去用宽字节版的wcslen呢。详见我以前写的文章:

《unicode字符集,用还是不用?》

 

       最后谈谈多字节字符集和unicode字符集。两种方式,一种是使用跨平台的iconv库,示例代码如下:


include#include#includeusing namespace std;

#include//编码转换库

#define OUTLEN 255 //文件路径长度

//代码转换:从一种编码转为另一种编码
int code_convert(char *from_charset, char *to_charset, char *inbuf, size_t inlen, char *outbuf, size_t  outlen)
{
iconv_t cd;
char **pin = &inbuf;
char **pout = &outbuf;

cd = iconv_open(to_charset,from_charset);
if (cd==0) 
return -1;
memset(outbuf,0,outlen);

if (iconv(cd,pin,&inlen,pout,&outlen)==-1)
return -1;
iconv_close(cd);
return 0;
}
//UNICODE码转为GB2312码
int u2g(char *inbuf, size_t  inlen, char *outbuf, size_t  outlen)
{
return code_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen);
}
//GB2312码转为UNICODE码
int g2u(char *inbuf, size_t inlen, char *outbuf, size_t outlen)
{
return code_convert("gb2312","utf-8",inbuf,inlen,outbuf,outlen);
}

//执行SQL语句回调函数
static int _sql_callback(void* pUsed, int argc, char** argv, char** ppszColName)
{
for(int i=0; i<argc; i++)
{
printf("%s = %s/n", ppszColName[i], argv[i]==0 ? "NULL" : argv[i]);
}
return 0;
}

void main()
{
char *in_gb2312 = "D://控制点库//GCPDB.3sdb";

char out[OUTLEN];
  
//gb2312码转为unicode码
g2u(in_gb2312,strlen(in_gb2312),out,OUTLEN);
printf("gb2312-->unicode out=%s /n",out);
}


另一种方式是使用使用WindiwsAPI,示例代码如下:

std::string MbcsToUtf8( const char* pszMbcs )  
    {  
        std::string str;  
        WCHAR   *pwchar=0;  
        CHAR    *pchar=0;  
        int len=0;  
        int codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP;  
        len=MultiByteToWideChar(codepage, 0, pszMbcs, -1, NULL,0);  
        pwchar=new WCHAR[len];  
        if(pwchar!=0)  
        {  
            len = MultiByteToWideChar(codepage, 0, pszMbcs, -1, pwchar, len);  
            if( len!=0 )  
            {  
                len = WideCharToMultiByte(CP_UTF8, 0, pwchar, -1, 0, 0, 0, 0);  
                pchar=new CHAR[len];  
                if(pchar!=0)  
                {  
                    len = WideCharToMultiByte(CP_UTF8, 0, pwchar, -1, pchar, len,0, 0);  
                    if(len!=0)                  
                    {  
                        str = pchar;                     
                    }  
                    delete pchar;  
                }  
                delete pwchar;  
            }  
        }  
        return str;  
}


参考文献:

 

1. 使用SQLite3支持中文路径

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭