字符集研究之不同字符集的转换方式

作者:朱金灿

来源:http://blog.csdn.net/clever101

在上篇文章中介绍了多字节字符集和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 <stdio.h>
#include <stdlib.h>
#include <string>
using namespace std;

#include <iconv.h> //编码转换库

#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支持中文路径

时间: 2024-12-23 01:56:52

字符集研究之不同字符集的转换方式的相关文章

字符集研究之多字节字符集和unicode字符集

作者:朱金灿 来源:http://blog.csdn.net/clever101 本文简介计算机中两大字符集:多字节字符集和unicode字符集的出现及关系. 首先我们须要明确的是计算机是怎样找到字符的,原来计算机通过一个字符编号来找到字符,这个和学校里每一个学生都有一个学号相似.这里的字符编号和相应的字符就构成了一个字符集.由于计算机最早是在英语国家诞生的,大多数英文信息是由英文字母.数字以及一些其他字符构成了一个128个字符的ASCII字符集.本来这对于英语国家来说够用了.可是随着计算机的普

Base64的编码转换方式

下面,详细介绍Base64的编码转换方式. 所谓Base64,就是说选出64个字符----小写字母a-z.大写字母A-Z.数字0-9.符号"+"."/"(再加上作为垫字的"=",实际上是65个字符)----作为一个基本字符集.然后,其他所有符号都转换成这个字符集中的字符. 具体来说,转换方式可以分为四步. 第一步,将每三个字节作为一组,一共是24个二进制位. 第二步,将这24个二进制位分为四组,每个组有6个二进制位. 第三步,在每组前面加两个00

Json对象与Json字符串互转(4种转换方式)

一.jQuery插件支持的转换方式 1 $.paseJSON(jsonstr);//将json字符串转换为json对象 二.浏览器支持的转换方式(Firefox,Chrome,Opera,Safair,IE9,IE8) 1 JSON.parse(jaonstr);//将json字符串转换为json对象 2 JSON.stringify(jsonobj);//将json对象转换为json字符串 注意:由于ie8(兼容模式),ie7和ie6没有JSON对象,需要使用JSON官方的方式,引入json.

课堂总结2-数据类型及转换方式

一.输入输出语句 Console.ReadLine(); 会等待直到用户按下回车,一次读入一行Console.ReadKey(); 则是等待用户按下任意键,一次读入一个字符. 二.数据类型 主要掌握: 1.值类型:int 整型,float 浮点型(单精度), double 双精度,char 字符型,bool 布尔型(两种状态true与false),datetime  日期时间 2.引用类型:string 字符串类型 问题? a.字符串与字符的区别:string类型使用 “”,char用'',可以

MySQL数据库字符集乱码及库字符集更改

统一字符集保证不乱码:建议中英文环境选择utf8 1.linux系统语言 /etc/sysconfig/i18n LANG="zh_CN.utf8" 2.mysql客户端 临时: set names utf8; 永久: 配置文件my.cnf [client] default-charater-set=utf8 3.mysql服务端 [mysqld] character-set-server=utf8 4.mysql建库建表语句 指定字符集建库 create database oldbo

Json对象与Json字符串互转(4种转换方式)(转)

1>jQuery插件支持的转换方式: $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转换成json对象 2>浏览器支持的转换方式(Firefox,chrome,opera,safari,ie9,ie8)等浏览器: JSON.parse(jsonstr); //可以将json字符串转换成json对象 JSON.stringify(jsonobj); //可以将json对象转换成json对符串  注:ie8(兼容模式),

二进制与十进制之间蛮好的转换方式

假如给你一个二进制 1101101010101  问你转换成10进制是多少  反正 我第一想到的是用2的k次方 这样算 其实完全不用 用如下代码 就可-------我们假设以 字符串来接受这个二进制 一般我们也都是这样做的 1 for( int i = 0 ; str[i]!='\0' ; i++ ) 2 { 3 sum = sum*2 + str[i] - '0'; 4 } 我们通过这个*2也达到了 k次方这个效果 因为i =0恰恰是 二进制的最高位 同样 当我任意给你一个十进制数字  234

JavaScript - 数值类型的判断与常用转换方式

主要参考: isNaN() - JavaScript | MDN Number.isNaN() - JavaScript | MDN parseInt() - JavaScript | MDN parseFloat() - JavaScript | MDN 数值类型的判断方法isNaN()和Number.isNaN() 可接受任意参数,用来判断其参数是否为NaN(not a number) 由于把NaN与任何值(包括其自身)相比得到的结果都是false,因此无法通过==或===运算符来判断某个值

多字符集(ANSI)和UNICODE及字符串处理方式准则

在我们编写程序的时候,使用最多的是字符串的处理,而ANSI和UNICODE的相互转换经常搞的我们头晕眼乱. 应该说UNICODE是一种比较好的编码方式,在我们的程序中应该尽量使用UNICODE编码方式,我们在编写程序的时候,最好能依据下面的准则来进行: 基本准则: 1.将文本字符串想象为字符数组,而非char或字节数组 2.开始使用通用数据类型来表示文本字符和字符串(如TCHAR,PTSTR) 原因是我们可以在WinNT.h的头文件中找到如下定义(代码有删改): [cpp] view plain