<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[21 工作室 - vc]]></title>
<link>http://www.is21.cn/</link>
<description><![CDATA[本站承接网页制作、软件项目开发、代写代码等业务，我们将和您真诚合作，以最低的价格提供最优越的服务。13488846575   联系人:潘劲]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog2 v2.4]]></copyright>
<webMaster><![CDATA[lianxiangpanjin@163.com(潘劲)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>21 工作室</title> 
	<url>http://www.is21.cn/images/logos.gif</url> 
	<link>http://www.is21.cn/</link> 
	<description>21 工作室</description> 
</image>

			<item>
			<link>http://www.is21.cn/default.asp?id=272</link>
			<title><![CDATA[C语言中怎样判断汉字]]></title>
			<author>lianxiangpanjin@163.com(admin)</author>
			<category><![CDATA[vc]]></category>
			<pubDate>Mon,14 Apr 2008 17:00:04 +0800</pubDate>
			<guid>http://www.is21.cn/default.asp?id=272</guid>	
		<description><![CDATA[在处理套打程序时用到TextOut，但TextOut无法自动换行，只好动手写代码，可是处理到汉字部分时卡住了，搜索网上判断汉字的帖子，都语焉不详，经过一下午的研究，终于整理出一个简单的教程。<br/><br/>其实判断汉字的代码很简单，简单到只有一行就可以了，但不理解汉字编码的基础，这一行代码却万万无法理解。<br/><br/>常用的字符编码有以下三种：<br/>1、ASCII&nbsp;只支持英文，全部为8位<br/>2、DBCS&nbsp;&nbsp;支持英文和中文，但中文需要两个字节（16位）<br/>3、UNICODE&nbsp;支持英文和中文，英文和中文都需要两个字节<br/><br/>ASCII是DOS时代的，无法支持中文。DBCS是Win9x支持的字符集。UNICODE是win2k和xp支持的字符集。<br/>而汉字的编码目前有GB2312-1980和GB18030-2000，GB2312就是DBCS类型的汉字编码，GB18030就是UNICODE的汉字编码，当然GB18030兼容GB2312，也就是说GB18030也支持DBCS的字符处理方式。虽然GB18030是2000年后强制执行的国家标准，但目前使用最多的还是GB2312编码，而且GB2312也足够处理你所用到的汉字了。还有GBK编码是GB2312的增强版。<br/><br/>这里我仅支持GB2312。由于GB2312是中国大陆制定的标准，所以繁体中文并不在GB2312的编码中，如果你的程序需要支持繁体中文，则还需要处理Big5编码。其实也很简单。<br/><br/>下面说一下在C中如何处理GB2312编码的汉字。以VC6.0为例，如果声明变量的类型为wchar_t则是UNICODE编码，如果是char则是DBCS编码比如我的一个函数声明是：<br/>void&nbsp;Justify&nbsp;(HDC&nbsp;hdc,&nbsp;PTSTR&nbsp;pText,&nbsp;RECT&nbsp;*&nbsp;prc,&nbsp;int&nbsp;iAlign)&nbsp;&nbsp;&nbsp;&nbsp;<br/>其中的pText是PTSTR类型，PTSTR在WINNT.H中有两个定义（WINNT.H中的这段代码我删掉了中间无关的部分）<br/>#ifdef&nbsp;&nbsp;UNICODE<br/>typedef&nbsp;LPWSTR&nbsp;PTSTR,&nbsp;LPTSTR;//如果是UNICODE编码，则定义PTSTR为LPWSTR类型<br/>#else<br/>typedef&nbsp;LPSTR&nbsp;PTSTR,&nbsp;LPTSTR;//如果是不是UNICODE编码，则定义PTSTR为LPSTR类型<br/>#endif<br/><br/>LPSTR定义为CHAR的指针<br/>LPSWSTR定义为WCHAR的指针<br/>CHAR定义为char类型<br/>WCHAR定义为wchar_t类型<br/>而wchar_t定义为unsigned&nbsp;short类型，它是16位，两个字节，无符号短整数<br/><br/>是UNICODE还是非UNICODE取决于你的编译选项，如果在[工程]-[选项]-[C/C++]的[预处理程序定义]中填入了_UNICODE，那么程序会用wchar_t指针来定义LPSTR，如果没有_UNICODE，那么程序会用char指针来定义LPSTR，这样带来的区别就是，你接受到的pText中的字节内容是不一样的，[i服了you]这个字串如果在没有定义_UNICODE的情况下，是8个字节，而在定义了_UNICODE的情况下是12个字节。反映到程序中就是，如果没有定义_UNICODE，那么就要把英文字符当成1个字节来处理，而汉字字符的编码是采用GB2312编码规范来的；如果定义了_UNICODE，那么英文字符要当成2个字节来处理，而汉字字符的编码是采用UNICODE编码来的。举例来说，win98不采用UNICODE编码而采用的是DBCS编码，为了让我的程序既可以在XP下运行又可以在Win98下运行，我没有定义_UNICODE。这样我的程序代码就要把字符串当成DBCS编码来处理，也就是英文字符是1个字节，中文字符是2个字节，中文编码采用GB2312编码。用Justify来说明：<br/>我给pText传递来[你]这个汉字，那么pText应该有两个字节来存放[你]这个字，设置段点来读一下pText的内容。<br/>void&nbsp;Justify&nbsp;(HDC&nbsp;hdc,&nbsp;PTSTR&nbsp;pText,&nbsp;RECT&nbsp;*&nbsp;prc,&nbsp;int&nbsp;iAlign)<br/>{<br/>static&nbsp;TCHAR&nbsp;szText[]&nbsp;=&nbsp;{TEXT&nbsp;(&#34;你&#34;)}&nbsp;;<br/><br/>pText=szText;<br/>}<br/>设断调试会发现*pText=-60，怎么会这样呢，原因是没有按unsigned&nbsp;char来转换*pText的值，修改代码如下：<br/>void&nbsp;Justify&nbsp;(HDC&nbsp;hdc,&nbsp;PTSTR&nbsp;pText,&nbsp;RECT&nbsp;*&nbsp;prc,&nbsp;int&nbsp;iAlign)<br/>{<br/>static&nbsp;TCHAR&nbsp;szText[]&nbsp;=&nbsp;{TEXT&nbsp;(&#34;你&#34;)}&nbsp;;<br/>unsigned&nbsp;char&nbsp;sqChar[20];//这个变量就是为了强制转换类型用的<br/><br/>pText=szText;<br/>sqChar[0]=*pText;<br/>sqChar[1]=*(pText+1);<br/>}<br/>这时下断查看sqChar[0]=196,sqChar[1]=227就对了，为什么呢，因为它和GB2312的编码是一样的。<br/>GB2312-80编码的编码范围是高位0xa1－0xfe，低位是&nbsp;0xa1-0xfe&nbsp;，其中汉字范围为&nbsp;0xb0a1&nbsp;和&nbsp;0xf7fe，如果只是简单地判断汉字，则只要查看高字节是否大于等于0xa1就可以了，还有就是，全角字符的高字节统统等于0xa3，所以很容易可以区别出全角字符来。<br/><br/>如果你希望你的程序能支持到GB18030，那么就去找GB18030的规范来看看。<br/><br/>网上有很多判断汉字的说法，你只要记住，你要支持的编码是哪个？GB2312、GBK、GB18030？每个编码有自己的编码范围或者规范，网上之所以有不同的说法，正是因为他们互相说的不是同一种编码方式。我这里说的是GB2312的编码，如果你的程序要编译成支持UNICODE的话，那么这段代码就要修改成对应UNICODE规范的代码了。<br/><br/>附简单的测试汉字、全角字符、英文的程序：<br/><br/>//test.c<br/>//源代码作者：夏克&nbsp;sequh@126.com<br/>//新建Win32&nbsp;Application工程，把test.c加入，运行，试着修改szText的值，来观察代码效果<br/><br/>#include&nbsp;&lt;windows.h&gt;<br/><br/>int&nbsp;WINAPI&nbsp;WinMain&nbsp;(HINSTANCE&nbsp;hInstance,&nbsp;HINSTANCE&nbsp;hPrevInstance,<br/>PSTR&nbsp;szCmdLine,&nbsp;int&nbsp;iCmdShow)<br/>{<br/>static&nbsp;TCHAR&nbsp;szText[]&nbsp;=&nbsp;{TEXT&nbsp;(&#34;i服,了。uｙ&#34;)}&nbsp;;<br/>PTSTR&nbsp;pText;<br/>int&nbsp;i;<br/>unsigned&nbsp;char&nbsp;sqChar[20];<br/><br/>pText=szText;<br/>while&nbsp;(*pText&nbsp;!=&nbsp;&#39;\0&#39;)<br/>{<br/>i=IsGB(pText);<br/><br/>switch(i)<br/>{<br/>case&nbsp;0:<br/>pText++;<br/>MessageBox&nbsp;(NULL,&nbsp;TEXT&nbsp;(&#34;发现数字、英文字符或英文标点&#34;),&nbsp;TEXT&nbsp;(&#34;Hello&#34;),&nbsp;0);<br/>break;<br/>case&nbsp;1:<br/>pText++;<br/>pText++;<br/>MessageBox&nbsp;(NULL,&nbsp;TEXT&nbsp;(&#34;发现全角字符&#34;),&nbsp;TEXT&nbsp;(&#34;Hello&#34;),&nbsp;0);<br/>break;<br/>case&nbsp;2:<br/>pText++;<br/>pText++;<br/>MessageBox&nbsp;(NULL,&nbsp;TEXT&nbsp;(&#34;发现汉字&#34;),&nbsp;TEXT&nbsp;(&#34;Hello&#34;),&nbsp;0);<br/>break;<br/>}<br/>}<br/><br/>return&nbsp;0&nbsp;;<br/>}<br/><br/>int&nbsp;IsGB(PTSTR&nbsp;pText)<br/>{<br/>unsigned&nbsp;char&nbsp;sqChar[20];<br/>sqChar[0]=*pText;<br/>if&nbsp;(sqChar[0]&gt;=0xa1)<br/>if&nbsp;(sqChar[0]==0xa3)<br/>return&nbsp;1;//全角字符<br/>else<br/>return&nbsp;2;//汉字<br/>else<br/>return&nbsp;0;//英文、数字、英文标点<br/>}<br/><br/>]]></description>
		</item>
		
			<item>
			<link>http://www.is21.cn/default.asp?id=260</link>
			<title><![CDATA[句柄是什么]]></title>
			<author>lianxiangpanjin@163.com(admin)</author>
			<category><![CDATA[vc]]></category>
			<pubDate>Tue,08 Apr 2008 22:40:40 +0800</pubDate>
			<guid>http://www.is21.cn/default.asp?id=260</guid>	
		<description><![CDATA[句柄(handle)<br/>分为:图标句柄(hicon),光标句柄（hcursor）,窗口句柄（hwnd），应用程序句柄(hinstance)等句柄<br/><br/><br/>操作系统给每一个窗口指定唯一的标识句即窗口句柄]]></description>
		</item>
		
</channel>
</rss>