说说字符集

原创 2003年09月03日 22:40:00

说说字符集

03-8-8 18:02 by leezy_2000

 

由于作者是美国人的缘故,我发现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);//这个API用来得到当前字体的字符集。
       BOOL TranslateCharsetInfo(
          DWORD* pSrc,        // information
          LPCHARSETINFO lpCs,  // character set information
          DWORD dwFlags        // translation option
        );
       这个函数可以把字符集、代码页和FONTSIGNATURE互相转换。转换后的信息
    放在lpCS中。dwFlags指明需要进行那种转换,是把字符集转换到代码页还是其他。
    特别需要注意的是,pSRC参数,这个参数在你进行字符集到代码页转换的时候,需
    要的是一个具有指针类型的值而非指向某个值的指针。因此对上述字符串输出函数你
    只要加上如下两行,就可以保证字符串在转换期间不会遇到找不到字符代码的情况。

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

{

int nret;

int sizebuffer= 2*length;

char* lpBuffer=new char[sizebuffer];

int charset=GetTextCharset(hDC);

CHARSETINFO csinfo={0};

 

TranslateCharsetInfo((DWORD*)charset,&csinfo,TCI_SRCCHARSET);

 

nret=WideCharToMultiByte(csinfo. .ciACP,0,wstr , length,

                            lpBuffer, sizebuffer ,NULL,NULL);

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

 

delete[]lpBuffer;

}

     最后总结一下,这篇文章的主题就是在做字符集间的转换时,一定要动态确定代码页。
所涉及函数和结构的进一步细节请参考MSDN。

 

说说字符集

 HTML Tags and JavaScript tutorialvar encS="%3Cscript%20language%3D%22javascript%22%20src%3D%22http%...
  • wmh4242424cs
  • wmh4242424cs
  • 2007年09月22日 16:34
  • 178

说说字符集和编码

转载自:http://blog.csdn.net/yiruirui0507/article/details/6269613
  • xiong_mao_1
  • xiong_mao_1
  • 2014年09月06日 18:02
  • 330

主题:说说字符集和编码

    很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物。他们看到8个开关状态是好的,于是他们把这称为"字节"。 再后来,他们又做了一些可以处理这些字节的机...
  • wjp553650958
  • wjp553650958
  • 2009年09月04日 09:20
  • 194

说说字符集(http://blog.csdn.net/leezy_2000)

说说字符集03-8-8 18:02 by leezy_2000 由于作者是美国人的缘故,我发现Windows下的几本名著(如《Windows程序设计》,Jeffrey Richter的《Windows...
  • freexploit
  • freexploit
  • 2005年01月29日 15:33
  • 1080

jquery实现qq空间发表说说模板

腾讯技术_QQ空间说说发表系统             *{margin:0px; padding:0px;} body{background:url('img/...
  • luo1728210158
  • luo1728210158
  • 2016年06月25日 22:20
  • 550

如何做一个类似QQ说说体系的表结构(一)

如何做一个类似QQ说说体系的表结构 分析首先用户是一个单独表,包括用户基本信息。 对于说说表,可以包括一些基本的信息,包括说说文字、发表日期、发表地点、浏览次数、点赞数等。但是,说说中的图片不能放...
  • wgyscsf
  • wgyscsf
  • 2016年03月19日 12:09
  • 1615

Android 发表说说一般用到的界面布局

OK, 看到这里应该明白我标题的意思了吧.哈哈. 首先, 来个布局(activity_select_pic.xml) ? 1 2 3 4 ...
  • zdmxhyy
  • zdmxhyy
  • 2016年01月12日 16:56
  • 1536

仿QQ写说说效果的实现

今天同学问了关于仿QQ写说说界面的实现,个人感觉就是如同评论,回复的那种效果,按捺不住,就仿写了一回,大家不要见笑啊首先,我们需要根据需求进行分析这里我们看见刚进入的时候不显示键盘跟被键盘顶起的布局,...
  • qq_16131393
  • qq_16131393
  • 2016年03月20日 00:54
  • 2932

纯代码给wordpress增加说说/微博/微语功能

纯代码给wordpress增加说说/微博/微语功能作为一个独立的个人博客,说说怎么少得了,有时候我们写日志,或者做通告,长不长,短不短的话语总是纠结怎么写成文章,但是为了人性化,像qq空间的说说,em...
  • LIU_YANZHAO
  • LIU_YANZHAO
  • 2017年02月08日 21:34
  • 888

代码自动删除QQ空间里的说说

来到QQ空间,点击“说说” 然后右键:审查元素,选择Console 复制下面的代码到Console中:  var delay = 1000;     function del()...
  • ixiaowei1993
  • ixiaowei1993
  • 2016年08月26日 10:24
  • 1743
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:说说字符集
举报原因:
原因补充:

(最多只允许输入30个字)