﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-happyfish-随笔分类-encoding</title><link>http://www2.blogjava.net/happyfish/category/1106.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 15:35:06 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 15:35:06 GMT</pubDate><ttl>60</ttl><item><title>比尔·盖茨给马化腾的一封信</title><link>http://www.blogjava.net/happyfish/archive/2005/06/10/5859.html</link><dc:creator>小鱼儿</dc:creator><author>小鱼儿</author><pubDate>Fri, 10 Jun 2005 05:31:00 GMT</pubDate><guid>http://www.blogjava.net/happyfish/archive/2005/06/10/5859.html</guid><wfw:comment>http://www.blogjava.net/happyfish/comments/5859.html</wfw:comment><comments>http://www.blogjava.net/happyfish/archive/2005/06/10/5859.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/happyfish/comments/commentRss/5859.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/happyfish/services/trackbacks/5859.html</trackback:ping><description><![CDATA[<DIV>比尔·盖茨给马化腾的一封信<BR>发信站:&nbsp;饮水思源&nbsp;(2005年06月10日02:58:36&nbsp;星期五),&nbsp;站内信件<BR>&nbsp;<BR>发给：Pony&nbsp;Ma<BR>抄送：丁丁，汪延，Charles，雷雷，鸿祎<BR>发自：Bill&nbsp;Gates<BR>重要性：高<BR>&nbsp;<BR>Dear&nbsp;Pony，<BR>　　冒昧给你写email，听说你对我有些意见，我想和你做一些私人交流，以下是我的5<BR>点意见，不代表microsoft官方态度：）<BR>&nbsp;<BR>　　1、人在江湖飘，谁能不挨刀<BR>　　听说你的注册用户数有两三亿，同时在线人数都超过1000万了，虽然我有点怀疑，<BR>不过还是很让我震惊啊，你们干得真的很不错，我很庆幸我还有windows，还有捆绑的看<BR>家本领，否则我基本上就没什么办法了，感谢伟大的IBM，感谢伟大的盗版事业，感谢我<BR>的爸爸妈妈……<BR>&nbsp;<BR>　　我承认我的这个看家本领是有点不太厚道，真的，我很理解老弟你的心情，但是，b<BR>usiness&nbsp;is&nbsp;business，网络太open了，占领终端很重要啊，当年我好不容易搞定Netsca<BR>pe，用IE占领了地址栏，才过上了几年幸福的网络生活，IM的时代，我怎么能缺席呢？<BR><FONT size=3>
<P>所以我必须捆绑MSN啊，人在江湖飘，谁能不挨刀啊，马克·安德森同学至今都很郁闷。<BR>&nbsp;<BR>　　2、这年头，谁的屁股都不干净<BR>&nbsp;<BR>　　再说捆绑，老弟你也不陌生啊，只是用得不太熟练。你还记得99年的OICQ多大嘛？1<BR>M？还是800K？小巧玲珑啊，现在呢？QQ都快50M了吧？几年膨胀了几十倍啊，那些游戏<BR>、音乐、硬盘、邮箱以及一堆乱七八糟的东西不都是捆绑嘛？搞得大家都说QQ臃肿，其<BR>实只不过因为你的根基太小，只是一个IM软件，加点东西太明显了，而我的windows可是<BR>OS，你的家当还是不够丰厚啊。<BR>&nbsp;<BR>　　所以老弟也不用抱怨太多，周鸿祎同学说过，这年头，谁的屁股都不太干净，还是<BR>比较话糙理不糙的。另外，关于Jerry要开掉周同学的传言已经很久了，我的线人说是6<BR>月份就有分晓，你有什么最新消息嘛？<BR>&nbsp;<BR>　　3、你太低调，太不酷了，找个CEO吧，代理的也行<BR>&nbsp;<BR>　　tencent上市了，不错，但上市之后都干了什么？除了QQ变得越来越大，好像什么都<BR>没干，虽然在读《老子》之余，我的朋友陈天桥把好公司都收购了，但你也别干瞪眼不<BR>动手啊，好歹有点资本运作，给投资人一个想象的空间也好啊。<BR>&nbsp;<BR>　　其实我明白你的压力，上市了嘛，每个季度都要发财报，投资人的德行大家都知道<BR>，一个季度业绩不增长就要发飙，做CEO日子难过啊。不过你其实可以过得潇洒一点，Je<BR></P></FONT><FONT size=3>
<P>rry和David（Yahoo&nbsp;创始人）有Terry&nbsp;Semel（Yahoo&nbsp;CEO）、Larry&nbsp;Page和Sergey&nbsp;Brin<BR>（Google创始人）有Schmidt打理一切，多省心啊，不光活得自在，大家还觉得他们很酷<BR>。我有Ballmer帮我打理，也才有时间去写点《the&nbsp;road&nbsp;ahead》之类的畅销书，给micr<BR>osoft接下来要干的事做点科普工作也不错。其实私下地说，我对新技术的迟钝地球人都<BR>知道……<BR>&nbsp;<BR>　　建议你向丁丁学习，找一个象Ted（孙德棣）一样CEO，你就可以象丁丁一样有时间<BR>学中医玩了：）<BR>&nbsp;<BR>　　4、你知道我为什么让他们那么折腾MSN.com.cn嘛？<BR>&nbsp;<BR>　　msn.com.cn来了，我知道你们那天也去“观摩”了，相信老弟你也看出来了，现在<BR>的MSN.com.cn看上去真是一个灾难。我让他们折腾是因为反正MSN迟早总要进来的，不如<BR>先来占个地儿，别老让中国用户觉得MSN就是MSN&nbsp;Messenger，那也很糟糕啊。<BR>&nbsp;<BR>　　新浪已经把中国的门户带入了死胡同，用近乎抢劫的方式抢夺报纸、杂志、电视的<BR>内容堆积出一个海量信息的门户，搜狐已经证明，谁也复发复制出另一个新浪，很可惜<BR>，看上去qq.com正在走这一条道路，尽管你可以用qq来推高用户数量，但价值何在？<BR>&nbsp;<BR>　　所以我让他们折腾MSN.com.cn，随便折腾，只要不太过分就行，反正N年之内，干过<BR>新浪还是比较困难的，我有充分的时间来做我的MSN服务，那时longhorn应该也会捆绑一<BR>些新东西来帮忙的，暂时保密：）<BR></P></FONT><FONT size=3>
<P><BR>　　5、QQ群不是社会网络<BR>　　现在社会网络很流行，似乎大家都很明白，实际上怎么收费心里都还没谱呢，没准<BR>就是一个bubble，所以QQ也该掺和掺和，说不定有一天大家都恍然大悟了呢，到时候再<BR>干可就来不及拉。<BR>&nbsp;<BR>　　IM软件做社会网络似乎是水到渠成，但实际上太不一样了。可能是技术难度太低了<BR>，我的那帮高薪软件工程师觉得很不适应，想了好久才弄出那个spaces的，虽然美国人<BR>不怎么喜欢，但中国用户好像反响还不错，聊胜于无吧。<BR>&nbsp;<BR>　　其实你们那个QQ群真的很好玩，尤其是有个叫“新花社”的群，真的太“胜总”了<BR>（谁想了解这个词的含义，请留言^_^），但不是社会网络，不过绝大部分的QQ用户似乎<BR>都兴趣不大，可能太年轻了。QQ该怎么弄社会网络，相信你也很困扰，但千万不要放弃<BR>啊，老弟。<BR>&nbsp;<BR>　　其实我应该感谢你，是QQ普及了中国小朋友对IM的了解，等他们长大了，工作了，<BR>有钱了，就慢慢转移到了MSN，无缝切换，配合默契啊：）<BR>&nbsp;<BR>　　可能这些都不太中听，哥们也不要太担心，中国市场很大，让我们一起去开拓吧，<BR>与君共勉！<BR>&nbsp;<BR>yours,Bill<BR></P></FONT></DIV><img src ="http://www.blogjava.net/happyfish/aggbug/5859.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/happyfish/" target="_blank">小鱼儿</a> 2005-06-10 13:31 <a href="http://www.blogjava.net/happyfish/archive/2005/06/10/5859.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>重定义键盘的两种实现方法</title><link>http://www.blogjava.net/happyfish/archive/2005/05/19/4862.html</link><dc:creator>小鱼儿</dc:creator><author>小鱼儿</author><pubDate>Thu, 19 May 2005 03:35:00 GMT</pubDate><guid>http://www.blogjava.net/happyfish/archive/2005/05/19/4862.html</guid><wfw:comment>http://www.blogjava.net/happyfish/comments/4862.html</wfw:comment><comments>http://www.blogjava.net/happyfish/archive/2005/05/19/4862.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/happyfish/comments/commentRss/4862.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/happyfish/services/trackbacks/4862.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 重定义键盘的两种实现方法联系方式：大连理工大学电子系995班孙宇哲&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&...&nbsp;&nbsp;<a href='http://www.blogjava.net/happyfish/archive/2005/05/19/4862.html'>阅读全文</a><img src ="http://www.blogjava.net/happyfish/aggbug/4862.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/happyfish/" target="_blank">小鱼儿</a> 2005-05-19 11:35 <a href="http://www.blogjava.net/happyfish/archive/2005/05/19/4862.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>上传图片并生成略缩图   </title><link>http://www.blogjava.net/happyfish/archive/2005/05/11/4162.html</link><dc:creator>小鱼儿</dc:creator><author>小鱼儿</author><pubDate>Wed, 11 May 2005 02:34:00 GMT</pubDate><guid>http://www.blogjava.net/happyfish/archive/2005/05/11/4162.html</guid><wfw:comment>http://www.blogjava.net/happyfish/comments/4162.html</wfw:comment><comments>http://www.blogjava.net/happyfish/archive/2005/05/11/4162.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/happyfish/comments/commentRss/4162.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/happyfish/services/trackbacks/4162.html</trackback:ping><description><![CDATA[<TABLE id=Table1 height="100%" cellSpacing=0 cellPadding=0 width="90%" align=center border=0>
<TBODY>
<TR height=20>
<TD vAlign=bottom><FONT face=宋体><B>上传图片并生成略缩图</B></FONT></TD>
<TD>
<DIV align=right>&nbsp;</DIV></TD></TR>
<TR>
<TD class=TextClass style="HEIGHT: 378px" vAlign=top colSpan=2><FONT face=宋体><FONT color=#a65353><BR>
<P>参数说明<BR>FileBox:上传表单中的表单名<BR>SavePath:保存路径<BR>ThumbnailWidth:略缩图宽<BR>ThumbnailHeight:略缩图高<BR>FilePath:文件保存路径（输出参数）<BR>FileName:文件名称（输出参数）<BR>LastError:（输出错误）<BR>public static bool UploadImages(System.Web.UI.HtmlControls.HtmlInputFile FileBox,string SavePath,Int32 ThumbnailWidth,Int32 ThumbnailHeight,out String FilePath,out String FileName,out string LastError)<BR>{<BR>DateTime datTime=System.DateTime.Now;<BR>String strTemp;<BR>string strFileName = FileBox.PostedFile.FileName;<BR>bool blnResult;<BR>LastError="";<BR>System.Drawing.Image xImage;<BR>System.Drawing.Bitmap xBitmap;<BR>int PhotoHeight,PhotoWidth;<BR>string BasePath=System.Web.HttpContext.Current.Server.MapPath("../");<BR>Rectangle NewPhoto;<BR>System.Drawing.Imaging.ImageFormat xObject;<BR>string Extension="";<BR>FileName="";<BR>FilePath="";<BR><BR>try<BR>{<BR>if(strFileName=="")<BR>{<BR>LastError="请点击浏览选择要上传的文件!";<BR>return false;<BR>}<BR>if(Convert.ToDecimal(FileBox.PostedFile.ContentLength)&lt;= 2000000 &amp;&amp;Convert.ToDecimal(FileBox.PostedFile.ContentLength)&gt;1500)<BR>{<BR>//查看扩展名是否合法<BR>Extension=Path.GetExtension(strFileName);<BR>Extension=Extension.ToLower();<BR>if(Extension==".gif" || Extension==".jpg" || Extension==".jpeg" || Extension==".bmp")<BR>{<BR>switch(Extension)<BR>{<BR>case ".gif":<BR>xObject=System.Drawing.Imaging.ImageFormat.Gif;<BR>break;<BR>case ".bmp":<BR>xObject=System.Drawing.Imaging.ImageFormat.Bmp;<BR>break;<BR>default:<BR>xObject=System.Drawing.Imaging.ImageFormat.Jpeg;<BR><BR>break;<BR>}<BR>}<BR>else<BR>{<BR>LastError="上传的文件不是有效的图片文件，请上传格式为：.gif.jpg.bmp的文件！";<BR>return false;<BR>}<BR>//-----------------------------<BR>//生成保存的文件路径及文件名<BR>//-----------------------------<BR>strTemp = datTime.ToShortDateString().Replace( "-", "");<BR>FileName = datTime.ToLongTimeString().Replace(":","")+ Extension;<BR>FilePath = SavePath + strTemp + "/";<BR>Friendlib.Function.CreateDirectory(BasePath + FilePath);<BR>//保存大图<BR>xImage=System.Drawing.Bitmap.FromStream(FileBox.PostedFile.InputStream);<BR><BR>xImage.Save(BasePath+FilePath+FileName);<BR>xImage.Dispose();<BR>//-----------------------------<BR>//开始生成缩略图<BR>//-----------------------------<BR>xBitmap=new Bitmap(BasePath+FilePath+FileName);//------------------<BR><BR>PhotoHeight=xBitmap.Height;<BR>PhotoWidth=xBitmap.Width;<BR>// //判断图片的形状 <BR>if(Convert.ToDecimal(PhotoHeight)/Convert.ToDecimal(PhotoWidth)&gt;Convert.ToDecimal(ThumbnailHeight)/Convert.ToDecimal(ThumbnailWidth))//高有余 <BR>{ <BR>PhotoHeight=Convert.ToInt16((Convert.ToDecimal(ThumbnailHeight)/Convert.ToDecimal(ThumbnailWidth))*Convert.ToDecimal(PhotoWidth)); <BR>NewPhoto=new Rectangle(0,0,PhotoWidth,PhotoHeight); <BR>} <BR>else if(Convert.ToDecimal(PhotoHeight)/Convert.ToDecimal(PhotoWidth)&lt;Convert.ToDecimal(ThumbnailHeight)/Convert.ToDecimal(ThumbnailWidth)) <BR>{ <BR>PhotoWidth=Convert.ToInt16((Convert.ToDecimal(ThumbnailWidth)/Convert.ToDecimal(ThumbnailHeight))*Convert.ToDecimal(PhotoHeight)); <BR>NewPhoto=new <BR>Rectangle(Convert.ToInt16((Convert.ToDecimal(xBitmap.Width)-Convert.ToDecimal(PhotoWidth))/2),0,PhotoWidth,PhotoHeight); <BR>} <BR>else <BR>{ <BR>NewPhoto= newRectangle(0,0,PhotoWidth,PhotoHeight); &lt; BR&gt; } <BR>System.Drawing.Image myBitmap; <BR>myBitmap=xBitmap.Clone(NewPhoto,System.Drawing.Imaging.PixelFormat.DontCare); <BR>System.Drawing.Image.GetThumbnailImageAbort myCallback = new <BR>System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback); <BR>System.Drawing.Image myThumbnail = <BR>myBitmap.GetThumbnailImage(ThumbnailWidth,ThumbnailHeight, myCallback, <BR>IntPtr.Zero); myThumbnail.Save(BasePath + FilePath +"s"+FileName,xObject); <BR>myThumbnail.Dispose(); myBitmap.Dispose(); xBitmap.Dispose(); return true; } <BR>else <BR>{ <BR>blnResult=false; LastError="不能上传大于2M及小于1.5K的图片!"; <BR>} <BR>}&lt; BR&gt; catch (Exception ex) { <BR>throw new System.Exception((ex.Message + ("\r\n" + ex.StackTrace))); <BR>} <BR>return blnResult;<BR>}<BR>private static bool ThumbnailCallback() { return false; }<BR></P></FONT></FONT></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/happyfish/aggbug/4162.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/happyfish/" target="_blank">小鱼儿</a> 2005-05-11 10:34 <a href="http://www.blogjava.net/happyfish/archive/2005/05/11/4162.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows API函数大全</title><link>http://www.blogjava.net/happyfish/archive/2005/05/10/4139.html</link><dc:creator>小鱼儿</dc:creator><author>小鱼儿</author><pubDate>Tue, 10 May 2005 05:22:00 GMT</pubDate><guid>http://www.blogjava.net/happyfish/archive/2005/05/10/4139.html</guid><wfw:comment>http://www.blogjava.net/happyfish/comments/4139.html</wfw:comment><comments>http://www.blogjava.net/happyfish/archive/2005/05/10/4139.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/happyfish/comments/commentRss/4139.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/happyfish/services/trackbacks/4139.html</trackback:ping><description><![CDATA[Windows API函数大全<BR>
<P><BR>1. API之网络函数 <BR>WNetAddConnection 创建同一个网络资源的永久性连接 <BR>WNetAddConnection2 创建同一个网络资源的连接 <BR>WNetAddConnection3 创建同一个网络资源的连接 <BR>WNetCancelConnection 结束一个网络连接 <BR>WNetCancelConnection2 结束一个网络连接 <BR>WNetCloseEnum 结束一次枚举操作 <BR>WNetConnectionDialog 启动一个标准对话框，以便建立同网络资源的连接 <BR>WNetDisconnectDialog 启动一个标准对话框，以便断开同网络资源的连接 <BR>WNetEnumResource 枚举网络资源 <BR>WNetGetConnection 获取本地或已连接的一个资源的网络名称 <BR>WNetGetLastError 获取网络错误的扩展错误信息 <BR>WNetGetUniversalName 获取网络中一个文件的远程名称以及/或者UNC（统一命名规范）名称 <BR>WNetGetUser 获取一个网络资源用以连接的名字 <BR>WNetOpenEnum 启动对网络资源进行枚举的过程 <BR><BR>2. API之消息函数 <BR>BroadcastSystemMessage 将一条系统消息广播给系统中所有的顶级窗口 <BR>GetMessagePos 取得消息队列中上一条消息处理完毕时的鼠标指针屏幕位置 <BR>GetMessageTime 取得消息队列中上一条消息处理完毕时的时间 <BR>PostMessage 将一条消息投递到指定窗口的消息队列 <BR>PostThreadMessage 将一条消息投递给应用程序 <BR>RegisterWindowMessage 获取分配给一个字串标识符的消息编号 <BR>ReplyMessage 答复一个消息 <BR>SendMessage 调用一个窗口的窗口函数，将一条消息发给那个窗口 <BR>SendMessageCallback 将一条消息发给窗口 <BR>SendMessageTimeout 向窗口发送一条消息 <BR>SendNotifyMessage 向窗口发送一条消息 <BR>3. API之文件处理函数 <BR>CloseHandle 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等 <BR>CompareFileTime 对比两个文件的时间 <BR>CopyFile 复制文件 <BR>CreateDirectory 创建一个新目录 <BR>CreateFile 打开和创建文件、管道、邮槽、通信服务、设备以及控制台 <BR>CreateFileMapping 创建一个新的文件映射对象 <BR>DeleteFile 删除指定文件 <BR>DeviceIoControl 对设备执行指定的操作 <BR>DosDateTimeToFileTime 将DOS日期和时间值转换成一个 win32 FILETIME 值 <BR>FileTimeToDosDateTime 将一个 win32 FILETIME 值转换成DOS日期和时间值 <BR>FileTimeToLocalFileTime 将一个FILETIME结构转换成本地时间 <BR>FileTimeToSystemTime 根据一个FILETIME结构的内容，装载一个SYSTEMTIME结构 <BR>FindClose 关闭由FindFirstFile函数创建的一个搜索句柄 <BR>FindFirstFile 根据文件名查找文件 <BR>FindNextFile 根据调用FindFirstFile函数时指定的一个文件名查找下一个文件 <BR>FlushFileBuffers 针对指定的文件句柄，刷新内部文件缓冲区 <BR>FlushViewOfFile 将写入文件映射缓冲区的所有数据都刷新到磁盘 <BR>GetBinaryType 判断文件是否可以执行 <BR>GetCompressedFileSize 判断一个压缩文件在磁盘上实际占据的字节数 <BR>GetCurrentDirectory 在一个缓冲区中装载当前目录 <BR>GetDiskFreeSpace 获取与一个磁盘的组织有关的信息，以及了解剩余空间的容量 <BR>GetDiskFreeSpaceEx 获取与一个磁盘的组织以及剩余空间容量有关的信息 <BR>GetDriveType 判断一个磁盘驱动器的类型 <BR>GetExpandedName 取得一个压缩文件的全名 <BR>GetFileAttributes 判断指定文件的属性 <BR>GetFileInformationByHandle 这个函数提供了获取文件信息的一种机制 <BR>GetFileSize 判断文件长度 <BR>GetFileTime 取得指定文件的时间信息 <BR>GetFileType 在给出文件句柄的前提下，判断文件类型 <BR>GetFileVersionInfo 从支持版本标记的一个模块里获取文件版本信息 <BR>GetFileVersionInfoSize 针对包含了版本资源的一个文件，判断容纳文件版本信息需要一个多大的缓冲区 <BR>GetFullPathName 获取指定文件的完整路径名 <BR>GetLogicalDrives 判断系统中存在哪些逻辑驱动器字母 <BR>GetLogicalDriveStrings 获取一个字串，其中包含了当前所有逻辑驱动器的根驱动器路径 <BR>GetOverlappedResult 判断一个重叠操作当前的状态 <BR>GetPrivateProfileInt 为初始化文件（.ini文件）中指定的条目获取一个整数值 <BR>GetPrivateProfileSection 获取指定小节（在.ini文件中）所有项名和值的一个列表 <BR>GetPrivateProfileString 为初始化文件中指定的条目取得字串 <BR>GetProfileInt 取得win.ini初始化文件中指定条目的一个整数值 <BR>GetProfileSection 获取指定小节（在win.ini文件中）所有项名和值的一个列表 <BR>GetProfileString 为win.ini初始化文件中指定的条目取得字串 <BR>GetShortPathName 获取指定文件的短路径名 <BR>GetSystemDirectory 取得Windows系统目录（即System目录）的完整路径名 <BR>GetTempFileName 这个函数包含了一个临时文件的名字，它可由应用程序使用 <BR>GetTempPath 获取为临时文件指定的路径 <BR>GetVolumeInformation 获取与一个磁盘卷有关的信息 <BR>GetWindowsDirectory 获取Windows目录的完整路径名 <BR>hread 参考lread <BR>hwrite 参考lwrite函数 <BR>lclose 关闭指定的文件 <BR>lcreat 创建一个文件 <BR>llseek 设置文件中进行读写的当前位置 <BR>LockFile 锁定文件的某一部分，使其不与其他应用程序共享 <BR>LockFileEx 与LockFile相似，只是它提供了更多的功能 <BR>lopen 以二进制模式打开指定的文件 <BR>lread 将文件中的数据读入内存缓冲区 <BR>lwrite 将数据从内存缓冲区写入一个文件 <BR>LZClose 关闭由LZOpenFile 或 LZInit函数打开的一个文件 <BR>LZCopy 复制一个文件 <BR>LZInit 这个函数用于初始化内部缓冲区 <BR>LZOpenFile 该函数能执行大量不同的文件处理，而且兼容于压缩文件 <BR>LZRead 将数据从文件读入内存缓冲区 <BR>LZSeek 设置一个文件中进行读写的当前位置 <BR>MapViewOfFile 将一个文件映射对象映射到当前应用程序的地址空间 <BR>MoveFile 移动文件 <BR>OpenFile 这个函数能执行大量不同的文件操作 <BR>OpenFileMapping 打开一个现成的文件映射对象 <BR>QueryDosDevice 在Windows NT中，DOS设备名会映射成NT系统设备名。该函数可判断当前的设备映射情况 <BR>ReadFile 从文件中读出数据 <BR>ReadFileEx 与ReadFile相似，只是它只能用于异步读操作，并包含了一个完整的回调 <BR>RegCloseKey 关闭系统注册表中的一个项（或键） <BR>RegConnectRegistry 访问远程系统的部分注册表 <BR>RegCreateKey 在指定的项下创建或打开一个项 <BR>RegCreateKeyEx 在指定项下创建新项的更复杂的方式。在Win32环境中建议使用这个函数 <BR>RegDeleteKey 删除现有项下方一个指定的子项 <BR>RegDeleteValue 删除指定项下方的一个值 <BR>RegEnumKey 枚举指定项的子项。在Win32环境中应使用RegEnumKeyEx <BR>RegEnumKeyEx 枚举指定项下方的子项 <BR>RegEnumValue 枚举指定项的值 <BR>RegFlushKey 将对项和它的子项作出的改动实际写入磁盘 <BR>RegGetKeySecurity 获取与一个注册表项有关的安全信息 <BR>RegLoadKey 从以前用RegSaveKey函数创建的一个文件里装载注册表信息 <BR>RegNotifyChangeKeyValue 注册表项或它的任何一个子项发生变化时，用这个函数提供一种通知机制 <BR>RegOpenKey 打开一个现有的注册表项 <BR>RegOpenKeyEx 打开一个现有的项。在win32下推荐使用这个函数 <BR>RegQueryInfoKey 获取与一个项有关的信息 <BR>RegQueryValue 取得指定项或子项的默认（未命名）值 <BR>RegQueryValueEx 获取一个项的设置值 <BR>RegReplaceKey 用一个磁盘文件保存的信息替换注册表信息；并创建一个备份，在其中包含当前注册表信息 <BR>RegRestoreKey 从一个磁盘文件恢复注册表信息 <BR>RegSaveKey 将一个项以及它的所有子项都保存到一个磁盘文件 <BR>RegSetKeySecurity 设置指定项的安全特性 <BR>RegSetValue 设置指定项或子项的默认值 <BR>RegSetValueEx 设置指定项的值 <BR>RegUnLoadKey 卸载指定的项以及它的所有子项 <BR>RemoveDirectory 删除指定目录 <BR>SearchPath 查找指定文件 <BR>SetCurrentDirectory 设置当前目录 <BR>SetEndOfFile 针对一个打开的文件，将当前文件位置设为文件末尾 <BR>SetFileAttributes 设置文件属性 <BR>SetFilePointer 在一个文件中设置当前的读写位置 <BR>SetFileTime 设置文件的创建、访问及上次修改时间 <BR>SetHandleCount 这个函数不必在win32下使用；即使使用，也不会有任何效果 <BR>SetVolumeLabel 设置一个磁盘的卷标（Label） <BR>SystemTimeToFileTime 根据一个FILETIME结构的内容，载入一个SYSTEMTIME结构 <BR>UnlockFile 解除对一个文件的锁定 <BR>UnlockFileEx 解除对一个文件的锁定 <BR>UnmapViewOfFile 在当前应用程序的内存地址空间解除对一个文件映射对象的映射 <BR>VerFindFile 用这个函数决定一个文件应安装到哪里 <BR>VerInstallFile 用这个函数安装一个文件 <BR>VerLanguageName 这个函数能根据16位语言代码获取一种语言的名称 <BR>VerQueryValue 这个函数用于从版本资源中获取信息 <BR>WriteFile 将数据写入一个文件 <BR>WriteFileEx 与WriteFile类似，只是它只能用于异步写操作，并包括了一个完整的回调 <BR>WritePrivateProfileSection 为一个初始化文件（.ini）中指定的小节设置所有项名和值 <BR>WritePrivateProfileString 在初始化文件指定小节内设置一个字串 <BR>WriteProfileSection 为Win.ini初始化文件中一个指定的小节设置所有项名和值 <BR>WriteProfileString 在Win.ini初始化文件指定小节内设置一个字串 <BR>4. API之打印函数 <BR>AbortDoc 取消一份文档的打印 <BR>AbortPrinter 删除与一台打印机关联在一起的缓冲文件 <BR>AddForm 为打印机的表单列表添加一个新表单 <BR>AddJob 用于获取一个有效的路径名，以便用它为作业创建一个后台打印文件。它也会为作业分配一个作业编号 <BR>AddMonitor 为系统添加一个打印机监视器 <BR>AddPort 启动"添加端口"对话框，允许用户在系统可用端口列表中加入一个新端口 <BR>AddPrinter 在系统中添加一台新打印机 <BR>AddPrinterConnection 连接指定的打印机 <BR>AddPrinterDriver 为指定的系统添加一个打印驱动程序 <BR>AddPrintProcessor 为指定的系统添加一个打印处理器 <BR>AddPrintProvidor 为系统添加一个打印供应商 <BR>AdvancedDocumentProperties 启动打印机文档设置对话框 <BR>ClosePrinter 关闭一个打开的打印机对象 <BR>ConfigurePort 针对指定的端口，启动一个端口配置对话框 <BR>ConnectToPrinterDlg 启动连接打印机对话框，用它同访问网络的打印机连接 <BR>DeleteForm 从打印机可用表单列表中删除一个表单 <BR>DeleteMonitor 删除指定的打印监视器 <BR>DeletePort 启动"删除端口"对话框，允许用户从当前系统删除一个端口 <BR>DeletePrinter 将指定的打印机标志为从系统中删除 <BR>DeletePrinterConnection 删除与指定打印机的连接 <BR>DeletePrinterDriver 从系统删除一个打印机驱动程序 <BR>DeletePrintProcessor 从指定系统删除一个打印处理器 <BR>DeletePrintProvidor 从系统中删除一个打印供应商 <BR>DeviceCapabilities 利用这个函数可获得与一个设备的能力有关的信息 <BR>DocumentProperties 打印机配置控制函数 <BR>EndDocAPI 结束一个成功的打印作业 <BR>EndDocPrinter 在后台打印程序的级别指定一个文档的结束 <BR>EndPage 用这个函数完成一个页面的打印，并准备设备场景，以便打印下一个页 <BR>EndPagePrinter 指定一个页在打印作业中的结尾 <BR>EnumForms 枚举一台打印机可用的表单 <BR>EnumJobs 枚举打印队列中的作业 <BR>EnumMonitors 枚举可用的打印监视器 <BR>EnumPorts 枚举一个系统可用的端口 <BR>EnumPrinterDrivers 枚举指定系统中已安装的打印机驱动程序 <BR>EnumPrinters 枚举系统中安装的打印机 <BR>EnumPrintProcessorDatatypes 枚举由一个打印处理器支持的数据类型 <BR>EnumPrintProcessors 枚举系统中可用的打印处理器 <BR>Escape 设备控制函数 <BR>FindClosePrinterChangeNotification 关闭用FindFirstPrinterChangeNotification函数获取的一个打印机通告对象 <BR>FindFirstPrinterChangeNotification 创建一个新的改变通告对象，以便我们注意打印机状态的各种变化 <BR>FindNextPrinterChangeNotification 用这个函数判断触发一次打印机改变通告信号的原因 <BR>FreePrinterNotifyInfo 释放由FindNextPrinterChangeNotification函数分配的一个缓冲区 <BR>GetForm 取得与指定表单有关的信息 <BR>GetJob 获取与指定作业有关的信息 <BR>GetPrinter 取得与指定打印机有关的信息 <BR>GetPrinterData 为打印机设置注册表配置信息 <BR>GetPrinterDriver 针对指定的打印机，获取与打印机驱动程序有关的信息 <BR>GetPrinterDriverDirectory 判断指定系统中包含了打印机驱动程序的目录是什么 <BR>GetPrintProcessorDirectory 判断指定系统中包含了打印机处理器驱动程序及文件的目录 <BR>OpenPrinter 打开指定的打印机，并获取打印机的句柄 <BR>PrinterMessageBox 在拥有指定打印作业的系统上显示一个打印机出错消息框 <BR>PrinterProperties 启动打印机属性对话框，以便对打印机进行配置 <BR>ReadPrinter 从打印机读入数据 <BR>ResetDC 重设一个设备场景 <BR>ResetPrinter 改变指定打印机的默认数据类型及文档设置 <BR>ScheduleJob 提交一个要打印的作业 <BR>SetAbortProc 为Windows指定取消函数的地址 <BR>SetForm 为指定的表单设置信息 <BR>SetJob 对一个打印作业的状态进行控制 <BR>SetPrinter 对一台打印机的状态进行控制 <BR>SetPrinterData 设置打印机的注册表配置信息 <BR>StartDoc 开始一个打印作业 <BR>StartDocPrinter 在后台打印的级别启动一个新文档 <BR>StartPage 打印一个新页前要先调用这个函数 <BR>StartPagePrinter 在打印作业中指定一个新页的开始 <BR>WritePrinter 将发送目录中的数据写入打印机 <BR>5. API之文本和字体函数 <BR>AddFontResource 在Windows系统中添加一种字体资源 <BR>CreateFont 用指定的属性创建一种逻辑字体 <BR>CreateFontIndirect 用指定的属性创建一种逻辑字体 <BR>CreateScalableFontResource 为一种TureType字体创建一个资源文件，以便能用API函数AddFontResource将其加入Windows系统 <BR>DrawText 将文本描绘到指定的矩形中 <BR>DrawTextEx 与DrawText相似，只是加入了更多的功能 <BR>EnumFontFamilies 列举指定设备可用的字体 <BR>EnumFontFamiliesEx 列举指定设备可用的字体 <BR>EnumFonts 列举指定设备可用的字体 <BR>ExtTextOut 经过扩展的文本描绘函数。也请参考SetTextAlign函数 <BR>GetAspectRatioFilterEx 用SetMapperFlags要求Windows只选择与设备当前纵横比相符的光栅字体时，本函数可判断纵横比大小 <BR>GetCharABCWidths 判断TureType字体中一个或多个字符的A-B-C大小 <BR>GetCharABCWidthsFloat 查询一种字体中一个或多个字符的A-B-C尺寸 <BR>GetCharacterPlacement 该函数用于了解如何用一个给定的字符显示一个字串 <BR>GetCharWidth 调查字体中一个或多个字符的宽度 <BR>GetFontData 接收一种可缩放字体文件的数据 <BR>GetFontLanguageInfo 返回目前选入指定设备场景中的字体的信息 <BR>GetGlyphOutline 取得TureType字体中构成一个字符的曲线信息 <BR>GetKerningPairs 取得指定字体的字距信息 <BR>GetOutlineTextMetrics 接收与TureType字体内部特征有关的详细信息 <BR>GetRasterizerCaps 了解系统是否有能力支持可缩放的字体 <BR>GetTabbedTextExtent 判断一个字串占据的范围，同时考虑制表站扩充的因素 <BR>GetTextAlign 接收一个设备场景当前的文本对齐标志 <BR>GetTextCharacterExtra 判断额外字符间距的当前值 <BR>GetTextCharset 接收当前选入指定设备场景的字体的字符集标识符 <BR>GetTextCharsetInfo 获取与当前选定字体的字符集有关的详细信息 <BR>GetTextColor 判断当前字体颜色。通常也称为"前景色" <BR>GetTextExtentExPoint 判断要填入指定区域的字符数量。也用一个数组装载每个字符的范围信息 <BR>GetTextExtentPoint 判断一个字串的大小（范围） <BR>GetTextFace 获取一种字体的字样名 <BR>GetTextMetrics 获取与选入一种设备场景的物理字体有关的信息 <BR>GrayString 描绘一个以灰色显示的字串。通常由Windows用于标识禁止状态 <BR>PolyTextOut 描绘一系列字串 <BR>RemoveFontResource 从Windows系统中删除一种字体资源 <BR>SetMapperFlags Windows对字体进行映射时，可用该函数选择与目标设备的纵横比相符的光栅字体 <BR>SetTextAlign 设置文本对齐方式，并指定在文本输出过程中使用设备场景的当前位置 <BR>SetTextCharacterExtra 描绘文本的时候，指定要在字符间插入的额外间距 <BR>SetTextColor 设置当前文本颜色。这种颜色也称为"前景色" <BR>SetTextJustification 通过指定一个文本行应占据的额外空间，可用这个函数对文本进行两端对齐处理 <BR>TabbedTextOut 支持制表站的一个文本描绘函数 <BR>TextOut 文本绘图函数 <BR>6. API之菜单函数 <BR>AppendMenu 在指定的菜单里添加一个菜单项 <BR>CheckMenuItem 复选或撤消复选指定的菜单条目 <BR>CheckMenuRadioItem 指定一个菜单条目被复选成"单选"项目 <BR>CreateMenu 创建新菜单 <BR>CreatePopupMenu 创建一个空的弹出式菜单 <BR>DeleteMenu 删除指定的菜单条目 <BR>DestroyMenu 删除指定的菜单 <BR>DrawMenuBar 为指定的窗口重画菜单 <BR>EnableMenuItem 允许或禁止指定的菜单条目 <BR>GetMenu 取得窗口中一个菜单的句柄 <BR>GetMenuCheckMarkDimensions 返回一个菜单复选符的大小 <BR>GetMenuContextHelpId 取得一个菜单的帮助场景ID <BR>GetMenuDefaultItem 判断菜单中的哪个条目是默认条目 <BR>GetMenuItemCount 返回菜单中条目（菜单项）的数量 <BR>GetMenuItemID 返回位于菜单中指定位置处的条目的菜单ID <BR>GetMenuItemInfo 取得（接收）与一个菜单条目有关的特定信息 <BR>GetMenuItemRect 在一个矩形中装载指定菜单条目的屏幕坐标信息 <BR>GetMenuState 取得与指定菜单条目状态有关的信息 <BR>GetMenuString 取得指定菜单条目的字串 <BR>GetSubMenu 取得一个弹出式菜单的句柄，它位于菜单中指定的位置 <BR>GetSystemMenu 取得指定窗口的系统菜单的句柄 <BR>HiliteMenuItem 控制顶级菜单条目的加亮显示状态 <BR>InsertMenu 在菜单的指定位置处插入一个菜单条目，并根据需要将其他条目向下移动 <BR>InsertMenuItem 插入一个新菜单条目 <BR>IsMenu 判断指定的句柄是否为一个菜单的句柄 <BR>LoadMenu 从指定的模块或应用程序实例中载入一个菜单 <BR>LoadMenuIndirect 载入一个菜单 <BR>MenuItemFromPoint 判断哪个菜单条目包含了屏幕上一个指定的点 <BR>ModifyMenu 改变菜单条目 <BR>RemoveMenu 删除指定的菜单条目 <BR>SetMenu 设置窗口菜单 <BR>SetMenuContextHelpId 设置一个菜单的帮助场景ID <BR>SetMenuDefaultItem 将一个菜单条目设为默认条目 <BR>SetMenuItemBitmaps 设置一幅特定位图，令其在指定的菜单条目中使用，代替标准的复选符号（√） <BR>SetMenuItemInfo 为一个菜单条目设置指定的信息 <BR>TrackPopupMenu 在屏幕的任意地方显示一个弹出式菜单 <BR>TrackPopupMenuEx 与TrackPopupMenu相似，只是它提供了额外的功能 <BR>7. API之位图、图标和光栅运算函数 <BR>BitBlt 将一幅位图从一个设备场景复制到另一个 <BR>CopyIcon 制作指定图标或鼠标指针的一个副本。这个副本从属于发出调用的应用程序 <BR>CopyImage 复制位图、图标或指针，同时在复制过程中进行一些转换工作 <BR>CreateBitmap 按照规定的格式创建一幅与设备有关位图 <BR>CreateBitmapIndirect 创建一幅与设备有关位图 <BR>CreateCompatibleBitmap 创建一幅与设备有关位图，它与指定的设备场景兼容 <BR>CreateCursor 创建一个鼠标指针 <BR>CreateDIBitmap 根据一幅与设备无关的位图创建一幅与设备有关的位图 <BR>CreateDIBSection 创建一个DIBSection <BR>CreateIcon 创建一个图标 <BR>CreateIconIndirect 创建一个图标 <BR>DestroyCursor 清除指定的鼠标指针，并释放它占用的所有系统资源 <BR>DestroyIcon 清除图标 <BR>DrawIcon 在指定的位置画一个图标 <BR>DrawIconEx 描绘一个图标或鼠标指针。与DrawIcon相比，这个函数提供了更多的功能 <BR>ExtractAssociatedIcon 判断一个可执行程序或DLL中是否存在图标，或是否有图标与系统注册表中指定的文件存在关联并提取之 <BR>ExtractIcon 判断一个可执行文件或DLL中是否有图标存在，并将其提取出来 <BR>GetBitmapBits 将来自位图的二进制位复制到一个缓冲区 <BR>GetBitmapDimensionEx 取得一幅位图的宽度和高度 <BR>GetDIBColorTable 从选入设备场景的DIBSection中取得颜色表信息 <BR>GetDIBits 将来自一幅位图的二进制位复制到一幅与设备无关的位图里 <BR>GetIconInfo 取得与图标有关的信息 <BR>GetStretchBltMode 判断StretchBlt 和 StretchDIBits函数采用的伸缩模式 <BR>LoadBitmap 从指定的模块或应用程序实例中载入一幅位图 <BR>LoadCursor 从指定的模块或应用程序实例中载入一个鼠标指针 <BR>LoadCursorFromFile 在一个指针文件或一个动画指针文件的基础上创建一个指针 <BR>LoadIcon 从指定的模块或应用程序实例中载入一个图标 <BR>LoadImage 载入一个位图、图标或指针 <BR>MaskBlt 执行复杂的图象传输，同时进行掩模（MASK）处理 <BR>PatBlt 在当前选定的刷子的基础上，用一个图案填充指定的设备场景 <BR>PlgBlt 复制一幅位图，同时将其转换成一个平行四边形。利用它可对位图进行旋转处理 <BR>SetBitmapBits 将来自缓冲区的二进制位复制到一幅位图 <BR>SetBitmapDimensionEx 设置一幅位图的宽度。以一毫米的十分之一为单位 <BR>SetDIBColorTable 设置选入设备场景的一个DIBSection的颜色表信息 <BR>SetDIBits 将来自与设备无关位图的二进制位复制到一幅与设备有关的位图里 <BR>SetDIBitsToDevice 将一幅与设备无关位图的全部或部分数据直接复制到一个设备 <BR>SetStretchBltMode 指定StretchBlt 和 StretchDIBits函数的伸缩模式 <BR>StretchBlt 将一幅位图从一个设备场景复制到另一个 <BR>StretchDIBits 将一幅与设备无关位图的全部或部分数据直接复制到指定的设备场景 <BR>8. API之绘图函数 <BR>AbortPath 抛弃选入指定设备场景中的所有路径。也取消目前正在进行的任何路径的创建工作 <BR>AngleArc 用一个连接弧画一条线 <BR>Arc 画一个圆弧 <BR>BeginPath 启动一个路径分支 <BR>CancelDC 取消另一个线程里的长时间绘图操作 <BR>Chord 画一个弦 <BR>CloseEnhMetaFile 关闭指定的增强型图元文件设备场景，并将新建的图元文件返回一个句柄 <BR>CloseFigure 描绘到一个路径时，关闭当前打开的图形 <BR>CloseMetaFile 关闭指定的图元文件设备场景，并向新建的图元文件返回一个句柄 <BR>CopyEnhMetaFile 制作指定增强型图元文件的一个副本（拷贝） <BR>CopyMetaFile 制作指定（标准）图元文件的一个副本 <BR>CreateBrushIndirect 在一个LOGBRUSH数据结构的基础上创建一个刷子 <BR>CreateDIBPatternBrush 用一幅与设备无关的位图创建一个刷子，以便指定刷子样式（图案） <BR>CreateEnhMetaFile 创建一个增强型的图元文件设备场景 <BR>CreateHatchBrush 创建带有阴影图案的一个刷子 <BR>CreateMetaFile 创建一个图元文件设备场景 <BR>CreatePatternBrush 用指定了刷子图案的一幅位图创建一个刷子 <BR>CreatePen 用指定的样式、宽度和颜色创建一个画笔 <BR>CreatePenIndirect 根据指定的LOGPEN结构创建一个画笔 <BR>CreateSolidBrush 用纯色创建一个刷子 <BR>DeleteEnhMetaFile 删除指定的增强型图元文件 <BR>DeleteMetaFile 删除指定的图元文件 <BR>DeleteObject 删除GDI对象，对象使用的所有系统资源都会被释放 <BR>DrawEdge 用指定的样式描绘一个矩形的边框 <BR>DrawEscape 换码（Escape）函数将数据直接发至显示设备驱动程序 <BR>DrawFocusRect 画一个焦点矩形 <BR>DrawFrameControl 描绘一个标准控件 <BR>DrawState 为一幅图象或绘图操作应用各式各样的效果 <BR>Ellipse 描绘一个椭圆，由指定的矩形围绕 <BR>EndPath 停止定义一个路径 <BR>EnumEnhMetaFile 针对一个增强型图元文件，列举其中单独的图元文件记录 <BR>EnumMetaFile 为一个标准的windows图元文件枚举单独的图元文件记录 <BR>EnumObjects 枚举可随同指定设备场景使用的画笔和刷子 <BR>ExtCreatePen 创建一个扩展画笔（装饰或几何） <BR>ExtFloodFill 在指定的设备场景里，用当前选择的刷子填充一个区域 <BR>FillPath 关闭路径中任何打开的图形，并用当前刷子填充 <BR>FillRect 用指定的刷子填充一个矩形 <BR>FlattenPath 将一个路径中的所有曲线都转换成线段 <BR>FloodFill 用当前选定的刷子在指定的设备场景中填充一个区域 <BR>FrameRect 用指定的刷子围绕一个矩形画一个边框 <BR>GdiComment 为指定的增强型图元文件设备场景添加一条注释信息 <BR>GdiFlush 执行任何未决的绘图操作 <BR>GdiGetBatchLimit 判断有多少个GDI绘图命令位于队列中 <BR>GdiSetBatchLimit 指定有多少个GDI绘图命令能够进入队列 <BR>GetArcDirection 画圆弧的时候，判断当前采用的绘图方向 <BR>GetBkColor 取得指定设备场景当前的背景颜色 <BR>GetBkMode 针对指定的设备场景，取得当前的背景填充模式 <BR>GetBrushOrgEx 判断指定设备场景中当前选定刷子起点 <BR>GetCurrentObject 获得指定类型的当前选定对象 <BR>GetCurrentPositionEx 在指定的设备场景中取得当前的画笔位置 <BR>GetEnhMetaFile 取得磁盘文件中包含的一个增强型图元文件的图元文件句柄 <BR>GetEnhMetaFileBits 将指定的增强型图元文件复制到一个内存缓冲区里 <BR>GetEnhMetaFileDescription 返回对一个增强型图元文件的说明 <BR>GetEnhMetaFileHeader 取得增强型图元文件的图元文件头 <BR>GetEnhMetaFilePaletteEntries 取得增强型图元文件的全部或部分调色板 <BR>GetMetaFile 取得包含在一个磁盘文件中的图元文件的图元文件句柄 <BR>GetMetaFileBitsEx 将指定的图元文件复制到一个内存缓冲区 <BR>GetMiterLimit 取得设备场景的斜率限制（Miter）设置 <BR>GetNearestColor 根据设备的显示能力，取得与指定颜色最接近的一种纯色 <BR>GetObjectAPI 取得对指定对象进行说明的一个结构 <BR>GetObjectType 判断由指定句柄引用的GDI对象的类型 <BR>GetPath 取得对当前路径进行定义的一系列数据 <BR>GetPixel 在指定的设备场景中取得一个像素的RGB值 <BR>GetPolyFillMode 针对指定的设备场景，获得多边形填充模式 <BR>GetROP2 针对指定的设备场景，取得当前的绘图模式 <BR>GetStockObject 取得一个固有对象（Stock） <BR>GetSysColorBrush 为任何一种标准系统颜色取得一个刷子 <BR>GetWinMetaFileBits 通过在一个缓冲区中填充用于标准图元文件的数据，将一个增强型图元文件转换成标准windows图元文件 <BR>InvertRect 通过反转每个像素的值，从而反转一个设备场景中指定的矩形 <BR>LineDDA 枚举指定线段中的所有点 <BR>LineTo 用当前画笔画一条线，从当前位置连到一个指定的点 <BR>MoveToEx 为指定的设备场景指定一个新的当前画笔位置 <BR>PaintDesk 在指定的设备场景中描绘桌面墙纸图案 <BR>PathToRegion 将当前选定的路径转换到一个区域里 <BR>Pie 画一个饼图 <BR>PlayEnhMetaFile 在指定的设备场景中画一个增强型图元文件 <BR>PlayEnhMetaFileRecord 回放单独一条增强型图元文件记录 <BR>PlayMetaFile 在指定的设备场景中回放一个图元文件 <BR>PlayMetaFileRecord 回放来自图元文件的单条记录 <BR>PolyBezier 描绘一条或多条贝塞尔（Bezier）曲线 <BR>PolyDraw 描绘一条复杂的曲线，由线段及贝塞尔曲线组成 <BR>Polygon 描绘一个多边形 <BR>Polyline 用当前画笔描绘一系列线段 <BR>PolyPolygon 用当前选定画笔描绘两个或多个多边形 <BR>PolyPolyline 用当前选定画笔描绘两个或多个多边形 <BR>Rectangle 用当前选定的画笔描绘矩形，并用当前选定的刷子填充 <BR>RoundRect 用当前选定的画笔画一个圆角矩形，并用当前选定的刷子在其中填充 <BR>SelectClipPath 将设备场景当前的路径合并到剪切区域里 <BR>SelectObject 为当前设备场景选择图形对象 <BR>SetArcDirection 设置圆弧的描绘方向 <BR>SetBkColor 为指定的设备场景设置背景颜色 <BR>SetBkMode 指定阴影刷子、虚线画笔以及字符中的空隙的填充方式 <BR>SetBrushOrgEx 为指定的设备场景设置当前选定刷子的起点 <BR>SetEnhMetaFileBits 用指定内存缓冲区内包含的数据创建一个增强型图元文件 <BR>SetMetaFileBitsEx 用包含在指定内存缓冲区内的数据结构创建一个图元文件 <BR>SetMiterLimit 设置设备场景当前的斜率限制 <BR>SetPixel 在指定的设备场景中设置一个像素的RGB值 <BR>SetPixelV 在指定的设备场景中设置一个像素的RGB值 <BR>SetPolyFillMode 设置多边形的填充模式 <BR>SetROP2 设置指定设备场景的绘图模式。与vb的DrawMode属性完全一致 <BR>SetWinMetaFileBits 将一个标准Windows图元文件转换成增强型图元文件 <BR>StrokeAndFillPath 针对指定的设备场景，关闭路径上打开的所有区域 <BR>StrokePath 用当前画笔描绘一个路径的轮廓。打开的图形不会被这个函数关闭 <BR>UnrealizeObject 将一个刷子对象选入设备场景之前，如刷子的起点准备用SetBrushOrgEx修改，则必须先调用本函数 <BR>WidenPath 根据选定画笔的宽度，重新定义当前选定的路径 <BR>9. API之设备场景函数 <BR>CombineRgn 将两个区域组合为一个新区域 <BR>CombineTransform 驱动世界转换。它相当于依顺序进行两次转换 <BR>CreateCompatibleDC 创建一个与特定设备场景一致的内存设备场景 <BR>CreateDC 为专门设备创建设备场景 <BR>CreateEllipticRgn 创建一个椭圆 <BR>CreateEllipticRgnIndirect 创建一个内切于特定矩形的椭圆区域 <BR>CreateIC 为专用设备创建一个信息场景 <BR>CreatePolygonRgn 创建一个由一系列点围成的区域 <BR>CreatePolyPolygonRgn 创建由多个多边形构成的区域。每个多边形都应是封闭的 <BR>CreateRectRgn 创建一个矩形区域 <BR>CreateRectRgnIndirect 创建一个矩形区域 <BR>CreateRoundRectRgn 创建一个圆角矩形 <BR>DeleteDC 删除专用设备场景或信息场景，释放所有相关窗口资源 <BR>DPtoLP 将点阵从设备坐标转换到专用设备场景逻辑坐标 <BR>EqualRgn 确定两个区域是否相等 <BR>ExcludeClipRect 从专用设备场景的剪裁区中去掉一个矩形区。矩形内不能进行绘图 <BR>ExcludeUpdateRgn 从专用设备场景剪裁区去掉指定窗口的刷新区域 <BR>ExtCreateRegion 根据世界转换修改区域 <BR>ExtSelectClipRgn 将指定区域组合到设备场景的当前剪裁区 <BR>FillRgn 用指定刷子填充指定区域 <BR>FrameRgn 用指定刷子围绕指定区域画一个外框 <BR>GetBoundsRect 获取指定设备场景的边界矩形 <BR>GetClipBox 获取完全包含指定设备场景剪裁区的最小矩形 <BR>GetClipRgn 获取设备场景当前剪裁区 <BR>GetDC 获取指定窗口的设备场景 <BR>GetDCEx 为指定窗口获取设备场景。相比GetDC，本函数提供了更多的选项 <BR>GetDCOrgEx 获取指定设备场景起点位置（以屏幕坐标表示） <BR>GetDeviceCaps 根据指定设备场景代表的设备的功能返回信息 <BR>GetGraphicsMode 确定是否允许增强图形模式（世界转换） <BR>GetMapMode 为特定设备场景调入映象模式 <BR>GetRegionData 装入描述一个区域信息的RgnData结构或缓冲区 <BR>GetRgnBox 获取完全包含指定区域的最小矩形 <BR>GetUpdateRgn 确定指定窗口的刷新区域。该区域当前无效，需要刷新 <BR>GetViewportExtEx 获取设备场景视口（viewport）范围 <BR>GetViewportOrgEx 获取设备场景视口起点 <BR>GetWindowDC 获取整个窗口（包括边框、滚动条、标题栏、菜单等）的设备场景 <BR>GetWindowExtEx 获取指定设备场景的窗口范围 <BR>GetWindowOrgEx 获取指定设备场景的逻辑窗口的起点 <BR>GetWindowRgn 获取窗口区域 <BR>GetWorldTransform 如果有世界转换，为设备场景获取当前世界转换 <BR>IntersectClipRect 为指定设备定义一个新的剪裁区 <BR>InvalidateRgn 使窗口指定区域不活动，并将它加入窗口刷新区，使之可随后被重画 <BR>InvertRgn 通过颠倒每个像素值反转设备场景指定区域 <BR>LPtoDP 将点阵从指定设备场景逻辑坐标转换为设备坐标 <BR>ModifyWorldTransform 根据指定的模式修改世界转换 <BR>OffsetClipRgn 按指定量平移设备场景剪裁区 <BR>OffsetRgn 按指定偏移量平移指定区域 <BR>OffsetViewportOrgEx 平移设备场景视口区域 <BR>OffsetWindowOrgEx 平移指定设备场景窗口起点 <BR>PaintRgn 用当前刷子背景色填充指定区域 <BR>PtInRegion 确定点是否在指定区域内 <BR>PtVisible 确定指定点是否可见（即，点是否在设备场景剪裁区内） <BR>RectInRegion 确定矩形是否有部分在指定区域内 <BR>RectVisible 确定指定矩形是否有部分可见（是否在设备场景剪裁区内） <BR>ReleaseDC 释放由调用GetDC或GetWindowDC函数获取的指定设备场景 <BR>RestoreDC 从设备场景堆栈恢复一个原先保存的设备场景 <BR>SaveDC 将指定设备场景状态保存到Windows设备场景堆栈 <BR>ScaleViewportExtEx 缩放设备场景视口的范围 <BR>ScaleWindowExtEx 缩放指定设备场景窗口范围 <BR>ScrollDC 在窗口（由设备场景代表）中水平和（或）垂直滚动矩形 <BR>SelectClipRgn 为指定设备场景选择新的剪裁区 <BR>SetBoundsRect 设置指定设备场景的边界矩形 <BR>SetGraphicsMode 允许或禁止增强图形模式，以提供某些支持（包括世界转换） <BR>SetMapMode 设置指定设备场景的映射模式 <BR>SetRectRgn 设置区域为指定的矩形 <BR>SetViewportExtEx 设置设备场景视口范围 <BR>SetViewportOrgEx 设置设备场景视口起点 <BR>SetWindowExtEx 设置指定设备场景窗口范围 <BR>SetWindowOrgEx 设置指定设备场景窗口起点 <BR>SetWindowRgn 设置窗口区域 <BR>SetWorldTransform 设置世界转换 <BR>ValidateRgn 激活窗口中指定区域，把它从刷新区移走 <BR>WindowFromDC 取回与某一设备场景相关的窗口的句柄 <BR>10. API之硬件与系统函数 <BR>ActivateKeyboardLayout 激活一个新的键盘布局。键盘布局定义了按键在一种物理性键盘上的位置与含义 <BR>Beep 用于生成简单的声音 <BR>CharToOem 将一个字串从ANSI字符集转换到OEM字符集 <BR>ClipCursor 将指针限制到指定区域 <BR>ConvertDefaultLocale 将一个特殊的地方标识符转换成真实的地方ID <BR>CreateCaret 根据指定的信息创建一个插入符（光标），并将它选定为指定窗口的默认插入符 <BR>DestroyCaret 清除（破坏）一个插入符 <BR>EnumCalendarInfo 枚举在指定"地方"环境中可用的日历信息 <BR>EnumDateFormats 列举指定的"当地"设置中可用的长、短日期格式 <BR>EnumSystemCodePages 枚举系统中已安装或支持的代码页 <BR>EnumSystemLocales 枚举系统已经安装或提供支持的"地方"设置 <BR>EnumTimeFormats 枚举一个指定的地方适用的时间格式 <BR>ExitWindowsEx 退出windows，并用特定的选项重新启动 <BR>ExpandEnvironmentStrings 扩充环境字串 <BR>FreeEnvironmentStrings 翻译指定的环境字串块 <BR>GetACP 判断目前正在生效的ANSI代码页 <BR>GetAsyncKeyState 判断函数调用时指定虚拟键的状态 <BR>GetCaretBlinkTime 判断插入符光标的闪烁频率 <BR>GetCaretPos 判断插入符的当前位置 <BR>GetClipCursor 取得一个矩形，用于描述目前为鼠标指针规定的剪切区域 <BR>GetCommandLine 获得指向当前命令行缓冲区的一个指针 <BR>GetComputerName 取得这台计算机的名称 <BR>GetCPInfo 取得与指定代码页有关的信息 <BR>GetCurrencyFormat 针对指定的"地方"设置，根据货币格式格式化一个数字 <BR>GetCursor 获取目前选择的鼠标指针的句柄 <BR>GetCursorPos 获取鼠标指针的当前位置 <BR>GetDateFormat 针对指定的"当地"格式，对一个系统日期进行格式化 <BR>GetDoubleClickTime 判断连续两次鼠标单击之间会被处理成双击事件的间隔时间 <BR>GetEnvironmentStrings 为包含了当前环境字串设置的一个内存块分配和返回一个句柄 <BR>GetEnvironmentVariable 取得一个环境变量的值 <BR>GetInputState 判断是否存在任何待决（等待处理）的鼠标或键盘事件 <BR>GetKBCodePage 由GetOEMCP取代，两者功能完全相同 <BR>GetKeyboardLayout 取得一个句柄，描述指定应用程序的键盘布局 <BR>GetKeyboardLayoutList 获得系统适用的所有键盘布局的一个列表 <BR>GetKeyboardLayoutName 取得当前活动键盘布局的名称 <BR>GetKeyboardState 取得键盘上每个虚拟键当前的状态 <BR>GetKeyboardType 了解与正在使用的键盘有关的信息 <BR>GetKeyNameText 在给出扫描码的前提下，判断键名 <BR>GetKeyState 针对已处理过的按键，在最近一次输入信息时，判断指定虚拟键的状态 <BR>GetLastError 针对之前调用的api函数，用这个函数取得扩展错误信息 <BR>GetLocaleInfo 取得与指定"地方"有关的信息 <BR>GetLocalTime 取得本地日期和时间 <BR>GetNumberFormat 针对指定的"地方"，按特定的格式格式化一个数字 <BR>GetOEMCP 判断在OEM和ANSI字符集间转换的windows代码页 <BR>GetQueueStatus 判断应用程序消息队列中待决（等待处理）的消息类型 <BR>GetSysColor 判断指定windows显示对象的颜色 <BR>GetSystemDefaultLangID 取得系统的默认语言ID <BR>GetSystemDefaultLCID 取得当前的默认系统"地方" <BR>GetSystemInfo 取得与底层硬件平台有关的信息 <BR>GetSystemMetrics 返回与windows环境有关的信息 <BR>GetSystemPowerStatus 获得与当前系统电源状态有关的信息 <BR>GetSystemTime 取得当前系统时间，这个时间采用的是"协同世界时间"（即UTC，也叫做GMT）格式 <BR>GetSystemTimeAdjustment 使内部系统时钟与一个外部的时钟信号源同步 <BR>GetThreadLocale 取得当前线程的地方ID <BR>GetTickCount 用于获取自windows启动以来经历的时间长度（毫秒） <BR>GetTimeFormat 针对当前指定的"地方"，按特定的格式格式化一个系统时间 <BR>GetTimeZoneInformation 取得与系统时区设置有关的信息 <BR>GetUserDefaultLangID 为当前用户取得默认语言ID <BR>GetUserDefaultLCID 取得当前用户的默认"地方"设置 <BR>GetUserName 取得当前用户的名字 <BR>GetVersion 判断当前运行的Windows和DOS版本 <BR>GetVersionEx 取得与平台和操作系统有关的版本信息 <BR>HideCaret 在指定的窗口隐藏插入符（光标） <BR>IsValidCodePage 判断一个代码页是否有效 <BR>IsValidLocale 判断地方标识符是否有效 <BR>keybd_event 这个函数模拟了键盘行动 <BR>LoadKeyboardLayout 载入一个键盘布局 <BR>MapVirtualKey 根据指定的映射类型，执行不同的扫描码和字符转换 <BR>MapVirtualKeyEx 根据指定的映射类型，执行不同的扫描码和字符转换 <BR>MessageBeep 播放一个系统声音。系统声音的分配方案是在控制面板里决定的 <BR>mouse_event 模拟一次鼠标事件 <BR>OemKeyScan 判断OEM字符集中的一个ASCII字符的扫描码和Shift键状态 <BR>OemToChar 将OEM字符集的一个字串转换到ANSI字符集 <BR>SetCaretBlinkTime 指定插入符（光标）的闪烁频率 <BR>SetCaretPos 指定插入符的位置 <BR>SetComputerName 设置新的计算机名 <BR>SetCursor 将指定的鼠标指针设为当前指针 <BR>SetCursorPos 设置指针的位置 <BR>SetDoubleClickTime 设置连续两次鼠标单击之间能使系统认为是双击事件的间隔时间 <BR>SetEnvironmentVariable 将一个环境变量设为指定的值 <BR>SetKeyboardState 设置每个虚拟键当前在键盘上的状态 <BR>SetLocaleInfo 改变用户"地方"设置信息 <BR>SetLocalTime 设置当前地方时间 <BR>SetSysColors 设置指定窗口显示对象的颜色 <BR>SetSystemCursor 改变任何一个标准系统指针 <BR>SetSystemTime 设置当前系统时间 <BR>SetSystemTimeAdjustment 定时添加一个校准值使内部系统时钟与一个外部的时钟信号源同步 <BR>SetThreadLocale 为当前线程设置地方 <BR>SetTimeZoneInformation 设置系统时区信息 <BR>ShowCaret 在指定的窗口里显示插入符（光标） <BR>ShowCursor 控制鼠标指针的可视性 <BR>SwapMouseButton 决定是否互换鼠标左右键的功能 <BR>SystemParametersInfo 获取和设置数量众多的windows系统参数 <BR>SystemTimeToTzSpecificLocalTime 将系统时间转换成地方时间 <BR>ToAscii 根据当前的扫描码和键盘信息，将一个虚拟键转换成ASCII字符 <BR>ToUnicode 根据当前的扫描码和键盘信息，将一个虚拟键转换成Unicode字符 <BR>UnloadKeyboardLayout 卸载指定的键盘布局 <BR>VkKeyScan 针对Windows字符集中一个ASCII字符，判断虚拟键码和Shift键的状态 <BR>11. API之进程和线程函数 <BR>CancelWaitableTimer 这个函数用于取消一个可以等待下去的计时器操作 <BR>CallNamedPipe 这个函数由一个希望通过管道通信的一个客户进程调用 <BR>ConnectNamedPipe 指示一台服务器等待下去，直至客户机同一个命名管道连接 <BR>CreateEvent 创建一个事件对象 <BR>CreateMailslot 创建一个邮路。返回的句柄由邮路服务器使用（收件人） <BR>CreateMutex 创建一个互斥体（MUTEX） <BR>CreateNamedPipe 创建一个命名管道。返回的句柄由管道的服务器端使用 <BR>CreatePipe 创建一个匿名管道 <BR>CreateProcess 创建一个新进程（比如执行一个程序） <BR>CreateSemaphore 创建一个新的信号机 <BR>CreateWaitableTimer 创建一个可等待的计时器对象 <BR>DisconnectNamedPipe 断开一个客户与一个命名管道的连接 <BR>DuplicateHandle 在指出一个现有系统对象当前句柄的情况下，为那个对象创建一个新句柄 <BR>ExitProcess 中止一个进程 <BR>FindCloseChangeNotification 关闭一个改动通知对象 <BR>FindExecutable 查找与一个指定文件关联在一起的程序的文件名 <BR>FindFirstChangeNotification 创建一个文件通知对象。该对象用于监视文件系统发生的变化 <BR>FindNextChangeNotification 重设一个文件改变通知对象，令其继续监视下一次变化 <BR>FreeLibrary 释放指定的动态链接库 <BR>GetCurrentProcess 获取当前进程的一个伪句柄 <BR>GetCurrentProcessId 获取当前进程一个唯一的标识符 <BR>GetCurrentThread 获取当前线程的一个伪句柄 <BR>GetCurrentThreadId 获取当前线程一个唯一的线程标识符 <BR>GetExitCodeProces 获取一个已中断进程的退出代码 <BR>GetExitCodeThread 获取一个已中止线程的退出代码 <BR>GetHandleInformation 获取与一个系统对象句柄有关的信息 <BR>GetMailslotInfo 获取与一个邮路有关的信息 <BR>GetModuleFileName 获取一个已装载模板的完整路径名称 <BR>GetModuleHandle 获取一个应用程序或动态链接库的模块句柄 <BR>GetPriorityClass 获取特定进程的优先级别 <BR>GetProcessShutdownParameters 调查系统关闭时一个指定的进程相对于其它进程的关闭早迟情况 <BR>GetProcessTimes 获取与一个进程的经过时间有关的信息 <BR>GetProcessWorkingSetSize 了解一个应用程序在运行过程中实际向它交付了多大容量的内存 <BR>GetSartupInfo 获取一个进程的启动信息 <BR>GetThreadPriority 获取特定线程的优先级别 <BR>GetTheardTimes 获取与一个线程的经过时间有关的信息 <BR>GetWindowThreadProcessId 获取与指定窗口关联在一起的一个进程和线程标识符 <BR>LoadLibrary 载入指定的动态链接库，并将它映射到当前进程使用的地址空间 <BR>LoadLibraryEx 装载指定的动态链接库，并为当前进程把它映射到地址空间 <BR>LoadModule 载入一个Windows应用程序，并在指定的环境中运行 <BR>MsgWaitForMultipleObjects 等侯单个对象或一系列对象发出信号。如返回条件已经满足，则立即返回 <BR>SetPriorityClass 设置一个进程的优先级别 <BR>SetProcessShutdownParameters 在系统关闭期间，为指定进程设置他相对于其它程序的关闭顺序 <BR>SetProcessWorkingSetSize 设置操作系统实际划分给进程使用的内存容量 <BR>SetThreadPriority 设定线程的优先级别 <BR>ShellExecute 查找与指定文件关联在一起的程序的文件名 <BR>TerminateProcess 结束一个进程 <BR>WinExec 运行指定的程序 <BR>12. API之控件与消息函数 <BR>AdjustWindowRect 给定一种窗口样式，计算获得目标客户区矩形所需的窗口大小 <BR>AnyPopup 判断屏幕上是否存在任何弹出式窗口 <BR>ArrangeIconicWindows 排列一个父窗口的最小化子窗口 <BR>AttachThreadInput 连接线程输入函数 <BR>BeginDeferWindowPos 启动构建一系列新窗口位置的过程 <BR>BringWindowToTop 将指定的窗口带至窗口列表顶部 <BR>CascadeWindows 以层叠方式排列窗口 <BR>ChildWindowFromPoint 返回父窗口中包含了指定点的第一个子窗口的句柄 <BR>ClientToScreen 判断窗口内以客户区坐标表示的一个点的屏幕坐标 <BR>CloseWindow 最小化指定的窗口 <BR>CopyRect 矩形内容复制 <BR>DeferWindowPos 该函数为特定的窗口指定一个新窗口位置 <BR>DestroyWindow 清除指定的窗口以及它的所有子窗口 <BR>DrawAnimatedRects 描绘一系列动态矩形 <BR>EnableWindow 指定的窗口里允许或禁止所有鼠标及键盘输入 <BR>EndDeferWindowPos 同时更新DeferWindowPos调用时指定的所有窗口的位置及状态 <BR>EnumChildWindows 为指定的父窗口枚举子窗口 <BR>EnumThreadWindows 枚举与指定任务相关的窗口 <BR>EnumWindows 枚举窗口列表中的所有父窗口 <BR>EqualRect 判断两个矩形结构是否相同 <BR>FindWindow 寻找窗口列表中第一个符合指定条件的顶级窗口 <BR>FindWindowEx 在窗口列表中寻找与指定条件相符的第一个子窗口 <BR>FlashWindow 闪烁显示指定窗口 <BR>GetActiveWindow 获得活动窗口的句柄 <BR>GetCapture 获得一个窗口的句柄，这个窗口位于当前输入线程，且拥有鼠标捕获（鼠标活动由它接收） <BR>GetClassInfo 取得WNDCLASS结构（或WNDCLASSEX结构）的一个副本，结构中包含了与指定类有关的信息 <BR>GetClassLong 取得窗口类的一个Long变量条目 <BR>GetClassName 为指定的窗口取得类名 <BR>GetClassWord 为窗口类取得一个整数变量 <BR>GetClientRect 返回指定窗口客户区矩形的大小 <BR>GetDesktopWindow 获得代表整个屏幕的一个窗口（桌面窗口）句柄 <BR>GetFocus 获得拥有输入焦点的窗口的句柄 <BR>GetForegroundWindow 获得前台窗口的句柄 <BR>GetLastActivePopup 获得在一个给定父窗口中最近激活过的弹出式窗口的句柄 <BR>GetParent 判断指定窗口的父窗口 <BR>GetTopWindow 搜索内部窗口列表，寻找隶属于指定窗口的头一个窗口的句柄 <BR>GetUpdateRect 获得一个矩形，它描叙了指定窗口中需要更新的那一部分 <BR>GetWindow 获得一个窗口的句柄，该窗口与某源窗口有特定的关系 <BR>GetWindowContextHelpId 取得与窗口关联在一起的帮助场景ID <BR>GetWindowLong 从指定窗口的结构中取得信息 <BR>GetWindowPlacement 获得指定窗口的状态及位置信息 <BR>GetWindowRect 获得整个窗口的范围矩形，窗口的边框、标题栏、滚动条及菜单等都在这个矩形内 <BR>GetWindowText 取得一个窗体的标题（caption）文字，或者一个控件的内容 <BR>GetWindowTextLength 调查窗口标题文字或控件内容的长短 <BR>GetWindowWord 获得指定窗口结构的信息 <BR>InflateRect 增大或减小一个矩形的大小 <BR>IntersectRect 这个函数在lpDestRect里载入一个矩形，它是lpSrc1Rect与lpSrc2Rect两个矩形的交集 <BR>InvalidateRect 屏蔽一个窗口客户区的全部或部分区域 <BR>IsChild 判断一个窗口是否为另一窗口的子或隶属窗口 <BR>IsIconic 判断窗口是否已最小化 <BR>IsRectEmpty 判断一个矩形是否为空 <BR>IsWindow 判断一个窗口句柄是否有效 <BR>IsWindowEnabled 判断窗口是否处于活动状态 <BR>IsWindowUnicode 判断一个窗口是否为Unicode窗口。这意味着窗口为所有基于文本的消息都接收Unicode文字 <BR>IsWindowVisible 判断窗口是否可见 <BR>IsZoomed 判断窗口是否最大化 <BR>LockWindowUpdate 锁定指定窗口，禁止它更新 <BR>MapWindowPoints 将一个窗口客户区坐标的点转换到另一窗口的客户区坐标系统 <BR>MoveWindow 改变指定窗口的位置和大小 <BR>OffsetRect 通过应用一个指定的偏移，从而让矩形移动起来 <BR>OpenIcon 恢复一个最小化的程序，并将其激活 <BR>PtInRect 判断指定的点是否位于矩形内部 <BR>RedrawWindow 重画全部或部分窗口 <BR>ReleaseCapture 为当前的应用程序释放鼠标捕获 <BR>ScreenToClient 判断屏幕上一个指定点的客户区坐标 <BR>ScrollWindow 滚动窗口客户区的全部或一部分 <BR>ScrollWindowEx 根据附加的选项，滚动窗口客户区的全部或部分 <BR>SetActiveWindow 激活指定的窗口 <BR>SetCapture 将鼠标捕获设置到指定的窗口 <BR>SetClassLong 为窗口类设置一个Long变量条目 <BR>SetClassWord 为窗口类设置一个条目 <BR>SetFocusAPI 将输入焦点设到指定的窗口。如有必要，会激活窗口 <BR>SetForegroundWindow 将窗口设为系统的前台窗口 <BR>SetParent 指定一个窗口的新父 <BR>SetRect 设置指定矩形的内容 <BR>SetRectEmpty 将矩形设为一个空矩形 <BR>SetWindowContextHelpId 为指定的窗口设置帮助场景（上下文）ID <BR>SetWindowLong 在窗口结构中为指定的窗口设置信息 <BR>SetWindowPlacement 设置窗口状态和位置信息 <BR>SetWindowPos 为窗口指定一个新位置和状态 <BR>SetWindowText 设置窗口的标题文字或控件的内容 <BR>SetWindowWord 在窗口结构中为指定的窗口设置信息 <BR>ShowOwnedPopups 显示或隐藏由指定窗口所有的全部弹出式窗口 <BR>ShowWindow 控制窗口的可见性 <BR>ShowWindowAsync 与ShowWindow相似 <BR>SubtractRect 装载矩形lprcDst，它是在矩形lprcSrc1中减去lprcSrc2得到的结果 <BR>TileWindows 以平铺顺序排列窗口 <BR>UnionRect 装载一个lpDestRect目标矩形，它是lpSrc1Rect和lpSrc2Rect联合起来的结果 <BR>UpdateWindow 强制立即更新窗口 <BR>ValidateRect 校验窗口的全部或部分客户区 <BR>WindowFromPoint 返回包含了指定点的窗口的句柄。忽略屏蔽、隐藏以及透明窗口<BR></P><img src ="http://www.blogjava.net/happyfish/aggbug/4139.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/happyfish/" target="_blank">小鱼儿</a> 2005-05-10 13:22 <a href="http://www.blogjava.net/happyfish/archive/2005/05/10/4139.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PDF档案格式中文嵌入现况与问题探讨</title><link>http://www.blogjava.net/happyfish/archive/2005/04/22/3624.html</link><dc:creator>小鱼儿</dc:creator><author>小鱼儿</author><pubDate>Fri, 22 Apr 2005 12:25:00 GMT</pubDate><guid>http://www.blogjava.net/happyfish/archive/2005/04/22/3624.html</guid><wfw:comment>http://www.blogjava.net/happyfish/comments/3624.html</wfw:comment><comments>http://www.blogjava.net/happyfish/archive/2005/04/22/3624.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/happyfish/comments/commentRss/3624.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/happyfish/services/trackbacks/3624.html</trackback:ping><description><![CDATA[<P><STRONG>PDF档案格式中文嵌入现况与问题探讨<BR></STRONG></P>
<P>作者 clhhome <BR>发帖于: 2004-05-05 23:53&nbsp;&nbsp;&nbsp;&nbsp;</P>
<P><BR>&nbsp;</P>
<P><B>摘要</B><BR><BR>在目前的状况来说，英文PDF档案格式在网路上、与文件交换的应用上已经可以说非常成熟了，但是中文方面的应用还比其他亚洲国家存在着更多的问题，以致於其应用的范围无法普及。本文的主旨在於探讨PDF档案格式的组成、制作以及制作後的档案特性，是以一种测试及探讨的方式来制作的。 <BR>　 </P>
<P><BR>&nbsp;</P>
<P><BR><B>壹、前言</B> </P>
<P><BR>&nbsp;</P>
<P>由Adobe公司所开发的PDF档案格式，打着"跨文字、跨语言、跨平台、跨媒体、跨软体、跨世纪的电子文件交换格式"，以及"这就是未来"的口号出现在我们眼前，这样的一种文件，它到底有何特别之处，有什麽能耐呢？ <BR>　 </P>
<P><BR>&nbsp;</P>
<P><BR><B>贰、何谓PDF档案</B> </P>
<P><BR>&nbsp;</P>
<P>所谓「PDF可携式文件格式」是一种开放式电子文件格式（符合美国Adobe公司Acrobat 之PDF标准），不论使用何种电脑平台或应用软体编辑的文件，几乎都可转换成「PDF」格式互通使用。除了在萤幕上浏览与印刷效果（文字、图型、影像）完全相同的式样外，更提供多种注记工具让使用者更有效率地阅读文件。 </P>
<P><BR>&nbsp;</P>
<P>通常我们会把Acrobat及PDF看作是同一件事，PDF是「Portable Document Format」的缩写，它主要目的就是要在各种不同的电脑平台上创造出一个共通的文件格式。换句话说，就是希望不管在那一种电脑上制作的文件，只要能转成PDF格式，拿到另一种电脑上就能毫无困难地打开阅读，更能维持制作当时的格式与版面，看起来跟原来的格式一模一样。 </P>
<P><BR>&nbsp;</P>
<P>这个问题是在不同电脑平台之间长期以来所存在的，常常在PC上制作的文件拿到MAC上，如果没有对等的软体或版本，即使有同样的软体，版本不同或中、英文版不同可能都没办法互相打开对方的档案，因而造成相当大的不便。如PDF格式的出现，就能使一个文件在不同平台上畅行无阻，而且看到的样子都一样，在也不用再花力气把档案格式转来转去。<BR></P>
<P><BR>&nbsp;</P>
<P><BR>　 <BR><B>叁、PDF档案格式介绍</B> </P>
<P><BR>&nbsp;</P>
<P>Portable Document Format可携带文件格式是将难以处理的PostScript码精化成一个页面与物件的资料库。它包含字型、影像及经压缩的向量物件，它是高度精简的文件格式。正如其名-可携带文件格式-它为统一可预测的高品质输出及可转用於多媒体用途作最佳化处理。PDF具有设备及媒介独立的特性，它支援CMYK、特殊色及合并的色域定义。PDF是一个支援补漏白、拼大版及可转换之页面取向的档案，一般人可以利用免费的Acrobat Reader软体在麦金塔电脑、视窗环境、Unix及网际网路浏览器浏览。 </P>
<P><BR>&nbsp;</P>
<P>制作PDF的程序有许多种，可以制作出许多不同性质及不同用途的PDF档。例如其中一种方法叫做"蒸馏"，利用Adobe Acrobat Distiller软体，可以将PostScript档案转换成PDF档案；另外也可以利用一种可选择周边设备的工具叫Adobe PDF Writer，利用它可自动将文件储在成PostScript档案，再自动转换成PDF档案，或者利用程序巨集或其他自动功能也可以将单独或多个PostScript档案转换成PDF档案。</P>
<P><BR>&nbsp;</P>
<P>在以往的印前工作流程里客户若需作最後一刻修改，则需回原编辑应用程式修改，再重新列印一次，而在PDF工作流程中，只需使用Acrobat 直接修改PDF档，无需再重回原编辑应用程式修改列印。 </P>
<P><BR>&nbsp;</P>
<P><B>一、PDF档案组成</B> <BR><BR>1.第一层包含文件的文字与图像。 <BR>2.第二层包含增效部份，例如书签，超文字连结、导览等。 <BR>3.第叁层包含档案的基本资讯，例如字形资讯和交换参考表。 </P>
<P><BR>&nbsp;</P>
<P><B>二、PDF档案格式的特点</B> <BR><BR>PDF为PostScript纯化过後的档案，它已经去除了PostScript在解译时所可能发生的不确定性，所以成功的转换成PDF档後，也就确保在後续的工作流程中能顺利的进行。您可以将任何应用软体产生的页面转换成PDF档案，完整的将原文件之文字、图形、影像、声音及链结嵌入PDF档案之中，让你可以在最後一刻做编辑修改而无须重回应用程式修改列印。</P>
<P><BR>&nbsp;</P>
<P>在转换时可以选择将文字包入PDF文件之中，即使一个中文PDF档案亦可在无安装中文字型的纯英文系统中正确的开启列印，真正的达到档案交换网路无国界。PDF亦可转换成内含字型的EPS档案，而转换成的EPS档案可以再组版或其他软体汇入再使用。 </P>
<P><BR>&nbsp;</P>
<P>（一）<B>高压缩</B> </P>
<P><BR>&nbsp;</P>
<P>PDF档案使用多种方法来达到缩减原PostScript文件的目的，在图片压缩的部分亦可支援述种格式压缩，一般档案通常可以压缩至原来的数十到数百分之一。尤其当使用者要在网路上发行电子文件时，为了速度的考虑，高压缩比就显得特别重要。 </P>
<P><BR>&nbsp;</P>
<P>1.JPEG： Joint Photographic Expert Group专业摄影联合组织，所推广的是一种减损性的静态影像压缩演算，为一种破坏性的压缩方法来压缩影像品质，其应用范围对於彩色的连续调图片较为适合。 </P>
<P><BR>&nbsp;</P>
<P>2.Zip 是用Jean-loup Gailly Mark Adler的Zlib套装软体的延伸开发而成，压缩方式是适台有花纹、底纹或大片重复影像图档。Acrobat 1.0分别提供了4bit及8bit的不同压缩比的演算，具取样方法是以重复的资料为主。 </P>
<P><BR>&nbsp;</P>
<P>3.CCITT Group1.CCITT Group4 是国际电话电信组织（International Coordinating Committee for Telephony &amp; Telegraphy）所订定的压缩标准，用来压缩黑白影像绘图软体所绘制的图档，或单色扫描图档以及线条稿。Acrobat 1.0提供这两种压缩方式适合单色调线条稿，如传真品质的档案。 </P>
<P><BR>&nbsp;</P>
<P>4.Run length 是针对单色线条稿的压缩，尤具有大区域的单色色块图档。 </P>
<P><BR>&nbsp;</P>
<P>5.Compress text &amp; Line Art 文字及线条都可以加以压缩。 &lt;注一&gt; </P>
<P><BR>&nbsp;</P>
<P>（二）<B>设备独立</B><BR><BR>一般 PostScript档案中包含了多种可能的合法程式码，在某些条件下 可能无法运行。例如那些依赖某些特殊字体结构、或输出设备的程式码。相反的，PDF格式不含任何程式结构，因而使得它更加安全，也更适合 以电子资料形式储存或传输。PDF是为整合多种输出选项的网路所设计的，它是标准化及设备独立最佳化输出格式。 对中文PDF文档之要求，不采用中文系统时，仍可独立显示中文；采用中文系统时，则可搜寻中文词汇。 </P>
<P><BR>&nbsp;</P>
<P>（三）<B>各页独立</B> </P>
<P><BR>&nbsp;</P>
<P>PostScript文件的各页间是相互关联的。这意味着你在跳到某页之前必 须把它前面所有的页都处理过。而PDF格式并没有这个限制。你可以直接 阅读PDF档案的任何一页，无须考虑其他页。 </P>
<P><BR>&nbsp;</P>
<P>（四）<B>注记</B> </P>
<P><BR>&nbsp;</P>
<P>PDF档案可以包含各种各样的注记--例如书签，缩影，链接，备注，文串，标识和媒体盒。你可以用这些“注记”以提高档案的质量及可读性。这些“注记”更可以有效的协助档案管理工作--例如制作、发送、 签注、修正、完稿、以及出版发行。 </P>
<P><BR>&nbsp;</P>
<P>（五）<B>档案保护</B><BR><BR>PDF档案可容许设定密码和其他多种保护方式，以防止非法使用。例如 必须使用密码才允许阅读、允许或不允许列印、复制、签注、或修改。 </P>
<P><BR><BR>&nbsp;</P>
<P>　 <BR><B>肆、中文PDF档案制作流程</B></P>
<P><BR>&nbsp;</P>
<P><BR><B>一、网页格式转存PDF档案格式：</B><BR><BR>PDF档案在英文字型的产生方面，已可轻而易举的制作，但在中文部分入前尚无法轻易地将网页直接转为PDF档，而必须间接的*一些转换才能将网页转为PDF档。在目前的情况来说呢，在Acrobat1.0中以开启网页的功能只能用在英文网页上，只需使用Web Capture输入URL即可将英文网页转成PDF档，且可保留其超连结部分的格式。但在中文网页部分，中文字体则会变成乱码，所以必须藉助Acrobat writer以及Distiller来列印PDF档案，虽然无法保留其超连结的格式，但可设定列印超连结表。 </P>
<P><BR>&nbsp;</P>
<P><B>二、排版软体转存PDF档案格式：</B><BR><BR>目前常见的排版软体对於PDF档案格式直接的支援程度并不高，大部分的排版软体无法直接转存PDF档，而必须*列印的方式来产生。对於支援直接转存PDF档案的软体来说，Microsoft Office系列算是最完整的了，基本上只需要将Acrobat 1.0在Office之後安装，即可在工具列产生一个Icon，使用者只需直接点选即可启动一名为PDF Maker的程式，轻易的将文件转为PDF档。其他如Page Maker、Quark Xpress或Illustrator则必须加装外挂程式才可以直接转存PDF档。基本上各种软体所产生含中文字体的PDF档案，大致上可分为以＂Acrobat Writer″、＂Acrobat Distiller″以及＂曲线″叁种产生方式，其中档案容量最大的是转为曲线的方式，其次为Distiller产生，最小的是以Acrobat Writer产生。当以相同的格式产生，使用的软体不同时，其档案大小会因为内含资讯的不同而有些少许的出入，但其档案的特性却是相同的。 <BR>其大致上的制作流程如下： *********</P>
<P><BR>&nbsp;</P>
<P><BR><B>三、PDF档案格式在於输出时的作业流程：</B> </P>
<P><BR>&nbsp;</P>
<P>PDF档案在专业输出时需搭配PostScript 3之RIP方能发挥最大生产效能，因为PostScript 3直接支援PDF档案格式，当档案列印至PostScript 3 RIP时，RIP只需进行处理过网，所以处理速度相对提升，且列印品质较佳(如渐层)。而若您原有的RIP只支援PostScript Level 2，则在列印PDF档案时会需要多一个转换成PostScript Level 2的流程。 <BR>前端在Mac平台上的排版软体使用CID ATM字型显示及编辑，产生PDF档案；後端再使用Postscript字型或相容输出机输出。<BR>&nbsp;</P>
<P><B>伍、亚洲字型嵌入现况</B> </P>
<P><BR><B>一、字型编码说明：<BR></B><BR>亚洲字型要嵌入PDF档案，比英文字型的嵌入需要更多的软体，以及更复杂的技术。在此之前我们必须说明亚洲字型以及英文型的差异点，以及其在不同平台上的差异点。在亚太地区，虽然都有使用汉字，但每个国家或地区所使用的内码都不相同，兹就各地区的编码介绍如下<BR><BR>（一）<B>台湾地区<BR></B>1.Big 5：俗称大五码 <BR>2.Big 5 plus：Big 5扩编码 <BR>3.CNS11643：中文标准交换码 </P>
<P>（二）<B>中国大陆 <BR></B>1.GB2312-80：通称国标码 <BR>2.GBK ：汉字内码扩展规范 </P>
<P>（三）<B>日本</B> <BR>1.Shift JIS <BR>2.EUC-JIS </P>
<P>（四）<B>韩国</B> <BR>1.KSC 5601 </P>
<P>（五）<B>其他</B>： </P>
<P><BR><B>二、编码原则：</B> </P>
<P>1.文字之选择及字体悉依"国字标准字体表"为基准 </P>
<P>2.以2个位元组（byte）为中文码编码单位，并以16进位制之文数字表示之 </P>
<P>3.符合CNS 5205及CNS7654之通信定则 </P>
<P>4.依字之使用频率而编排於各不同的字面 </P>
<P>5.每字面按先笔划後部首的排列顺序来编订字码 </P>
<P><BR><B>三、CID 字型与TrueType字型，PostScript字型的关系：</B><BR><BR>CID是取自於Character ID的缩写，此字元辨识码的功用在於帮助检索及取用字元，大量改进了其使用效能，此种方法最适合用於庞大的字体集如东方双位元文字－中文、日文、韩文等。Acrobat并非一定需要使用CID字型，亦可以使用TrueType字型，但在使用TrueType字型时若在印表机驱动程式字型选项中若选择将字型传送为Type 1时，则嵌入於PDF中的中文字无法再做增字的动作，而选择将字型传送为Type 42时，则嵌入於PDF中的中文字可修改增减（修改时系统中需有相同的字型）。中文PostScript字型目前尚无法适用於PDF档案格式。</P>
<P><BR>内嵌字型的最大优点便在解决文件产生者与输出者之间字型不同或对应错误的问题，现在PS流程是用字码对应，且必须是同一家字型公司的同一系列版本才可对应，字型内嵌可将此问题一劳永逸的解决。 </P>
<P><BR><B>四、Acrobat Reader 能显示包含 CJK 文字的 PDF 档案的方式：</B> </P>
<P>要显示 CJK 文字，有两种方式。一是在建立 PDF 档案时，作者可以嵌入所有文件中使用到的字体，包含 CJK 字体，只要字体可以被嵌入就行。任何语言版本的 Acrobat Reader 都可以用嵌入的 CJK 字体来显示 PDF 档案。但是因为嵌入字体的 PDF 档案可能会占太多空间，所以作者可能在建立档案时选择不嵌入文件中使用的所有字体，这是第二种方式；如果在这种情况下，Acrobat 或 Acrobat Reader 的使用者若要查看该 PDF 档案，就必须使用正确的亚洲文字字体集。 </P>
<P><BR><B>五、目前亚洲字体集中所包含的字体：</B><BR><BR>目前有四个亚洲字体集 （繁体中文、简体中文、日文与韩文）中，每个都包括有 serif 与 sans-serif 字体。 而 PDF 档案中嵌入的亚洲字体的类型，在Windows 平台上可嵌入 TrueType 字体，而在 Macintosh 与 Windows 平台上可以嵌入 CID 格式的 Adobe PostScript 字体。较旧的 OCF 格式的 PostScript 字体不能嵌入，此外，文件中的字体必须容许嵌入。 &lt;注叁&gt; </P>
<P><BR>嵌入字体使PDF档案大小改变的因素取决於文件所包含的字体数量及字元多少。大体而言，一般文件中每嵌入一个 C、J 或 K 字体，PDF 档案的大小就会增加 2 MB 到 3 MB 。<BR><BR>Macintosh 版 Acrobat 1.0 中的「MakeCID 」可将 TrueType 字体与较旧的 OCF 格式的 PostScript 字体转换成「Width-Only」（仅具宽度资讯） 的 CID 字体。这些 CID 字体仅包含 TrueType 或 OCF 字体中使用的罗马字元的宽度资讯，Distiller 在建立参考原始 TrueType 或 OCF 字体的 PDF 档案时，需要用到这种字形。<BR><BR>如需更多资讯，请参阅「MakeCID」公用程式资料夹中的文件。如需在罗马语言的作业系统中建立包含 CJK 文字的 PDF 档案，仅具宽度资讯的 CID 字体就可派上用场。 对於在罗马语言的系统上建立包含 CJK 文字的 PDF来说，Acrobat 中的 PDF Writer是不能在罗马语言的作业系统上建立包含 CJK 文字的 PDF 档案的。然而，如果 Distiller 可以使用它所要制作的 PostScript 档案中所参考的字体，那麽 Distiller 就能建立含有 CJK 文字的 PDF 档案。如果 PostScript 档案含有嵌入的 TrueType 字体，您就可以在任何平台上制作此 PostScript 档。<BR><BR>此外，针对目前 Adobe Type Library 中的所有 CJK 字体，以及 Macintosh 或 Windows 系统中常见的 TrueType 字体，Distiller 都附有「Width-Only」的 CID 字体。有了这些字体资讯，Distiller 将可以在任何平台上均可成功制作 PostScript 档案。此外，如果制作的 PostScript 档案中有其他的字体需要转换，还可以用「MakeCID」公用程式建立仅具宽度资讯的 CID 字体。 </P>
<P><B><BR>陆、中文繁体字嵌入现况以及其所面临的问题</B> </P>
<P>目前来说，支援中文PDF档案字型内嵌的字集在Mac上只有文鼎的CID ATM字型；在PC上有文鼎的CID PostScript字型，以目前面临的问题来说，第一就是档案大小，第二就是目前在网路上使用的USER并未普遍在个人PC上安装相关的浏览软体。特别是亚洲字型，除了浏览软体外，还必须加装亚洲文字字集方可开启嵌入亚洲字型的PDF档案。此外在印刷业上尚未能使用PDF档输出的做法。 </P>
<P><B>柒、未来解决方案</B> </P>
<P>PDF档案是一种非常具有发展潜力的档案格式，举凡各种格式的图文档案，皆可转成PDF档，未来无论是Microsoft系列的软体、Corel系列、Adobe系列，都将支援PDF档案格式的产生、修改、编辑以及输出。但就目前来说，除了Adobe Acrobat系列有完整的功能以外，其他软体的功能都还尚未健全，而且其他相关应用软体的种类太过繁杂，有待相关的软体开发公司开发出更具整合性的应用软体。 而档案大小的问题，只有两个方法，治标的方法为将PDF以更高的比例压缩，以利传输；而治本的方法还是必须一方面开发更宽频的网路；一方面使之更普及，以利大量的资料在网路上传输。 </P>
<P><BR><B>捌、结论</B></P>
<P>PDF档案格式并非Acrobat特有的档案格式，例如华康的DynaDoc档案格式亦为可携式文件的一种，其大致上的特性与Acrobat的PDF档案格式相近，只是功能上有些许的出入。但基本上的目的、用途、产生方式以及浏览方式是非常相近的。 </P>
<P>PDF档案尚有相当大的研发以及应用空间，例如在电子报方面，就是一个非常好的PDF档案应用实例，因为一般的电子报大多只有大量的文字，缺少图片以及活泼的版面，使得阅读者在浏览电子资讯时，会觉得面对满版僵硬的文字，而降低阅读的意愿；如果能将电子报编排成一般报纸的版面，以PDF档的格式表现在读者面前，如此有了活泼的版面以及图片，一定会增加使用者阅读的意愿；另外，PDF档第二层的超连结功能亦可让使用者从头条标题上直接连结，将页面导引到报纸的内文中，而省去了逐页浏览的时间。当然了，这部分的构想还得等使用者习惯於以Acrobat Reader阅读档案，以及各种问题解决後，才能进入实验及应用阶段，这将是另一个网路出版的新出路。 </P>
<P><B>玖、附注</B> </P>
<P>【注一】Acrobat4.0电子文件新世纪P59~60 </P>
<P>【注二】图片取自文鼎公司网站 </P>
<P>【注叁】针对目前可支援Distiller作嵌入的文鼎字型来说，只要为合法的原版字型，文鼎就允许使用者嵌入。 </P>
<P>【注四】使用Distiller将字形嵌入之文字，因失去文字特性，故无法做搜寻及复制。 </P>
<P><BR>　 <BR><B>名词解释</B> </P>
<P><BR><B>（一）PostScript：</B> <BR>PostScript为美国Adobe(http：//www.adobe.com)公司於1985年所发表的文件描述技术, Adobe并利用这个技术, 创造着名合乎PostScript技术的字型, 并从而改变正个印刷工业. </P>
<P>PostScript可以精确的描述平面绘制任何文字及图形. 现今PostScript的技术已经非常普遍的使用在印刷领域, 包括萤幕显示(Display), 雷射印表机(Laser Printer), 输出机(Imagesetter), 数位印刷机(Digital Printing)..等等输出设备. 而与PostScript技术搭配最重要的是PostScript字型, 使用者可以透过PostScript技术调整抹些参数, 而改变字型的大小, 阴影/立体/空心/粗细等特殊效果. 由於PostScript在印刷方面卓越表现, 目前世界上主要的文献几乎多是以PostScript的形式出现. Adobe1997年4月发表了更进步的PostScript 3 强调增进品质及彩色能力及网际网路列印功能. <BR><BR><B>（二）TrueType：</B><BR>TrueType字型格式为美国Apple及Microsoft所共同制定. 最先使用於Apple的Macintosh系列及Microsoft Windows 3.1, 而目前Apple的OS 8.0及Microsoft Windows 95/NT也都使用TrueType作为字型格式 基本上TrueType和PostScript一样, 都是使用贝兹曲线(Bezier Curve)来描述的外框字. 字型可以作任意尺寸的放大缩小, 或作其他属性的变化.不过由於Apple及Microsoft的作业系统都直接支援此字型格式. 所以并不需要如PostScript一样, 外挂(Adobe)Type Manager之类的程式. <BR><BR><B>（叁）ATM：</B> <BR>ATM（Adobe Type Manager）的功用在於管理Type 1字型的使用，ATM会自动将Type 1外框字点阵化以用於萤幕显示或印表机列印，若所欲列印的印表机为PostScript印表机，则ATM会将字型下载至印表机，由印表机做点阵化外框字。而欲列印的印表机为一般非PostScript印表机时，则ATM会自动将Type 1外框字型点阵化再传送至印表机。 <BR><BR><B>（四）CID：</B> <BR>CID是取自於Character ID的缩写，此字元辨识码的功用在於帮助检索及取用字元，大量改进了其使用效能，此种方法最适合用於庞大的字体集如东方双位元文字－中文、日文、韩文等。 <BR><BR><B>（五）Unicode编码：</B> <BR>（Unicode编码）即为ISO 10646国际编码标准，完全符合Microsoft Office 2000及Windows 2000之字型编码规格，在单一作业系统下即可输入多国文字，使跨国文件的制作变得很轻松 <BR><BR><B>1.Unicode ：</B> <BR>Big 5：为目前在台湾普遍所使用的业界标准，Big 5码包括第一字面5401个汉字，第二字面7652个汉字及440个符号，目前支援Big 5的软硬体包含Windows 95/NT，Apple OS，倚天中文系统，点阵印表机，喷墨印表机，雷射印表机，等等软硬体设备都支持此内码，但由於台湾的特殊环境，所以并非只使用Big 5码为唯一的内码，其他尚包括如金资码，财税码，电信码，海关码，IBM 5550码，户政码，IBM主机码，公会码（TCA），王安码，等等，都分别使用於各种应用领域。 </P>
<P><B>2.Big 5 Plus：<BR></B>虽然Big 5字集为台湾最普遍使用的字集，但由於Big 5所定义的字集只有13053个汉字，并无法满足，专业使用者的需要，尤其是政府部门，更无法满足现阶段文件交换的需要，所以在"财团法人中文电脑推广基金会"的主持下完成对Big 5码的扩编，详细资料可参考"财团法人中文电脑推广基金会"网站（http：//www/cmex，org，tw），包括缘由，码本，…等等相关资讯。<BR><BR><B>3..CNS11643 中文标准交换码：</B> <BR>CNS11643 中文标准交换码，一般简称 CNS 码或 CNS11643 ，因中央标准局公布及修订之先後而有二个版本，一般称为 CNS11643-1986 版（1986公告版）及 CNS11643-1992 版（1992年修订版），此二个版本之差异仅在於其所编定之字数不同。75 年公告之 CNS11643定义 11.051个汉字，81 年修订版扩编为48，027 个汉字。 75 年公告之 CNS11643 名称为「通用汉字标准交换码」，於 81 年扩充後修订 CNS11643 名称为「中文标准交换码」。两个电脑系统要交换资料时，以两方皆认可之码传输，此称为交换码，交换码之设计须符合国际标准。因此一般在电脑内部处理时使用内码，而在传输时，再转换为标准交换码。 </P>
<P><B>4.GB2312-80：</B><BR>GB2312-80为中国大陆最为普遍使用的内码，不论在电脑作业系统如Apple Machitosh或Microsoft中文Windows简体版，都是以GB2312-80为内码，至於其他周边装置，如印表机，软体，标签印字机，及其他各种软硬体也都是以GB2312-80为内码，即使中文Windows 95虽以GBK为内码，但仍与GB2312-80相容 GB2312-80共规范了6763个汉字及682个符号，内容主要也都是简体化过的汉字，与Gb2312-80相对应的为GB12345-90，基本上GB12345-90仍保留原来繁体字的样子，但码序与GB2312-80相同，另外增加了100多个多对一的汉字 </P>
<P><B>5.GBK：<BR></B>汉字内码扩展规范，简称GBK，Chinese Internal Code Specification GBK工作小组於1995年10月成立，并於1995年12月完成GBK规范，基本上采用了原来GB2312-80所有的汉字及码位，并涵盖了原Unicode中所有的汉字20901.总共收录了883个符号，21003个汉字及提供了1894个造字码位<BR><BR>由於GBK的编码，在与GB2312-80的部分采用了GB-2312完全相同的码序与字样，所以市面上所有的合乎GB2312-80的文件，档案及程式都可以在合乎GBK规范的系统上正常运行，目前Microsoft简体版中文Windows 95就是以GBK为内码，又由於GBK同时也涵盖了Unicode所有CJK汉字，所以也可以和Unicode做一一对应， Unicode（http：//www，Unicode，com） ：（Universal Multiple Octet Coded Character Set） 国际标准组织於1984年4月成立IOS/IEC JTC1/SC2/WG2工作组，针对各国文字，符号进行统一性编码，1991年美国跨国公司成立Unicode Consortium，并於1991年10月与WG2达成协议，采用同一编码字集，目前Unicode是采用16 bit之编码架构，其字集内容与ISO 10646之BMP（Basic Multilingual Plane）相同，Unicode （Unicode Consortium）并於1992年6月通过DIS（Draft International Standard），目前版本为Unicode v1.0於1996年公布，内容包含符号6811.汉字20901.韩文拼音11171.造字区6400，保留20249共65534个码位。 </P>
<P><BR>　 <BR><B>参考资料</B> <BR>1.Publishing &amp; Production <BR>2.http://www.agfahome.com.tw/ （台湾Agfa首页） <BR>3.http://www.adobe.com （Adobe公司首页） <BR>4.http://www.arphic.com.tw/ （文鼎公司首页） <BR>5.http://www.dynalab.com.tw/ （华康公司赏页） <BR>6.Acrobat 4.0电子文件新世纪&nbsp;&nbsp;<BR></P>
<P><BR></P><img src ="http://www.blogjava.net/happyfish/aggbug/3624.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/happyfish/" target="_blank">小鱼儿</a> 2005-04-22 20:25 <a href="http://www.blogjava.net/happyfish/archive/2005/04/22/3624.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 编程技术中汉字问题的分析及解决    </title><link>http://www.blogjava.net/happyfish/archive/2005/04/22/3599.html</link><dc:creator>小鱼儿</dc:creator><author>小鱼儿</author><pubDate>Fri, 22 Apr 2005 02:28:00 GMT</pubDate><guid>http://www.blogjava.net/happyfish/archive/2005/04/22/3599.html</guid><wfw:comment>http://www.blogjava.net/happyfish/comments/3599.html</wfw:comment><comments>http://www.blogjava.net/happyfish/archive/2005/04/22/3599.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/happyfish/comments/commentRss/3599.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/happyfish/services/trackbacks/3599.html</trackback:ping><description><![CDATA[<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR vAlign=top>
<TD><SPAN class=atitle>Java 编程技术中汉字问题的分析及解决</SPAN></TD>
<TD width=8><IMG height=1 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></TD>
<TD align=right width=180><NOBR>
<TABLE cellSpacing=0 cellPadding=0>
<TBODY>
<TR vAlign=top>
<TD align=right></TD>
<TD width=46>
<FORM action=https://www-130.ibm.com/developerworks/secure/email-it.jsp>&nbsp;</FORM></TD></TR></TBODY></TABLE></NOBR></TD>
<TD width=6><IMG height=1 alt="" src="http://www.ibm.com/i/c.gif" width=6 border=0></TD></TR>
<TR vAlign=top>
<TD bgColor=#000000 colSpan=5><IMG height=1 alt="" src="http://www.ibm.com/i/c.gif" width=100 border=0></TD></TR>
<TR vAlign=top>
<TD bgColor=#ffffff colSpan=5><IMG height=8 alt="" src="http://www.ibm.com/i/c.gif" width=100 border=0></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR vAlign=top>
<TD width=5><IMG height=1 alt="" src="http://www.ibm.com/i/c.gif" width=5 border=0></TD>
<TD width="100%">
<TABLE cellSpacing=0 cellPadding=0 width=168 align=right border=0>
<TBODY>
<TR>
<TD width=8><IMG height=21 alt="" src="http://www.ibm.com/i/c.gif" width=5></TD>
<TD width=160>
<TABLE cellSpacing=0 cellPadding=0 width=160 border=0>
<TBODY>
<TR>
<TD width=160 bgColor=#000000 height=1><IMG height=1 alt="" src="http://www.ibm.com/i/c.gif" width=160></TD></TR>
<TR>
<TD align=middle background=/developerworks/cn/i/bg-gold.gif height=5><B>内容：</B></TD></TR>
<TR>
<TD width=160 bgColor=#666666 height=1><IMG height=1 alt="" src="http://www.ibm.com/i/c.gif" width=160></TD></TR>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=0 width=160 border=0>
<TBODY>
<TR>
<TD><A href="http://www-128.ibm.com/developerworks/cn/java/java_chinese/index.html#1">汉字编码的常识</A></TD></TR>
<TR>
<TD height=1><IMG height=5 alt="" src="http://www.ibm.com/i/c.gif" width=160></TD></TR>
<TR>
<TD><A href="http://www-128.ibm.com/developerworks/cn/java/java_chinese/index.html#2">Java 中文问题的初步认识</A></TD></TR>
<TR>
<TD height=1><IMG height=5 alt="" src="http://www.ibm.com/i/c.gif" width=160></TD></TR>
<TR>
<TD><A href="http://www-128.ibm.com/developerworks/cn/java/java_chinese/index.html#3">Java 中文问题的表层分析及处理</A></TD></TR>
<TR>
<TD height=1><IMG height=5 alt="" src="http://www.ibm.com/i/c.gif" width=160></TD></TR>
<TR>
<TD><A href="http://www-128.ibm.com/developerworks/cn/java/java_chinese/index.html#4">Java 中文问题的根源分析及解决</A></TD></TR>
<TR>
<TD height=1><IMG height=5 alt="" src="http://www.ibm.com/i/c.gif" width=160></TD></TR>
<TR>
<TD><A href="http://www-128.ibm.com/developerworks/cn/java/java_chinese/index.html#7">关于 Java 中文问题的总结</A></TD></TR>
<TR>
<TD height=1><IMG height=5 alt="" src="http://www.ibm.com/i/c.gif" width=160></TD></TR><!--Standard links for every dw-article-->
<TR>
<TD><A href="http://www-128.ibm.com/developerworks/cn/java/java_chinese/index.html#rating">对本文的评价</A></TD></TR>
<TR>
<TD></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=160 border=0>
<TBODY>
<TR>
<TD width=160 bgColor=#000000 height=1></TD></TR>
<TR>
<TD align=middle background=/developerworks/cn/i/bg-gold.gif height=5><B></B></TD></TR>
<TR>
<TD width=160 bgColor=#666666 height=1></TD></TR>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=1 width=160 border=0>
<TBODY>
<TR>
<TD></TD></TR>
<TR>
<TD height=1><IMG height=5 alt="" src="http://www.ibm.com/i/c.gif" width=160></TD></TR>
<TR>
<TD height=1><IMG height=5 alt="" src="http://www.ibm.com/i/c.gif" width=160></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=160 border=0>
<TBODY>
<TR>
<TD width=150 bgColor=#000000 colSpan=2 height=2></TD></TR>
<TR>
<TD width=150 bgColor=#ffffff colSpan=2 height=2><IMG height=2 alt="" src="http://www.ibm.com/i/c.gif" width=160></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<P><NAME>段明辉</NAME><BR>自由撰稿人<BR>2000 年 11 月 </P>
<BLOCKQUOTE><ABSTRACT-EXTENDED><I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerworks/">在基于 Java 语言的编程中，我们经常碰到汉字的处理及显示的问题。一大堆看不懂的乱码肯定不是我们愿意看到的显示效果，怎样才能够让那些汉字正确显示呢？Java语言默认的编码方式是UNICODE，而我们中国人通常使用的文件和数据库都是基于GB2312或者BIG5等方式编码的，怎样才能够恰当地选择汉字编码方式并正确地处理汉字的编码呢？本文将从汉字编码的常识入手，结合Java编程实例，分析以上两个问题并提出解决它们的方案。</I> </ABSTRACT-EXTENDED></BLOCKQUOTE>
<P>现在 Java 编程语言已经广泛应用于互联网世界，早在 Sun 公司开发 Java 语言的时候，就已经考虑到对非英文字符的支持了。Sun 公司公布的 Java 运行环境（JRE）本身就分英文版和国际版，但只有国际版才支持非英文字符。不过在 Java 编程语言的应用中，对中文字符的支持并非如同 Java Soft 的标准规范中所宣称的那样完美，因为中文字符集不只一个，而且不同的操作系统对中文字符的支持也不尽相同，所以会有许多和汉字编码处理有关的问题在我们进行应用开发中困扰着我们。有很多关于这些问题的解答，但都比较琐碎，并不能够满足大家迫切解决问题的愿望，关于 Java 中文问题的系统研究并不多，本文从汉字编码常识出发，分析 Java 中文问题，希望对大家解决这个问题有所帮助。</P>
<P><A name=1><SPAN class=atitle2>汉字编码的常识</SPAN></A><BR>我们知道，英文字符一般是以一个字节来表示的，最常用的编码方法是 ASCII 。但一个字节最多只能区分256个字符，而汉字成千上万，所以现在都以双字节来表示汉字，为了能够与英文字符分开，每个字节的最高位一定为1，这样双字节最多可以表示64K格字符。我们经常碰到的编码方式有 GB2312、BIG5、UNICODE 等。关于具体编码方式的详细资料，有兴趣的读者可以查阅相关资料。我肤浅谈一下和我们关系密切的 GB2312 和 UNICODE。GB2312 码，中华人民共和国国家标准汉字信息交换用编码，是一个由中华人民共和国国家标准总局发布的关于简化汉字的编码，通行于中国大陆地区及新加坡，简称国标码。两个字节中，第一个字节（高字节）的值为区号值加32（20H），第二个字节（低字节）的值为位号值加32（20H），用这两个值来表示一个汉字的编码。UNICODE 码是微软提出的解决多国字符问题的多字节等长编码，它对英文字符采取前面加“0”字节的策略实现等长兼容。如 “A” 的 ASCII 码为0x41，UNICODE 就为0x00，0x41。利用特殊的工具各种编码之间可以互相转换。</P>
<P><A name=2><SPAN class=atitle2>Java 中文问题的初步认识</SPAN></A><BR>我们基于 Java 编程语言进行应用开发时，不可避免地要处理中文。Java 编程语言默认的编码方式是 UNICODE，而我们通常使用的数据库及文件都是基于 GB2312 编码的，我们经常碰到这样的情况：浏览基于 JSP 技术的网站看到的是乱码，文件打开后看到的也是乱码，被 Java 修改过的数据库的内容在别的场合应用时无法继续正确地提供信息。</P>
<P>String sEnglish = “apple”;</P>
<P>String sChinese = “苹果”;</P>
<P>String s = “苹果 apple ”;</P>
<P>sEnglish 的长度是5，sChinese的长度是4，而 s 默认的长度是14。对于 sEnglish来说， Java 中的各个类都支持得非常好，肯定能够正确显示。但对于 sChinese 和 s 来说，虽然 Java Soft 声明 Java 的基本类已经考虑到对多国字符的支持（默认 UNICODE 编码），但是如果操作系统的默认编码不是 UNICODE ，而是国标码等。从 Java 源代码到得到正确的结果，要经过 “Java 源代码-&gt; Java 字节码-&gt; ;虚拟机-&gt;操作系统-&gt;显示设备”的过程。在上述过程中的每一步骤，我们都必须正确地处理汉字的编码，才能够使最终的显示结果正确。</P>
<P>“ Java 源代码-&gt; Java 字节码”，标准的 Java 编译器 javac 使用的字符集是系统默认的字符集，比如在中文 Windows 操作系统上就是 GBK ,而在 Linux 操作系统上就是ISO-8859-1，所以大家会发现在 Linux 操作系统上编译的类中源文件中的中文字符都出了问题，解决的办法就是在编译的时候添加 encoding 参数，这样才能够与平台无关。用法是</P>
<P>javac ?Cencoding GBK。</P>
<P>“ Java 字节码-&gt;虚拟机-&gt;操作系统”， Java 运行环境 （JRE） 分英文版和国际版，但只有国际版才支持非英文字符。 Java 开发工具包 （JDK） 肯定支持多国字符，但并非所有的计算机用户都安装了 JDK 。很多操作系统及应用软件为了能够更好的支持 Java ，都内嵌了 JRE 的国际版本，为自己支持多国字符提供了方便。</P>
<P>“操作系统-&gt;显示设备”，对于汉字来说，操作系统必须支持并能够显示它。英文操作系统如果不搭配特殊的应用软件的话，是肯定不能够显示中文的。</P>
<P>还有一个问题，就是在 Java 编程过程中，对中文字符进行正确的编码转换。例如，向网页输出中文字符串的时候，不论你是用</P>
<P>out.println(string);还是用</P>
<P>&lt;%=string%&gt;，都必须作 UNICODE 到 GBK 的转换，或者手动，或者自动。在 JSP 1.0中，可以定义输出字符集，从而实现内码的自动转换。用法是</P>
<P>&lt;%@page contentType=”text/html;charset=gb2312” %&gt;</P>
<P>但是在一些 JSP 版本中并没有提供对输出字符集的支持，（例如 JSP 0.92），这就需要手动编码输出了，方法非常多。最常用的方法是</P>
<P>String s1 = request.getParameter(“keyword”);</P>
<P>String s2 = new String(s1.getBytes(“ISO-8859-1”),”GBK”);</P>
<P>getBytes 方法用于将中文字符以“ISO-8859-1”编码方式转化成字节数组，而“GBK” 是目标编码方式。我们从以ISO-8859-1方式编码的数据库中读出中文字符串 s1 ，经过上述转换过程，在支持 GBK 字符集的操作系统和应用软件中就能够正确显示中文字符串 s2 。</P>
<P><A name=3><SPAN class=atitle2>Java 中文问题的表层分析及处理</SPAN></A><BR></P>
<TABLE cellSpacing=0 cellPadding=3 width="80%" border=1>
<TBODY>
<TR vAlign=top>
<TD align=middle width="100%" colSpan=4>背景 </TD></TR>
<TR vAlign=top>
<TD width="25%">开发环境 </TD>
<TD width="25%">JDK1.15 </TD>
<TD width="25%">Vcafe2.0 </TD>
<TD width="25%">JPadPro </TD></TR>
<TR vAlign=top>
<TD width="25%">服务器端 </TD>
<TD width="25%">NT IIS </TD>
<TD width="25%">Sybase System </TD>
<TD width="25%">Jconnect（JDBC） </TD></TR>
<TR vAlign=top>
<TD width="25%">客户端 </TD>
<TD width="25%">IE5.0 </TD>
<TD width="25%">Pwin98 </TD>
<TD width="25%">?span &gt; </TD></TR></TBODY></TABLE>
<P>.CLASS 文件存放在服务器端，由客户端的浏览器运行 APPLET ， APPLET 只起调入 FRAME 类等主程序的作用。界面包括 Textfield ，TextArea，List，Choice 等。</P>
<P>I.用 JDBC 执行 SELECT 语句从服务器端读取数据（中文）后，将数据用 APPEND 方法加到 TextArea（TA） ，不能正确显示。但加到 List 中时，大部分汉字却可正确显示。</P>
<P>将数据按“ISO-8859-1” 编码方式转化为字节数组，再按系统缺省编码方式 （Default Character Encoding） 转化为 STRING ，即可在 TA 和 List 中正确显示。</P>
<P>程序段如下：</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
dbstr2 = results.getString(1);
//After reading the result from DB server，converting it to string.
dbbyte1 = dbstr2.getBytes(“iso-8859-1”);
dbstr1 = new String(dbbyte1);</CODE></PRE></TD></TR></TBODY></TABLE>
<P>在转换字符串时不采用系统默认编码方式，而直接采用“ GBK” 或者 “GB2312” ,在 A 和 B 两种情况下，从数据库取数据都没有问题。</P>
<P>II.处理方式与“取中文”相逆，先将 SQL 语句按系统缺省编码方式转化为字节数组，再按“ISO-8859-1”编码方式转化为 STRING ，最后送去执行，则中文信息可正确写入数据库。</P>
<P>程序段如下：</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
sqlstmt = tf_input.getText();

//Before sending statement to DB server，converting it to sql statement.

dbbyte1 = sqlstmt.getBytes();

sqlstmt = newString(dbbyte1,”iso-8859-1”);

_stmt = _con.createStatement();

_stmt.executeUpdate(sqlstmt);

……

</CODE></PRE></TD></TR></TBODY></TABLE>
<P>问题：如果客户机上存在 CLASSPATH 指向 JDK 的 CLASSES.ZIP 时（称为 A 情况），上述程序代码可正确执行。但是如果客户机只有浏览器，而没有 JDK 和 CLASSPATH 时（称为 B 情况），则汉字无法正确转换。</P>
<P>我们的分析：</P>
<P>1.经过测试，在 A 情况下，程序运行时系统的缺省编码方式为 GBK 或者 GB2312 。在 B 情况下，程序启动时浏览器的 JAVA 控制台中出现如下错误信息：</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc border=1>
<TBODY>
<TR>
<TD><PRE><CODE>Can't find resource for sun.awt.windows.awtLocalization_zh_CN</CODE></PRE></TD></TR></TBODY></TABLE>
<P>然后系统的缺省编码方式为“8859-1”。</P>
<P>2.如果在转换字符串时不采用系统缺省编码方式，而是直接采用 “GBK” 或“GB2312”，则在 A 情况下程序仍然可正常运行，在 B 情况下，系统出现错误：</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc border=1>
<TBODY>
<TR>
<TD><PRE><CODE>UnsupportedEncodingException。</CODE></PRE></TD></TR></TBODY></TABLE>
<P>3.在客户机上，把 JDK 的 CLASSES.ZIP 解压后，放在另一个目录中， CLASSPATH 只包含该目录。然后一边逐步删除该目录中的 .CLASS 文件，另一边运行测试程序，最后发现在一千多个 CLASS 文件中，只有一个是必不可少的，该文件是：</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc border=1>
<TBODY>
<TR>
<TD><PRE><CODE>sun.io.CharToByteDoubleByte.class。</CODE></PRE></TD></TR></TBODY></TABLE>
<P>将该文件拷到服务器端和其它的类放在一起，并在程序的开头 IMPORT 它，在 B 情况下程序仍然无法正常运行。</P>
<P>4.在 A 情况下，如果在 CLASSPTH 中去掉 sun.io.CharToByteDoubleByte.class ，则程序运行时测得默认编码方式为“8859-1”，否则为 “GBK” 或 “GB2312” 。</P>
<P>如果 JDK 的版本为1.2以上的话，在 B 情况下遇到的问题得到了很好的解决，测试的步骤同上，有兴趣的读者可以尝试一下。</P>
<P><A name=4><SPAN class=atitle2>Java 中文问题的根源分析及解决</SPAN></A><BR>在简体中文 MS Windows 98 + JDK 1.3 下，可以用 System.getProperties() 得到 Java 运行环境的一些基本属性，类 PoorChinese 可以帮助我们得到这些属性。</P>
<P>类 PoorChinese 的源代码：</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc border=1>
<TBODY>
<TR>
<TD><PRE><CODE>public class PoorChinese {
}</CODE></PRE></TD></TR></TBODY></TABLE>
<P>执行 java PoorChinese 后，我们会得到:</P>
<P>系统变量 file.encoding 的值为 GBK ，user.language 的值为 zh ， user.region 的值为 CN ，这些系统变量的值决定了系统默认的编码方式是 GBK 。</P>
<P>在上述系统中，下面的代码将 GB2312 文件转换成 Big5 文件，它们能够帮助我们理解 Java 中汉字编码的转化:</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
?

import java.io.*;

import java.util.*;

?

public class gb2big5 {

?

static int iCharNum=0;

?

public static void main(String[] args) {

System.out.println("Input GB2312 file, output Big5 file.");

if (args.length!=2) {

System.err.println("Usage: jview gb2big5 gbfile big5file");

System.exit(1);

String inputString = readInput(args[0]);

writeOutput(inputString,args[1]);

System.out.println("Number of Characters in file: "+iCharNum+".");

}

?

static void writeOutput(String str, String strOutFile) {

try {

FileOutputStream fos = new FileOutputStream(strOutFile);

Writer out = new OutputStreamWriter(fos, "Big5");

out.write(str);

out.close();

}

catch (IOException e) {

e.printStackTrace();

e.printStackTrace();

}

}

?

static String readInput(String strInFile) {

StringBuffer buffer = new StringBuffer();

try {

FileInputStream fis = new FileInputStream(strInFile);

InputStreamReader isr = new InputStreamReader(fis, "GB2312");

Reader in = new BufferedReader(isr);

int ch;

while ((ch = in.read()) &gt; -1) {

iCharNum += 1;

buffer.append((char)ch);

}

in.close();

return buffer.toString();

}

catch (IOException e) {

e.printStackTrace();

return null;

}

}

}

?

			</CODE></PRE></TD></TR></TBODY></TABLE>
<P>编码转化的过程如下：</P>
<P>GB2312------------------&gt;Unicode-------------&gt;Big5</P>
<P>执行 java gb2big5 gb.txt big5.txt ，如果 gb.txt 的内容是“今天星期三”，则得到的文件 big5.txt 中的字符能够正确显示；而如果 gb.txt 的内容是“情人节快乐”，则得到的文件 big5.txt 中对应于“节”和“乐”的字符都是符号“？”（0x3F），可见 sun.io.ByteToCharGB2312 和 sun.io.CharToByteBig5 这两个基本类并没有编好。</P>
<P>正如上例一样， Java 的基本类也可能存在问题。由于国际化的工作并不是在国内完成的，所以在这些基本类发布之前，没有经过严格的测试，所以对中文字符的支持并不像 Java Soft 所声称的那样完美。前不久，我的一位技术上的朋友发信给我说，他终于找到了 <B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerworks/">Java Servlet 中文问题的根源</B>。两周以来，他一直为 Java Servlet 的中文问题所困扰，因为每面对一个含有中文字符的字符串都必须进行强制转换才能够得到正确的结果（这好象是大家公认的唯一的解决办法）。后来，他确实不想如此继续安分下去了，因为这样的事情确实不应该是高级程序员所要做的工作，他就找出 Servlet 解码的源代码进行分析，因为他怀疑问题就出在解码这部分。经过四个小时的奋斗，他终于找到了问题的根源所在。原来他的怀疑是正确的， Servlet 的解码部分完全没有考虑双字节，直接把 %XX 当作一个字符。（原来 Java Soft 也会犯这幺低级的错误！） </P>
<P>如果你对这个问题有兴趣或者遇到了同样的烦恼的话，你可以按照他的步骤 <B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerworks/">对Servlet.jar 进行修改</B>： </P>
<P>找到源代码 HttpUtils 中的 static private String parseName ，在返回前将 sb（StringBuffer） 复制成 byte bs[] ，然后 return new String(bs,”GB2312”)。作上述修改后就需要自己解码了：</P>
<P>HashTable form=HttpUtils .parseQueryString(request.getQueryString())或者</P>
<P>form=HttpUtils.parsePostData(……)</P>
<P>千万别忘了编译后放到 Servlet.jar 里面。</P>
<P><A name=7><SPAN class=atitle2>关于 Java 中文问题的总结</SPAN></A><BR></P>
<P>Java 编程语言成长于网络世界，这就要求 Java 对多国字符有很好的支持。 Java 编程语言适应了计算的网络化的需求，为它能够在网络世界迅速成长奠定了坚实的基础。 Java 的缔造者 （Java Soft） 已经考虑到 Java 编程语言对多国字符的支持，只是现在的解决方案有很多缺陷在里面，需要我们付诸一些补偿性的措施。而世界标准化组织也在努力把人类所有的文字统一在一种编码之中，其中一种方案是 ISO10646 ，它用四个字节来表示一个字符。当然，在这种方案未被采用之前，还是希望 Java Soft 能够严格地测试它的产品，为用户带来更多的方便。</P>
<P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerworks/">附</B>一个用于从数据库和网络中取出 <B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerworks/">中文乱码的处理函数</B>，入参是有问题的字符串，出参是问题已经解决了的字符串。 </P>
<P><CODE>技术应用者提供解决方案</CODE> </P></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/happyfish/aggbug/3599.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/happyfish/" target="_blank">小鱼儿</a> 2005-04-22 10:28 <a href="http://www.blogjava.net/happyfish/archive/2005/04/22/3599.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 关于中文乱码问题的解决方案与经验(zz)</title><link>http://www.blogjava.net/happyfish/archive/2005/04/22/3597.html</link><dc:creator>小鱼儿</dc:creator><author>小鱼儿</author><pubDate>Fri, 22 Apr 2005 02:22:00 GMT</pubDate><guid>http://www.blogjava.net/happyfish/archive/2005/04/22/3597.html</guid><wfw:comment>http://www.blogjava.net/happyfish/comments/3597.html</wfw:comment><comments>http://www.blogjava.net/happyfish/archive/2005/04/22/3597.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/happyfish/comments/commentRss/3597.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/happyfish/services/trackbacks/3597.html</trackback:ping><description><![CDATA[<TABLE class=p14 cellSpacing=0 cellPadding=2 width="96%" border=0>
<TBODY>
<TR>
<TD class=p12 align=middle><B>Java 关于中文乱码问题的解决方案与经验&nbsp; </B></TD></TR>
<TR>
<TD class=content align=middle><FONT color=#fb5104>作者：owen1944</FONT> 发文时间：2005.01.20</TD></TR>
<TR>
<TD class=content align=middle><IMG height=4 src="http://tech.ccidnet.com/pub/images/tech/line_4.jpg" width="100%"></TD></TR></TBODY></TABLE>
<TABLE class=p14 cellSpacing=0 cellPadding=2 width="96%" border=0>
<TBODY>
<TR>
<TD style="WORD-WRAP: break-word"><!-- <span id=tech_article_ad1></span> --><SPAN id=tech_art_center><!-- Copyright 1999-2000 ThruPort Technologies http://www.thruport.com --><!-- end dynamic banner insert --></SPAN><SPAN class=myp111><FONT id=zoom><CCID_NOBR>一、字节和unicode<BR>Java内核是unicode的，就连class文件也是，但是很多媒体，包括文件/流的保存方式是使用字节流的。因此Java要对这些字节流经行转化。char是unicode的，而byte是字节。Java中byte/char互转的函数在sun.io的包中间有。其中ByteToCharConverter类是中调度，可以用来告诉你，你用的convertor。其中两个很常用的静态函数是：<BR><BR><BR><BR><BR><BR><BR><BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>public static ByteToCharConverter getDefault(); 
public static ByteToCharConverter getConverter(String encoding);</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>如果你不指定converter，则系统会自动使用当前的encoding,gb平台上用gbk,en平台上用8859_1。 <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>byte ——〉char：
"你"的gb码是：0xc4e3 ,unicode是0x4f60
String encoding = "gb2312";
byte b[] = {(byte)'\u00c4',(byte)'\u00e3'};
ByteToCharConverter converter = ByteToCharConverter.getConverter(encoding);
char c[] = converter.convertAll(b);
for (int i = 0; i &lt; c.length; i++) {
System.out.println(Integer.toHexString(c[i]));
}
结果是什么？0x4f60
如果encoding ="8859_1"，结果又是什么？0x00c4,0x00e3</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>如果代码改为： <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>byte b[] = {(byte)'\u00c4',(byte)'\u00e3'};
ByteToCharConverter converter = ByteToCharConverter. getDefault();
 char c[] = converter.convertAll(b);
 for (int i = 0; i &lt; c.length; i++) {
    System.out.println(Integer.toHexString(c[i]));
 }</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>结果将又是什么？ <BR><BR>这就要根据平台的编码而定。 <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>char ——〉byte：
    String encoding = "gb2312";
    char c[] = {'\u4f60'};
    CharToByteConverter converter = CharToByteConverter.getConverter(encoding);
    byte b[] = converter.convertAll(c);
    for (int i = 0; i &lt; b.length; i++) {
       System.out.println(Integer.toHexString(b[i]));
    }
结果是什么？0x00c4,0x00e3
如果encoding ="8859_1"，结果又是什么？0x3f
如果代码改为
String encoding = "gb2312";
    char c[] = {'\u4f60'};
    CharToByteConverter converter = CharToByteConverter.getDefault();
    byte b[] = converter.convertAll(c);
    for (int i = 0; i &lt; b.length; i++) {
       System.out.println(Integer.toHexString(b[i]));
    }</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>结果将又是什么？还是根据平台的编码而定。 <BR><BR>很多中文问题就是从这两个最简单的类派生出来的。而却有很多类不直接支持把encoding输入，这给我们带来诸多不便。很多程序难得用encoding了，直接用default的encoding，这就给我们移植带来了很多困难。 <BR><BR>二、utf-8 <BR><BR>utf-8是和unicode一一对应的，其实现很简单： <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>7位的unicode: 0 _ _ _ _ _ _ _ 
11位的unicode: 1 1 0 _ _ _ _ _ 1 0 _ _ _ _ _ _ 
16位的unicode: 1 1 1 0 _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ 
21位的unicode: 1 1 1 1 0 _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>大多数情况是只使用到16位以下的unicode: <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>"你"的gb码是：0xc4e3 ,unicode是0x4f60
    0xc4e3的二进制：
          1100 ，0100 ，1110 ，0011</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>由于只有两位我们按照两位的编码来排，但是我们发现这行不通，因为第７位不是0因此，返回"?" <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>0x4f60的二进制：
               0100 ，1111 ，0110 ，0000
         我们用utf-8补齐，变成：
               1110 ，0100 ，1011 ，1101 ，1010 ，0000
         e4--bd-- a0
         于是返回：0xe4,0xbd,0xa0。</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>三、string和byte[] <BR><BR>string其实核心是char[],然而要把byte转化成string，必须经过编码。string.length()其实就是char数组的长度，如果使用不同的编码，很可能会错分，造成散字和乱码。例如： <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>String encoding = “”;
byte [] b={(byte)'\u00c4',(byte)'\u00e3'}; 
String str=new String(b,encoding);</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>如果encoding=8859_1，会有两个字，但是encoding=gb2312只有一个字这个问题在处理分页是经常发生。 <BR><BR>四、Reader,Writer / InputStream,OutputStream <BR><BR>Reader和Writer核心是char，InputStream和OutputStream核心是byte。但是Reader和Writer的主要目的是要把char读/写InputStream/OutputStream。例如： <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>文件test.txt只有一个"你"字，0xc4,0xe3
String encoding = "gb2312";
    InputStreamReader reader = new InputStreamReader(new FileInputStream(
        "text.txt"), encoding);
    char c[] = new char[10];
    int length = reader.read(c);
    for (int i = 0; i &lt; length; i++) {
       System.out.println(c[i]);
    }</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>结果是什么？是"你"。如果encoding ="8859_1"，结果是什么？"??"两个字符，表示不认识。反过来的例子自己做。 <BR></FONT></SPAN></TD></TR></TBODY></TABLE>
<TABLE class=p14 cellSpacing=0 cellPadding=2 width="96%" border=0>
<TBODY>
<TR>
<TD class=p12 align=middle><B></B></TD></TR>
<TR>
<TD class=content align=middle></TD></TR>
<TR>
<TD class=content align=middle><IMG height=4 src="http://tech.ccidnet.com/pub/images/tech/line_4.jpg" width="100%"></TD></TR></TBODY></TABLE>
<TABLE class=p14 cellSpacing=0 cellPadding=2 width="96%" border=0>
<TBODY>
<TR>
<TD style="WORD-WRAP: break-word"><!-- <span id=tech_article_ad1></span> --><SPAN id=tech_art_center><!-- Copyright 1999-2000 ThruPort Technologies http://www.thruport.com --><!-- end dynamic banner insert --></SPAN><SPAN class=myp111><FONT id=zoom><CCID_NOBR>五、我们要对Java的编译器有所了解：<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>Javac ?encoding</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>我们常常没有用到encoding这个参数。其实encoding这个参数对于跨平台的操作是很重要的。如果没有指定encoding，则按照系统的默认encoding,gb平台上是gb2312，英文平台上是iso8859_1。Java的编译器实际上是调用sun.tools.Javac.main的类，对文件进行编译，这个类有compile函数中间有一个encoding的变量,-encoding的参数其实直接传给encoding变量。编译器就是根据这个变量来读取Java文件的，然后把用utf-8形式编译成class文件。例子代码： <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>String str = "你";
    FileWriter writer = new FileWriter("text.txt");
    write.write(str);
    writer.close();

如果用gb2312编译，你会找到e4 bd a0的字段 ；
如果用8859_1编译， 00c4 00e3的二进制： 
0000，0000 ，1100，0100 ，0000，0000 ，1110，0011
因为每个字符都大于7位，因此用11位编码： 
1100，0001，1000，0100，1100，0011，1010，0011 
c1-- 84--　c3--　 a3 
你会找到c1 84 c3 a3</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>但是我们往往忽略掉这个参数，因此这样往往会有跨平台的问题： <BR><BR>样例代码在中文平台上编译，生成zhclass <BR><BR>样例代码在英文平台上编译，输出enclass <BR><BR>(1) zhclass在中文平台上执行ok,但是在英文平台上不行 <BR><BR>(2) enclass在英文平台上执行ok,但是在中文平台上不行 <BR><BR>原因是： <BR><BR>(1) 在中文平台上编译后，其实str在运行态的char[]是0x4f60,　在中文平台上运行，filewriter的缺省编码是gb2312,因此chartobyteconverter会自动用调用gb2312的converter,把str转化成byte输入到fileoutputstream中，于是0xc4,0xe3放进了文件。但是如果是在英文平台下，chartobyteconverter的缺省值是8859_1, filewriter会自动调用8859_1去转化str,但是他无法解释，因此他会输出"?" <BR><BR>(2) 在英文平台上编译后，其实str在运行态的char[]是0x00c4 0x00e3, 在中文平台上运行，中文无法识别，因此会出现??；在英文平台上，0x00c4--&gt;0xc4,0x00e3-&gt;0xe3，因此0xc4,0xe3被放进了文件。 <BR><BR>六、其它原因： <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>&lt;%@ page contentType="text/html; charset=GBK" %&gt;</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>设置浏览器的显示编码，如果response的数据是utf8编码，显示将是乱码，但是乱码和上述原因还不一样。 <BR><BR>七、发生编码的地方： <BR><BR>1. 从数据库到Java程序 byte——〉char <BR><BR>2. 从Java程序到数据库 char——〉byte <BR><BR>3. 从文件到Java程序 byte——〉char <BR><BR>4. 从Java程序到文件 char——〉byte <BR><BR>5. 从Java程序到页面显示 char——〉byte <BR><BR>6. 从页面form提交数据到Java程序byte——〉char <BR><BR>7. 从流到Java程序byte——〉char <BR><BR>8. 从Java程序到流char——〉byte <BR><BR>可以使用配置过滤器的方法解决中文乱码的： <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>&lt;web-app&gt;
  &lt;filter&gt;
    &lt;filter-name&gt;RequestFilter&lt;/filter-name&gt;
    &lt;filter-class&gt;net.golden.uirs.util.RequestFilter&lt;/filter-class&gt;
    &lt;init-param&gt;
      &lt;param-name&gt;charset&lt;/param-name&gt;
      &lt;param-value&gt;gb2312&lt;/param-value&gt;
    &lt;/init-param&gt;
  &lt;/filter&gt;
  &lt;filter-mapping&gt;
    &lt;filter-name&gt;RequestFilter&lt;/filter-name&gt;
    &lt;url-pattern&gt;*.Jsp&lt;/url-pattern&gt;
  &lt;/filter-mapping&gt;
&lt;/web-app&gt;


  public void doFilter(ServletRequest req, ServletResponse res,
                       FilterChain fChain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;
    HttpSession session = request.getSession();
    String userId = (String) session.getAttribute("userid");
req.setCharacterEncoding(this.filterConfig.getInitParameter("charset")); 
// 设置字符集？
实际上是设置了byte ——〉char的encoding
    try {
      if (userId == null || userId.equals("")) {
        if (!request.getRequestURL().toString().matches(
            ".*/uirs/logon/logon(Controller){0,1}\\x2EJsp$")) {
          session.invalidate();
          response.sendRedirect(request.getContextPath() +
                                "/uirs/logon/logon.Jsp");
        }
      }
      else { 
	  // 看看是否具有信息上报系统的权限
        if (!net.golden.uirs.util.UirsChecker.check(userId, "信息上报系统",
            net.golden.uirs.util.UirsChecker.ACTION_DO)) {
          if (!request.getRequestURL().toString().matches(
              ".*/uirs/logon/logon(Controller){0,1}\\x2EJsp$")) {
            response.sendRedirect(request.getContextPath() +
                                  "/uirs/logon/logonController.Jsp");
          }
        }
      }
    }
    catch (Exception ex) {
      response.sendRedirect(request.getContextPath() +
                            "/uirs/logon/logon.Jsp");
    }
    fChain.doFilter(req, res);
  }</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR></FONT></SPAN></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/happyfish/aggbug/3597.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/happyfish/" target="_blank">小鱼儿</a> 2005-04-22 10:22 <a href="http://www.blogjava.net/happyfish/archive/2005/04/22/3597.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>