其他语言

本类阅读TOP10

·基于Solaris 开发环境的整体构思
·使用AutoMake轻松生成Makefile
·BCB数据库图像保存技术
·GNU中的Makefile
·射频芯片nRF401天线设计的分析
·iframe 的自适应高度
·BCB之Socket通信
·软件企业如何实施CMM
·入门系列--OpenGL最简单的入门
·WIN95中日志钩子(JournalRecord Hook)的使用

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
Unicode编码转化介绍

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

1.1   目的

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

1.2   概述

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

2        WIN32平台下的编码转化

2.1   ANSI C方法

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

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

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   MultiByteToWideCharWideCharToMultiByte方法


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 方法setlocalembstowcswcstombs不可用,会出错。又 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 00CYGWIN下的结果是 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 中。

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




相关文章

相关软件