分享
 
 
 

Unicode编码转化介绍

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

1 简介

1.1 目的

本文档介绍了在WIN32和LINUX等平台下的各种编码之间的转化方法。

1.2 概述

ANSI C定义了统一的编码转化函数setlocale,mbstowcs,wcstombs,但这些函数在WIN32平台上实现了,却未在LINUX平台上实现,在linux平台上实现编码转化需要调用iconv_open, iconv, iconv_close函数。

2 WIN32平台下的编码转化

2.1 ANSI C方法

WIN32平台下,ANSI的setlocale,wcstombs,mbstowcs, L’’str”等函数运行正常。其中setlocale后面的参数可以是’”.ACP”,””, NULL, “C”, “chinese”,

“Chinese_People's Republic of China.936”等。一般应使用”.ACP”,代表操作系统当前使用的代码页,NULL,””,”C”代表操作系统的缺省代码页,请注意两者之间的细微区别。 L”str”代表str的UnicodeLittle编码。

void testBMPStrToStr(const char* pc_locale, const wchar_t* pc_wnm,

char* pc_data, int nPCDataLen)

{

char* pclocale = setlocale(LC_CTYPE, pc_locale);

cout << pc_locale << " locale=" << (pclocale==NULL?"FALSE":pclocale) << endl;

memset(pc_data, 0, nPCDataLen);

int n = sprintf(pc_data, "%ls", pc_wnm);

pc_data[n]=0; cout << "sprintf convert=" << pc_data << endl;

memset(pc_data, 0, nPCDataLen);

n = wcstombs(pc_data, pc_wnm, nPCDataLen);

pc_data[n]=0; cout << "wcstombs convert=" << pc_data << endl;

}

2.2 MultiByteToWideChar和WideCharToMultiByte方法

WIN32平台自己提供了两个编码码转化函数MultiByteToWideChar和

WideCharToMultiByte。两个不同的编码页间的转化需要通过UnicodeLittle编码来中转。例如:

bool ACP2UTF8(const HGChar* pc_acp, HGCharArray& chArrUTF8)

{

HGCharArray chArrUnicode;

int nLen = 2*strlen(pc_acp)+1;

chArrUTF8.resize(nLen+1);

chArrUnicode.resize(nLen+1);

if( 0== MultiByteToWideChar( CP_ACP, 0, pc_acp, -1, (LPWSTR)&chArrUnicode[0], nLen) )

return false;

if( 0!= WideCharToMultiByte( CP_UTF8, 0, (LPCWSTR)&chArrUnicode[0], -1,

&chArrUTF8[0], nLen, NULL, NULL ) )

return true;

return false;

}

3 linux平台下的编码转化

3.1 ANSI C方法

linux下的ANSI C 方法setlocale,mbstowcs,wcstombs不可用,会出错。又 L”str”也不是将后面的str转化成unicode编码,例如 L“福建省运营根CA”在RedHat下的结果是 B8 00 00 00 A3 00 00 00 BD 00 00 00 A8 00 00 00 CA 00 00 00 A1 00 00 00 D4 00 00 00 CB 00 00 00 D3 00 00 00 AA 00 00 00 B8 00 00 00 F9 00 00 00 43 00 00 00 41 00 00 00 00 00 00 00,CYGWIN下的结果是 B8 00 A3 00 BD 00 A8 00 CA 00 A1 00 D4 00 CB 00 D3 00 AA 00 B8 00 F9 00 43 00 41 00 00 00,但其实际的UnicodeLittile编码是8F 79 FA 5E 01 77 D0 8F 25 84 39 68 43 00 41 00 00 00。

3.2 iconv方法

linux下主要使用iconv相关方法来转化各个编码。其基本调用方式是,iconv_open, iconv, iconv_close 。其中iconv_open的两个参数代表需要互相转化的两个编码页,iconv函数代表编码转化,注意其后面的四个参数都是可变的,返回时依次表示,已转化完成的最后一个字节的下一个字节,未转化的字节数,缓冲区的下一字节,剩余的缓冲区字节数。例如:

int testUnicode()

{

#ifdef __linux__

#define ICONV_CONST

#else

#define ICONV_CONST const

#endif

char inbuf[HG_LARGE_STR_LEN]="福建省运营根CA";

char outbuf[HG_LARGE_STR_LEN];

ICONV_CONST char* pin = inbuf;

char* pout = outbuf;

size_t inleft = strlen(pin)+1;

size_t outleft = HG_LARGE_STR_LEN;

iconv_t cd = iconv_open("UNICODEBIG","CN-GB");

if((int)cd == -1)

return -1;

if((int)iconv(cd, &pin, &inleft, &pout, &outleft) == -1)

return -1;

iconv_close(cd);

MEM_OBJECT::binaryToASCII((HGBYTE*)outbuf, HG_LARGE_STR_LEN-outleft, inbuf);

cout << "actual wcs=" << inbuf << endl;

return 0;

}

其中iconv_open函数的两个参数可以使用命令iconv –l >codePage.txt看到。

4 CYGWIN平台下的编码转化

CYGWIN平台下的编码转化与linux平台下的编码转化一致,不过iconv*函数在库libiconv.a 中。

5 其它平台下的编码转化

其它solaris,aix平台下的编码转化未曾研究,但应与linux平台下的转化相类似。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有