说说字符集

Posted on 2008-04-16 15:28 orlando 阅读(143) 评论(0)  编辑 收藏 引用

由于作者是美国人的缘故,我发现Windows下的几本名著(如《Windows程序设计》,Jeffrey Richter的《Windows 核心编程》)对字符集的讲解都不甚透彻。现在这里对一些易让人迷惑的问题进行澄清,并指明一些编程时容易出错的问题(我自己就犯过)。

 

先解释几个概念:

 

字符集:根据编码特性而分,字符集可分为三类。

l         窄字符集(SBCS 每个代码由一个字节进行表示,比如ANSI

l         多字节字符集(MBCS 字符集中的代码或者是单字节,或者是多字节,比如DBCSGB2312等。

l         宽字节字符集   字符集中每个字符由两个字节表示。比如UNICODE

 

代码页:UNICODEDBCS中由于包含的代码十分多,为了使用方便就需要对这些代码进行组织。组织的方法就是把不同国家的代码分别放入不同的代码页。

 

字符集与代码页的关系:由上可知,对于UNICODEDBCS,代码页是从属于字符集的。但对于SBCS类的字符集(比如ANSI)和DBCS之外的MBCS字符集(比如GB2312等)他们则只对应于一个代码页。

 

下面看一段潜在有问题的程序:

void ConverAndOutputString(HDC hdc,LPWSTR wstr, int length,int x,int y)

{

int nret;

int sizebuffer= 2*length;

char* lpBuffer=new char[sizebuffer];

 

nret=WideCharToMultiByte(CP_ACP,0,wstr , length,

                            lpBuffer, sizebuffer ,NULL,NULL);

TextOut(hdc,x,y, lpBuffer,nret);

 

delete[]lpBuffer;

}

这段程序很简单,只是把一个宽字符串转为DBCS串而后按指定的坐标进行输出。Jeffrey Richter在他的《Windows核心编程》中的第26页也用几乎的相同的方法进行字符串转换。但这段程序其实是有问题的。问题出在转换字符串时不应该硬编码指定代码页,而应该根据当前字体进行动态获取。否则在某些情况下将无法把wstr中的UNICODE字符转换到正确的代码。如果你用上述代码进行中文输出,你将很有幸看到很多问号被自动添加到你的字符串中。

解决的办法也很简单,但首先你要熟悉如下两个个API函数:

      int GetTextCharset(HDC hdc);//lpCs,dwFlags

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


posts - 16, comments - 17, trackbacks - 0, articles - 1

Copyright © orlando