<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5906929445033990464</id><updated>2011-11-28T07:50:01.075+08:00</updated><category term='随笔写'/><category term='搜索引擎，网站登记，入口'/><title type='text'>互联网好文搜藏</title><subtitle type='html'>互联网，人生</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://irlab.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://irlab.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>xlqb</name><uri>http://www.blogger.com/profile/07757898792107625243</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>38</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5906929445033990464.post-15564132593937590</id><published>2011-04-29T07:32:00.001+08:00</published><updated>2011-04-29T07:32:40.356+08:00</updated><title type='text'>未处理的好友请求，请处理</title><content type='html'>&lt;table width="620" border="0" cellpadding="0" cellspacing="0" style="margin:0 auto;padding:0 auto;font-size:12px;color:#333"&gt;&lt;tr&gt;&lt;td&gt;&lt;table width="100%" border="0" cellpadding="0" cellspacing="0" style="font-size:12px;border-collapse:collapse"&gt;&lt;tr&gt;&lt;td width="160"&gt;&lt;a href="http://c.renren.com/c.jsp?d=1304033130000&amp;k=ceee2fbc-71ee-11e0-88a2-001a4bdfa7bc4371&amp;u=http%3A//www.renren.com/"&gt;&lt;img style="border:none" width="159" height="35" src="http://s.xnimg.cn/imgpro/logo/logo-rr-159.png" title="人人网 renren.com - 人人网校内是一个真实的社交网络，联系朋友，一起玩游戏" alt="人人网 renren.com - 人人网校内是一个真实的社交网络，联系朋友，一起玩游戏" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign="middle" width="460" bgcolor="#005EAC" align="right" &gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;table width="100%" border="0" cellpadding="0" cellspacing="0" style="background:#FFF;border-right:1px solid #CCC;border-left:1px solid #CCC; border-bottom:1px solid #005EAC;font-size:12px;padding:20px;"&gt;&lt;tr&gt;&lt;td style="padding-bottom:10px;*padding-bottom:0;"&gt;&lt;h3 style="font-size:14px;font-weight:bold;margin:0 0 20px"&gt;你好！&lt;/h3&gt;&lt;span style="font-size:12px;"&gt;他们在人人网被推荐给你了：&lt;/span&gt;&lt;ul style="border-bottom:1px solid #CEE1EE;font-size:12px;list-style:none;padding:0;margin:0 0 10px 0;"&gt;         &lt;li style="padding:10px 0;width:180px;display:inline-block;*display:inline;*zoom:1;"&gt;&lt;a href="http://c.renren.com/c.jsp?d=1304033130000&amp;k=ceee2fbc-71ee-11e0-88a2-001a4bdfa7bc4371&amp;u=http%3A//wwv.renren.com/xn.do%3Fss%3D80370%26rt%3D1%26id%3D1552672232%26email%3Djeafyezheng1.irlab%40blogger.com%26cnt%3D1" style="float:left;margin-right:10px;"&gt;&lt;img border="0" src="http://hd37.xiaonei.com/photos/hd37/20081011/01/55/tiny_IP00_12883i198169.jpg " /&gt;&lt;/a&gt;&lt;a href="http://c.renren.com/c.jsp?d=1304033130000&amp;k=ceee2fbc-71ee-11e0-88a2-001a4bdfa7bc4371&amp;u=http%3A//wwv.renren.com/xn.do%3Fss%3D80370%26rt%3D1%26id%3D1552672232%26email%3Djeafyezheng1.irlab%40blogger.com%26cnt%3D1" style="color:#005EAC;text-decoration:none;font-weight:bold"&gt;叶正&lt;/a&gt;&lt;span style="display:block;padding:5px 0 5px 60px;color:#888"&gt;&lt;/span&gt;&lt;a style="color:#005EAC;text-decoration:none;" href="http://c.renren.com/c.jsp?d=1304033130000&amp;k=ceee2fbc-71ee-11e0-88a2-001a4bdfa7bc4371&amp;u=http%3A//wwv.renren.com/xn.do%3Fss%3D80370%26rt%3D1%26id%3D1552672232%26email%3Djeafyezheng1.irlab%40blogger.com%26cnt%3D1"&gt;加为好友&lt;/a&gt;&lt;/li&gt;         &lt;/ul&gt;&lt;/td&gt;&lt;td width="160" valign="top"&gt;&lt;div style="background:#FFFBC1;border:1px solid #F9B967;font-size:12px;padding:10px;text-align:center;"&gt;人人网，最大的实名社区&lt;br&gt;&lt;a style="display:block;width:100px;height:28px;line-height:28px;margin:10px auto 0; color:#FFF;font-size:14px;font-weight:bold;background:#67A54B;text-decoration: none;border:1px solid #3B6E22" href="http://c.renren.com/c.jsp?d=1304033130000&amp;k=ceee2fbc-71ee-11e0-88a2-001a4bdfa7bc4371&amp;u=http%3A//wwv.renren.com/xn.do%3Fss%3D80370%26rt%3D1%26id%3D1552672232%26email%3Djeafyezheng1.irlab%40blogger.com%26cnt%3D1"&gt;免费注册&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="2" style="border-bottom:1px solid #CEE1EE;"&gt;&lt;dl style="margin:0"&gt;&lt;dt style="font-size:12px;padding-bottom:15px;"&gt;人人网怎样改变你的生活：&lt;/dt&gt;&lt;dd style="margin:0 20px 0 0;float:left;width:170px"&gt;&lt;p style="font-weight:bold;margin:0 0 10px"&gt;&lt;img src="http://a.xnimg.cn/imgpro/icons/black-list.png" style="vertical-align:middle" /&gt;全新沟通方式&lt;/p&gt;&lt;img src="http://a.xnimg.cn/imgpro/letter/m-msg.png" style="float:left;margin-right:20px;display:block;" /&gt;&lt;div style="font-size:12px;"&gt;&lt;p style="line-height:18px;margin-top:5px;"&gt;找人？交友？只有实名制的这里，才能轻松搞定。&lt;/p&gt;&lt;/div&gt;&lt;/dd&gt;&lt;dd style="margin:0 20px 0 0;float:left;width:170px"&gt;&lt;p style="font-weight:bold;margin:0 0 10px"&gt;&lt;img src="http://a.xnimg.cn/imgpro/icons/black-list.png" style="vertical-align:middle" /&gt;丰富娱乐互动&lt;/p&gt;&lt;img src="http://a.xnimg.cn/imgpro/letter/m-game.png" style="float:left;margin-right:20px;display:block;" /&gt;&lt;div style="font-size:12px;"&gt;&lt;p style="line-height:18px;margin-top:5px;"&gt;视频音乐，游戏应用，玩在一起，心在一起。&lt;/p&gt;&lt;/div&gt;&lt;/dd&gt;&lt;dd style="margin:0;float:left;width:170px"&gt;&lt;p style="font-weight:bold;margin:0 0 10px"&gt;&lt;img src="http://a.xnimg.cn/imgpro/icons/black-list.png" style="vertical-align:middle" /&gt;海量实时资讯&lt;/p&gt;&lt;img src="http://a.xnimg.cn/imgpro/letter/m-feed.png" style="float:left;margin-right:20px;display:block;" /&gt;&lt;div style="font-size:12px;"&gt;&lt;p style="line-height:18px;margin-top:5px;"&gt;在1.8亿人实时更新的信息量前，神马报纸、联播都是浮云。&lt;/p&gt;&lt;/div&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="2" style="*padding:0 10px 10px;"&gt;&lt;p style="margin:0;padding-top:10px"&gt;感谢阅读本邮件&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/body&gt;&lt;/html&gt;         &lt;br/&gt;&lt;img style="display:none" src="http://c.renren.com/o.jsp?d=1304033130000&amp;k=ceee2fbc-71ee-11e0-88a2-001a4bdfa7bc437"/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5906929445033990464-15564132593937590?l=irlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5906929445033990464&amp;postID=15564132593937590&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/15564132593937590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/15564132593937590'/><link rel='alternate' type='text/html' href='http://irlab.blogspot.com/2011/04/blog-post.html' title='未处理的好友请求，请处理'/><author><name>xlqb</name><uri>http://www.blogger.com/profile/07757898792107625243</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5906929445033990464.post-3539702761430571164</id><published>2009-03-23T23:32:00.001+08:00</published><updated>2009-03-23T23:32:57.951+08:00</updated><title type='text'>Doug Bowman离职激起千层浪啊</title><content type='html'>翻译到底考不靠谱？&lt;br&gt;#tag: google, English, translation&lt;br&gt;看看这篇文章，翻译得好像是很有趣，没有直译的那种僵硬，但感觉文章多少有点变成翻译者的了，掺杂了太多翻译者的喜好和理解，自然原文里的那种原味就淡了些。譬如"被称之为设计师的倒霉孩子"，原文是 none of them，这个"倒霉"感觉也许原作者想读者去体会，但翻译者体会到了就翻译出来，模糊的东西被翻译得清晰化； "daring designs"被译为"有价值的设计"更是如此，甚至歪曲，也许原作者还客观；"high-up, respected leadership positions"被翻译成"有实权的领导位置"，感觉具体变抽象。当然这些只是我的个人感觉，并非批评译者翻译得不好，其实还是挺有趣。只是想讨论下阅读翻译的文章到底考不靠谱，我感觉始终有Gap，甚至误解。&lt;br&gt;&lt;br&gt; &lt;div style="margin: 0px 2px; padding-top: 1px;    background-color: #c3d9ff; font-size: 1px !important;    line-height: 0px !important;"&gt;&amp;nbsp;&lt;/div&gt; &lt;div style="margin: 0px 1px; padding-top: 1px;    background-color: #c3d9ff; font-size: 1px !important;    line-height: 0px !important;"&gt;&amp;nbsp;&lt;/div&gt; &lt;div style="padding: 4px; background-color: #c3d9ff;"&gt;&lt;h3 style="margin:0px 3px;font-family:sans-serif"&gt;Sent to you by jeffye via Google Reader:&lt;/h3&gt;&lt;/div&gt; &lt;div style="margin: 0px 1px; padding-top: 1px;    background-color: #c3d9ff; font-size: 1px !important;    line-height: 0px !important;"&gt;&amp;nbsp;&lt;/div&gt; &lt;div style="margin: 0px 2px; padding-top: 1px;    background-color: #c3d9ff; font-size: 1px !important;    line-height: 0px !important;"&gt;&amp;nbsp;&lt;/div&gt; &lt;div style="font-family:sans-serif;overflow:auto;width:100%;margin: 0px 10px"&gt;&lt;h2 style="margin: 0.25em 0 0 0"&gt;&lt;div class=""&gt;&lt;a href="http://feedproxy.google.com/~r/DevilsHaircut/~3/2PIMzjui4uY/"&gt;Doug Bowman&amp;#31163;&amp;#32844;&amp;#28608;&amp;#36215;&amp;#21315;&amp;#23618;&amp;#28010;&amp;#21834;&lt;/a&gt;&lt;/div&gt;&lt;/h2&gt; &lt;div style="margin-bottom: 0.5em"&gt;via &lt;a href="http://www.devilshaircut.net/blog" class="f"&gt;Devil&amp;#39;s Haircut&lt;/a&gt; by rg on 3/21/09&lt;/div&gt;&lt;br style="display:none"&gt; &lt;p&gt;&lt;img title="google-533" src="http://www.devilshaircut.net/blog/wp-content/uploads/2009/03/google-533.jpg" alt="google-533" width="384" height="209"&gt;&lt;/p&gt; &lt;p&gt;不知道有人关注这件事儿否，但是&lt;a href="http://stopdesign.com/about/bio"&gt;Doug Bowman&lt;/a&gt;上周辞去Google的Visual Design Lead，并在离职之后在自己Blog上面大发牢骚，引爆了各方面都开始唧唧歪歪。这篇题为《&lt;a href="http://stopdesign.com/archive/2009/03/20/goodbye-google.html"&gt;Goodbye Google&lt;/a&gt;》中间提到&lt;/p&gt; &lt;p&gt;&lt;em&gt;&amp;lt; 以下翻译中加入某些词旨在帮助原文加强语气，方便阅读&amp;gt;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;"When I joined Google as its first visual designer, the company was already seven years old. Seven years is a long time to run a company without a classically trained designer. Google had plenty of designers on staff then, but most of them had backgrounds in CS or HCI. And none of them were in high-up, respected leadership positions." （略译：遥想当年，老夫以视觉设计师身份加盟Google的时候，这家公司已经7岁了，都7岁了，老天爷，不敢相信这家公司竟然没有一个受过专业训练的设计师！Google倒是有不少挂设计师名牌的人，但是都是半路出家的学计算机或者人机交互背景的人，更搞笑的是，这些被称之为设计师的倒霉孩子中没有一个人是在有实权的领导位置！）&lt;/p&gt; &lt;p&gt;"When a company is filled with engineers, it turns to engineering to solve problems. Reduce each decision to a simple logic problem. Remove all subjectivity and just look at the data. Data in your favor? Ok, launch it. Data shows negative effects? Back to the drawing board. And that data eventually becomes a crutch for every decision, paralyzing the company and preventing it from making any daring design decisions." （略译：Google实际上完全是被工程师们占领了，最后导致只会用工程师的观点解决问题——把所有需要设计的复杂问题简化成一个逻辑问题——简化所有主观判断，只交给数据去说话。数据能说话就见活鬼了！数据能说明真正的问题么？但是这个思维却成了公司里一切决定的主宰，束缚起一切，所以完全没有办法做出有价值的设计！）&lt;/p&gt; &lt;p&gt;"Yes, it's true that a team at Google couldn't decide between two blues, so they're testing 41 shades between each blue to see which one performs better. I had a recent debate over whether a border should be 3, 4 or 5 pixels wide, and was asked to prove my case. I can't operate in an environment like that. I've grown tired of debating such minuscule design decisions. There are more exciting design problems in this world to tackle." （略译：是的，纽约时报报道的&lt;a href="http://www.nytimes.com/2009/03/01/business/01marissa.html?_r=1&amp;amp;pagewanted=1"&gt;那件事&lt;/a&gt;是真的，Google的team确有一次竟然没办法决定用两种蓝色中的哪个，所以他们做出来41种阴影效果然后看哪个蓝色更顺眼。还有一次，我们竟然争辩边框是用3，4，还是5像素，那伙计竟然让我证明我的选择是最佳，靠。我没办法在这样一个环境中呼吸，我完全厌倦了这种毫无意义的争论。这世界上还有更有价值的事儿等我干。）&lt;/p&gt; &lt;p&gt;知名Blogger &lt;a href="http://daringfireball.net/linked/2009/03/20/buzz-google-apple"&gt;John Gruber&lt;/a&gt;在自己Blog上转帖&lt;a href="http://log.scifihifi.com/post/88237020/yes-its-true-that-a-team-at-google-couldnt"&gt;Buzz Andersen&lt;/a&gt;对比Apple和Google团队组成及创新氛围的文章，并且总结说Google比起Apple更像是一个工程师团队点缀几个设计师（Apple相反）。CNET上有评论批评Doug不应该以设计师（如果不是艺术家）的思维去谴责Google以数据为中心的设计思想（Data-centrism)（&lt;a href="http://news.cnet.com/8301-17939_109-10201160-2.html"&gt;link&lt;/a&gt;），毕竟在设计师眼中美观的图片只大了0.01KB，对于Google这种千万用户千万G流量的互联网公司也是极大的变化（这点似乎与之前&lt;a href="http://www.devilshaircut.net/blog/2009/03/12/craigslist-interface-redesign/"&gt;对Craigslist界面好坏&lt;/a&gt;的争论差不多），并且还说Google这种把设计由用户拿鼠标决定本来就是设计的进步——个人观点，我同意前半句，Google本来就是数据中心的公司，并且设计师需要考虑你认为的"美观"成本到底是多少（如果Script Coder们也关心的话），但是我不同意把所谓把设计交给投票过程是refreshing或者进步，投票过程（或者一切以访问量，点击率，etc）就如Doug说的，并不能暴露真正问题并且选出真正合适的，不仅是因为用户不一定明确自己喜欢什么，更重要的是，问题就是我们能不能把一个涉及审美，效率，评估及其他含有非逻辑因素的决策这样简单交给投票过程（GW Bush是怎么被选出来的？）把设计过程转化成投票或者讨论的"民主"过程，最大的好处（在我看来）就是扩大接触面增大收集信息量，核心价值能帮助定义问题，让设计过程兼顾更多方面，如果搞的好了，大致能给出一个思路——比如什么是比较收到用户关注的，但是如果涉及How to，简单交给投票尤其是用户投票过程无异自杀，Google PR算法再先进也没办法拼过一个使用Google的真人，毕竟工具只是工具，数据只是数据。&lt;/p&gt; &lt;p&gt;我没有试图为同行辩护，因为就像在无数公司发生过的那样，对于Google而言Doug Bowman的离去可能只是少了一个自视清高不愿与人合作的UI设计师而已；同样，对Doug而言，扔掉Google Visual Design Lead的头衔，才能往自己世界更进一步，让你知道即使有亿万用户云集全世界最顶尖的工程师的工作环境，真正能改变的世界的人只是你自己——就像&lt;a href="http://www.youtube.com/watch?v=4oAB83Z1ydE&amp;amp;fmt=18"&gt;Apple说的那样&lt;/a&gt;。&lt;/p&gt; &lt;div&gt; &lt;a href="http://feeds2.feedburner.com/~ff/DevilsHaircut?a=2PIMzjui4uY:sxo6gZY-HDc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds2.feedburner.com/~ff/DevilsHaircut?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds2.feedburner.com/~ff/DevilsHaircut?a=2PIMzjui4uY:sxo6gZY-HDc:D7DqB2pKExk"&gt;&lt;img src="http://feeds2.feedburner.com/~ff/DevilsHaircut?i=2PIMzjui4uY:sxo6gZY-HDc:D7DqB2pKExk" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds2.feedburner.com/~ff/DevilsHaircut?a=2PIMzjui4uY:sxo6gZY-HDc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds2.feedburner.com/~ff/DevilsHaircut?i=2PIMzjui4uY:sxo6gZY-HDc:F7zBnMyn0Lo" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds2.feedburner.com/~ff/DevilsHaircut?a=2PIMzjui4uY:sxo6gZY-HDc:qj6IDK7rITs"&gt;&lt;img src="http://feeds2.feedburner.com/~ff/DevilsHaircut?d=qj6IDK7rITs" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds2.feedburner.com/~ff/DevilsHaircut?a=2PIMzjui4uY:sxo6gZY-HDc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds2.feedburner.com/~ff/DevilsHaircut?i=2PIMzjui4uY:sxo6gZY-HDc:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;/div&gt;&lt;img src="http://feeds2.feedburner.com/~r/DevilsHaircut/~4/2PIMzjui4uY" height="1" width="1"&gt;&lt;/div&gt; &lt;br&gt; &lt;div style="margin: 0px 2px; padding-top: 1px;    background-color: #c3d9ff; font-size: 1px !important;    line-height: 0px !important;"&gt;&amp;nbsp;&lt;/div&gt; &lt;div style="margin: 0px 1px; padding-top: 1px;    background-color: #c3d9ff; font-size: 1px !important;    line-height: 0px !important;"&gt;&amp;nbsp;&lt;/div&gt; &lt;div style="padding: 4px; background-color: #c3d9ff;"&gt;&lt;h3 style="margin:0px 3px;font-family:sans-serif"&gt;Things you can do from here:&lt;/h3&gt; &lt;ul style="font-family:sans-serif"&gt;&lt;li&gt;&lt;a href="http://www.google.com/reader/view/feed%2Fhttp%3A%2F%2Fwww.devilshaircut.net%2Fblog%2Ffeed%2F?source=email"&gt;Subscribe to Devil&amp;#39;s Haircut&lt;/a&gt; using &lt;b&gt;Google Reader&lt;/b&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.google.com/reader/?source=email"&gt;Get started using Google Reader&lt;/a&gt; to easily keep up with &lt;b&gt;all your favorite sites&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt; &lt;div style="margin: 0px 1px; padding-top: 1px;    background-color: #c3d9ff; font-size: 1px !important;    line-height: 0px !important;"&gt;&amp;nbsp;&lt;/div&gt; &lt;div style="margin: 0px 2px; padding-top: 1px;    background-color: #c3d9ff; font-size: 1px !important;    line-height: 0px !important;"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5906929445033990464-3539702761430571164?l=irlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5906929445033990464&amp;postID=3539702761430571164&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/3539702761430571164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/3539702761430571164'/><link rel='alternate' type='text/html' href='http://irlab.blogspot.com/2009/03/doug-bowman.html' title='Doug Bowman离职激起千层浪啊'/><author><name>xlqb</name><uri>http://www.blogger.com/profile/07757898792107625243</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5906929445033990464.post-4569937238670910622</id><published>2008-03-11T11:33:00.001+08:00</published><updated>2008-03-11T11:33:38.436+08:00</updated><title type='text'>经常要用到的英文短语</title><content type='html'>&lt;a href="http://kisshi.com/2008/03/06/often-use-the-phrase-to-the-english/" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)"&gt;经常要用到的英文短语 | 河蟹娱乐&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;h2&gt;&lt;a href="http://kisshi.com/2008/03/06/often-use-the-phrase-to-the-english/" title="经常要用到的英文短语" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)"&gt;经常要用到的英文短语&lt;/a&gt;&lt;/h2&gt;      		&lt;p&gt;  		    		&lt;em&gt;March 6th, 2008 at 10:46pm&lt;/em&gt;     		&lt;em&gt;&lt;a href="http://kisshi.com/author/admin/" title="Posts by 胡戈戈" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)"&gt;胡戈戈&lt;/a&gt;&lt;/em&gt;  		&lt;em&gt;80 Views&lt;/em&gt;     		    		&lt;/p&gt;   		&lt;p&gt;光明正大copy自非河蟹的火星网友&lt;a href="http://caitou.com/archives/everyday-expressions/" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)"&gt;大猫&lt;/a&gt;&lt;br&gt; whats your asl? 你的，年龄，性别，地点？ (聊天用的)&lt;br&gt; how are you doing (or: how you doiin) 你好。&lt;br&gt; whats up 什么事？ 或是： 你好&lt;br&gt; lol 大笑 = laugh out loud&lt;br&gt; so long 一般不用它。。。意思是：再见&lt;br&gt; what are you into?(what you into) 你对什么感兴趣？&lt;br&gt; Im into you. 我喜欢你&lt;br&gt; suck 恶心&lt;br&gt; f**k off 滚&lt;br&gt; idiot 傻蛋&lt;span&gt;&lt;/span&gt;&lt;br&gt; hip hop , rock, rap,pop, 说唱，摇滚，说唱，流行歌&lt;br&gt; bah bye 再见&lt;br&gt; hot ,sexy ，goat 色鬼&lt;br&gt; what are you up to(what you up to) 最近怎么样&lt;br&gt; shut up . shut the hell up , shut the f**k up. 闭嘴&lt;br&gt; cuss , abuse 骂人&lt;br&gt; cut the crap 别废话&lt;br&gt; beat the shit out of you 把你的屎打出来&lt;br&gt; bullshit. 胡说&lt;br&gt; sit back 别管闲事儿&lt;br&gt; feel shit about oneself 感觉不爽&lt;br&gt; be good 听话&lt;br&gt; sorry ass 可怜的人，，，贬义词&lt;br&gt; shitty day 倒霉的一天。&lt;br&gt; oh yeah? 表示怀疑。。。。是么？&lt;br&gt; pic 照片&lt;br&gt; give it a shot. give it a go. 试一是&lt;br&gt; try me. 你试试。（A: I&amp;#39;ll kill you B: try me) A：我杀了你。B：你试试.&lt;br&gt; do her. 上她。&lt;br&gt; be quiet 安静&lt;br&gt; what the f**k ,what the hell , what the hack, (wtf ) 真他XX的!&lt;br&gt; cute 可爱(美国人不长说&amp;quot;帅(handsome)&amp;quot; 用CUTE代替）可以说 a handsome car.&lt;br&gt; what do you look like (what you look like)你长什么样&lt;br&gt; how tall are you(how tall are ya)你多高&lt;br&gt; so what 那又怎样？？那又如何？？&lt;br&gt; retard 听起来象烟鬼的人&lt;br&gt; d*amnit 他XX的&lt;br&gt; god d*amnit 他XX的&lt;br&gt; d*amn 妈的，倒霉！&lt;br&gt; suck 恶心（动词） you suck! 你恶心！&lt;br&gt; kick ass 不好惹的。&lt;br&gt; kick your ass 揍你。踢你的屁股。&lt;br&gt; a tough man 难对付的人&lt;br&gt; funny shit 有趣的东西&lt;br&gt; funny 有趣的&lt;br&gt; a piece of shit 一抛屎，&lt;br&gt; whole bunch of 一大群。一大堆&lt;br&gt; a bunch of 一群 一堆&lt;br&gt; kiss my ass 表示看不起你&lt;br&gt; be pissed off 被惹恼 I&amp;#39;ve been pissed.(I&amp;#39;ve been pissed off) 我被若恼了。&lt;br&gt; piss off 滚！&lt;br&gt; dont know what you are talking about 不知道你在说什么&lt;br&gt; dont know what you were saying. 不知道你说了点什么&lt;br&gt; dont get it 不明白&lt;br&gt; get it? 明白了吗？&lt;br&gt; got it! 明白了！&lt;br&gt; dont bother 别去麻烦！&lt;br&gt; you know what Im saying? 明白我说的吗？&lt;br&gt; mad dog 疯狗。一般指人&lt;br&gt; are you mad? 你生气拉？&lt;br&gt; im mad 我生气拉！&lt;br&gt; im pretty mad at you 你真让我生气！&lt;br&gt; mad at= angry with&lt;br&gt; pain in the ass 着急&lt;br&gt; pain in the ass about sth STH让我很急&lt;br&gt; Im scared 我怕拉&lt;br&gt; you are scared 你怕拉&lt;br&gt; back off 让开！&lt;br&gt; right on = right 对！&lt;br&gt; exactly 非常对！正是！&lt;br&gt; gotcha! = got you 抓住你拉！难住你拉！&lt;br&gt; I read your mind 我就知道你要说什么&lt;br&gt; I knew it 我料到拉！我就知道！&lt;br&gt; gotta go 我得走拉！&lt;br&gt; you know what? 你知道吗？(you know what? he killed her!) 你知道吗？他杀了她！&lt;br&gt; guess what 猜怎么了？&lt;br&gt; tell you what 。。。 我给你说啊。。。。&lt;br&gt; its not working! 不管用呀！&lt;br&gt; that works 那样可以&lt;br&gt; I rule! 有点象im cool 我牛！ 你牛是（you are cool)&lt;br&gt; kind of (kinda) sort of (sorta) 有点儿！&lt;br&gt; get me wrong 你冤枉了我！&lt;br&gt; who knows , god knows 谁知道呢！&lt;br&gt; did I make myself clear? 我是否使你明白拉？&lt;br&gt; did I make myself crystal clear? 比上边的口气重&lt;br&gt; get on it! 去做。。。把&lt;br&gt; Im just playing!=just kidding 开玩笑的&lt;br&gt; no offence(no offense) 别生气 ，（用于事先紧告）&lt;br&gt; juses 天呀！&lt;br&gt; geeze 天呀！&lt;br&gt; gosh = god 上帝呀！我的天呀！！！&lt;br&gt; I dont give a shit! 我不在乎&lt;br&gt; i dont give a f**k! 我不在乎&lt;br&gt; smart 聪明。不用clever&lt;br&gt; got disconnected 掉线拉！&lt;br&gt; got kicked 被踢拉！&lt;br&gt; got power outage 停电拉！&lt;br&gt; awesome 另人竟为的&lt;br&gt; take drug = do drug 吸毒&lt;br&gt; do weed = smoke 吸烟。&lt;br&gt; get high 过瘾的感觉&lt;br&gt; f**k that! = f**k that shit 去他的吧！&lt;br&gt; jack off 手淫&lt;br&gt; do you do weed? = do you smoke 吸烟吗？&lt;br&gt; dont be so sure about yourself 别太自信！&lt;br&gt; dont be so sure about that 别太肯定&lt;br&gt; homo 同性恋的&lt;br&gt; mind your own business 别管闲事&lt;br&gt; none of your business 没你的事；别管闲事&lt;br&gt; thats a little stronge 有点重了。（a: f**k you bitch! b:thats a little stronge I think) a:我XXXX婊子！b:骂的有点重了吧）&lt;br&gt; hell yeah! 可不是！太对拉！&lt;br&gt; I do whatever I like 我干我想干的&lt;br&gt; zip it 闭嘴&lt;br&gt; you wanna fight? 想吵架？&lt;br&gt; you wanna row about that? 想吵架？&lt;br&gt; you are so mean 你太没意思拉&lt;br&gt; dont be mean about that 别太没意思了啊&lt;br&gt; go ahead 可以&lt;br&gt; cell phone 手机&lt;br&gt; gal = girl&lt;br&gt; guy = boy&lt;br&gt; pee 尿尿&lt;br&gt; toilet 马桶&lt;br&gt; laptop 笔记本电脑&lt;br&gt; oops 哎幼&lt;br&gt; whats your connection 问你是用56K上网还是用宽带&lt;br&gt; hows your day 今天怎么样？&lt;br&gt; whore 妓女&lt;br&gt; hookshop 妓院&lt;br&gt; fine 好。有时表示不满。 你可以！&lt;br&gt; cause ,because, cuz 因为&lt;br&gt; Im done 我完拉！ 或。作某事做完拉&lt;br&gt; I made it.I did it 我成功拉&lt;br&gt; dont fool me 别耍我&lt;br&gt; dont lie to me 别给我说谎&lt;br&gt; crap up 废话（im craping up)我在废话&lt;br&gt; my treat 我请客&lt;br&gt; I cant believe it 不感相信&lt;br&gt; hold on 等会儿&lt;br&gt; brb , be right back 马上回来&lt;br&gt; Im crazy about her 她使我疯狂。表示你喜欢她。&lt;br&gt; she makes me sick 她使我恶心&lt;br&gt; native american 纯美国人&lt;br&gt; what about it 。。。。怎么样？(a:I&amp;#39;ve got a new CD.b:what about it?)A： 我又弄拉一盘CD 。B：那CD怎么样？&lt;br&gt; huh 有点象（是吧） so you &amp;#39;ve got a new CD huh? 你买了一盘CD 是吧！&lt;br&gt; huh??? 什么？（单独用的）&lt;br&gt; kiddie 小孩儿&lt;br&gt; doggie style 象狗一样的方式。&lt;br&gt; son 小孩儿&lt;br&gt; sonny 小孩儿&lt;br&gt; loser 笨蛋&lt;br&gt; incompetent loser 无能的笨蛋&lt;br&gt; okie dokie , oky doky = ok&lt;br&gt; punk 废物&lt;br&gt; that isnt funny 不可笑， 不怪&lt;br&gt; dont get funny with me 别无理&lt;br&gt; where are you located? 你在哪？&lt;br&gt; where is china situated? 中国在那？&lt;br&gt; stupid 笨蛋&lt;br&gt; a stream of cuss 一顿骂&lt;br&gt; dont get smart with me 别耍花样&lt;br&gt; dont f**k with me 别他吗的捣乱&lt;br&gt; suck up to somebody 拍马屁&lt;br&gt; darn d*amn 的婉转行试&lt;br&gt; what does that mean? 什么意思？&lt;br&gt; whats your problem? 你怎么了你？（用于指责）&lt;br&gt; come on 快，来嘛~~，别那样了，&lt;br&gt; come on man 来呗！&lt;br&gt; lmaf , laugh my ass off 非常可笑&lt;br&gt; ridiculous 可笑的（贬义词）&lt;br&gt; go to bed! 滚开！&lt;br&gt; dumbass 笨蛋&lt;br&gt; stick my foot right up your ass 踢你的屁股，揍你。&lt;br&gt; why did you put on this nickname? (why you put on this namenick?) 为什么用这个名字呢？（不是指你的真名，是聊天时的 user name)&lt;br&gt; jackass 蠢货&lt;br&gt; hold the(your) breath 等等（是让你先闭嘴的意思）&lt;br&gt; pants 裤子&lt;br&gt; mall 超市 = supermarket&lt;br&gt; an awesome big promise 很大的诺言&lt;br&gt; thats your problem 那时你的事，是你自己的问题&lt;br&gt; how in the world can he do it to me 他怎么能这样对我呢！&lt;br&gt; so so 一般&lt;br&gt; Im too little = Im too young 我太小拉&lt;br&gt; f**k up …被搞杂拉,不管用拉，…不好看(my computer is f**ked up) 我的电脑坏拉，不运行拉。you&amp;#39;ve got a f**ked up ass.你的屁股不好看。f**k you up 让你吃不消&lt;br&gt; get a flat tyre 车轮跑气&lt;br&gt; bite me 狠我把。（用得意的语气）&lt;br&gt; weird 怪的&lt;br&gt; just chilling(just chillin&amp;#39;) 休息 （用于回答或解释）&lt;br&gt; pimp 恶棍。&lt;br&gt; the other day 前几天&lt;br&gt; can you handle this? 你行吗？&lt;br&gt; get into such a mess 这么不幸（指遇到了困难的事）&lt;br&gt; such a dick 混蛋&lt;br&gt; show 节目&lt;br&gt; are you going to the movies? 你打算去看电影吗？&lt;br&gt; album 专集&lt;br&gt; evil 特别坏的。evil man 坏人&lt;br&gt; you dont have to say nothing 不需要说什么&lt;br&gt; you aint nothing 你什么也不是&lt;br&gt; aint = arent&lt;br&gt; he runs a candy store 他开了一个糖果店&lt;br&gt; candy 糖。。。不要用sweet&lt;br&gt; badass 坏蛋&lt;br&gt; you are sweet 你真好&lt;br&gt; you are such a sweetie 你真是个甜心儿&lt;br&gt; do me a favour 帮帮忙&lt;br&gt; I&amp;#39;ve got a favour for you to do 要你帮个忙&lt;br&gt; boot you off 把你踢出聊天室&lt;br&gt; chatroom 聊天室 ，不是chatting room啊&lt;br&gt; booter 踢人者&lt;br&gt; Im a badass 我是个坏人&lt;br&gt; get beat up 挨了一顿打，被打了&lt;br&gt; hang out 出外玩儿&lt;br&gt; hang out with 与…出去玩&lt;br&gt; its up to you 看你了&lt;br&gt; it depends 那要看看了。&lt;br&gt; son of a bitch 婊子养的&lt;br&gt; I have no clue,I dont know,I have no Idea 不知道&lt;br&gt; 注意回答别人的 thanks 时用No Problem.或welcome, you are welcome. （你替我揍了x一顿，然后我说thanks,你答No problem.）（我借了你钱，你说thanks,我说welcome.) 出了力后回答谢谢用no problem.&lt;br&gt; do I know you? = do I have the pleasure of knowing you? 我认识你吗？&lt;br&gt; you have a nice attitude huh 你架子摆的不错呀&lt;br&gt; watch your language! 注意你的语言！&lt;br&gt; watch it! 注意！&lt;br&gt; look! = hey 嘿！&lt;br&gt; that makes me feel sleepy 那东西让我想睡觉。&lt;br&gt; black folks =nigger 黑人 ,用black people 也行&lt;br&gt; white folks 白人 , 用white people 也行&lt;br&gt; 黄种人不能说 yellow folks 说 chinese就可以拉&lt;br&gt; gotta go do something 要去干某事拉&lt;br&gt; that is my fine girl 那是我漂亮的女友&lt;br&gt; she is fine. 她很好看&lt;br&gt; cant take it 招架不住，受不了&lt;br&gt; freak =weird 怪的。&lt;br&gt; freaky boy 怪男孩&lt;br&gt; pop up 突然弹出的东西，网夜等自动弹出的动作,或指弹出的网叶&lt;br&gt; hook up hook up the mic 插上麦克风 hook up some tickets for somebody 给….免费准备一些票.&lt;br&gt; computer freak 非常喜欢电脑得人，精通电脑得人&lt;br&gt; dumbass = stupid&lt;br&gt; sorry ass 可怜人&lt;br&gt; shoot 说吧&lt;br&gt; she&amp;#39;s real cute 她真的很可爱，，与really cute 不一样&lt;br&gt; dont be like a kid 别向小孩一样&lt;br&gt; grow up 别向小孩一样&lt;br&gt; PM 下午 从中午12到晚上12&lt;br&gt; AM 上午 从午夜12点到中午12&lt;br&gt; be off 走开&lt;br&gt; be quick 快！&lt;br&gt; hurry 快！&lt;br&gt; hurry up 快！&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5906929445033990464-4569937238670910622?l=irlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5906929445033990464&amp;postID=4569937238670910622&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/4569937238670910622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/4569937238670910622'/><link rel='alternate' type='text/html' href='http://irlab.blogspot.com/2008/03/blog-post.html' title='经常要用到的英文短语'/><author><name>xlqb</name><uri>http://www.blogger.com/profile/07757898792107625243</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5906929445033990464.post-940691098164904324</id><published>2008-02-25T14:21:00.001+08:00</published><updated>2008-02-25T14:21:30.878+08:00</updated><title type='text'>气量狭小是缺点么？</title><content type='html'>&lt;br&gt;&lt;br&gt;  &lt;div style="margin: 0px 2px; padding-top: 1px;    background-color: #c3d9ff; font-size: 1px !important;    line-height: 0px !important;"&gt;&amp;nbsp;&lt;/div&gt;  &lt;div style="margin: 0px 1px; padding-top: 1px;    background-color: #c3d9ff; font-size: 1px !important;    line-height: 0px !important;"&gt;&amp;nbsp;&lt;/div&gt;  &lt;div style="padding: 4px; background-color: #c3d9ff;"&gt;&lt;h3 style="margin:0px 3px;font-family:sans-serif"&gt;Jeff 通过 Google 阅读器发送给您的内容：&lt;/h3&gt;&lt;/div&gt;  &lt;div style="margin: 0px 1px; padding-top: 1px;    background-color: #c3d9ff; font-size: 1px !important;    line-height: 0px !important;"&gt;&amp;nbsp;&lt;/div&gt;  &lt;div style="margin: 0px 2px; padding-top: 1px;    background-color: #c3d9ff; font-size: 1px !important;    line-height: 0px !important;"&gt;&amp;nbsp;&lt;/div&gt;  &lt;div style="font-family:sans-serif;overflow:auto;width:100%;margin: 0px 10px"&gt;&lt;h2 style="margin: 0.25em 0 0 0"&gt;&lt;div class=""&gt;&lt;a href="http://blog.sina.com.cn/s/blog_54ad5120010089nw.html"&gt;气量狭小是缺点么？&lt;/a&gt;&lt;/div&gt;&lt;/h2&gt;  &lt;div style="margin-bottom: 0.5em"&gt;于 08-2-11 通过 &lt;a href="http://blog.sina.com.cn/walt7799" class="f"&gt;左右脑——瓦教授的博客&lt;/a&gt; 作者：瓦尔特7799&lt;/div&gt;&lt;br style="display:none"&gt;  &lt;div&gt;  &lt;p&gt;  提起气量狭小，大家可能都会想到三国演义里面的周瑜。周都督见不得孔明比自己强，屡屡设下绊子，甚至必欲除之而后快。在三国演义里面，周都督的气量狭小，是作为一个缺点来写的。我们今天就来探讨一下，气量狭小究竟是不是缺点？&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;  我们这个社会，还没有达到资源极大富裕，还有很多资源要靠竞争取得。要竞争总要有规则，在规则许可的范围内，谁都想自己的资源最大化。那些纯粹凭竞争实力没有把握一定拿到自己所需资源的人，一定会想尽办法防止竞争对手染指自己想要取得的资源。这是天经地义的。小说中的诸葛亮之所以显得不那么气量狭小，那是因为他有足够的本事拿到想要的资源。设想一下，本事不如诸葛亮的周瑜要是也和诸葛亮一样充大个儿的，处处给诸葛亮以方便，那还争个什么劲儿，死的肯定会很惨，还不如整个把东吴送给诸葛亮算了。&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;  所以，世界上没有平白无故的大方、大气和大度。有些人之所以看起来大方、大气和大度，如果他们不是傻子，那一定是因为他们有别人无法轻易与之匹敌的本事，或曰竞争力。这竞争力并不一定是针尖对麦芒那么死掐，有的时候是一种宏观和大局意识，在令对手不知不觉的亲切友好气氛中，你就取得了领先的势；在对手忙于收获你所放弃的蝇头小利的时候，你已经转身控制了更重要的资源和更有价值的实地。所以，大方、大气和大度，只是强者才有资格使用的奢侈品。假如你不够那么强，还是老老实实地"气量狭小"来得更为实在。相对于不同的竞争力水平，当事人应该选择不同的利益取向和竞争策略。"气量狭小"&lt;/p&gt;  &lt;/div&gt;&lt;/div&gt;  &lt;br&gt;  &lt;div style="margin: 0px 2px; padding-top: 1px;    background-color: #c3d9ff; font-size: 1px !important;    line-height: 0px !important;"&gt;&amp;nbsp;&lt;/div&gt;  &lt;div style="margin: 0px 1px; padding-top: 1px;    background-color: #c3d9ff; font-size: 1px !important;    line-height: 0px !important;"&gt;&amp;nbsp;&lt;/div&gt;  &lt;div style="padding: 4px; background-color: #c3d9ff;"&gt;&lt;h3 style="margin:0px 3px;font-family:sans-serif"&gt;可从此处完成的操作：&lt;/h3&gt;  &lt;ul style="font-family:sans-serif"&gt;&lt;li&gt;使用 &lt;b&gt;Google 阅读器&lt;/b&gt;&lt;a href="http://www.google.com/reader/view/feed%2Fhttp%3A%2F%2Fblog.sina.com.cn%2Frss%2Fwalt7799.xml?source=email"&gt;订阅左右脑——瓦教授的博客&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;&lt;a href="http://www.google.com/reader/?source=email"&gt;开始使用 Google 阅读器&lt;/a&gt;，轻松地与&lt;b&gt;您喜爱的所有网站&lt;/b&gt;保持同步更新&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;  &lt;div style="margin: 0px 1px; padding-top: 1px;    background-color: #c3d9ff; font-size: 1px !important;    line-height: 0px !important;"&gt;&amp;nbsp;&lt;/div&gt;  &lt;div style="margin: 0px 2px; padding-top: 1px;    background-color: #c3d9ff; font-size: 1px !important;    line-height: 0px !important;"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5906929445033990464-940691098164904324?l=irlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5906929445033990464&amp;postID=940691098164904324&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/940691098164904324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/940691098164904324'/><link rel='alternate' type='text/html' href='http://irlab.blogspot.com/2008/02/blog-post_25.html' title='气量狭小是缺点么？'/><author><name>xlqb</name><uri>http://www.blogger.com/profile/07757898792107625243</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5906929445033990464.post-7524139120959705985</id><published>2008-02-25T14:13:00.001+08:00</published><updated>2008-02-25T14:13:26.752+08:00</updated><title type='text'>实用美国虚拟主机提供商介绍一览</title><content type='html'>&lt;br&gt;&lt;br&gt;  &lt;div style="margin: 0px 2px; padding-top: 1px;    background-color: #c3d9ff; font-size: 1px !important;    line-height: 0px !important;"&gt;&amp;nbsp;&lt;/div&gt;  &lt;div style="margin: 0px 1px; padding-top: 1px;    background-color: #c3d9ff; font-size: 1px !important;    line-height: 0px !important;"&gt;&amp;nbsp;&lt;/div&gt;  &lt;div style="padding: 4px; background-color: #c3d9ff;"&gt;&lt;h3 style="margin:0px 3px;font-family:sans-serif"&gt;Jeff 通过 Google 阅读器发送给您的内容：&lt;/h3&gt;&lt;/div&gt;  &lt;div style="margin: 0px 1px; padding-top: 1px;    background-color: #c3d9ff; font-size: 1px !important;    line-height: 0px !important;"&gt;&amp;nbsp;&lt;/div&gt;  &lt;div style="margin: 0px 2px; padding-top: 1px;    background-color: #c3d9ff; font-size: 1px !important;    line-height: 0px !important;"&gt;&amp;nbsp;&lt;/div&gt;  &lt;div style="font-family:sans-serif;overflow:auto;width:100%;margin: 0px 10px"&gt;&lt;h2 style="margin: 0.25em 0 0 0"&gt;&lt;div class=""&gt;&lt;a href="http://blog.minidx.com/2008/02/23/506.html"&gt;实用美国虚拟主机提供商介绍一览&lt;/a&gt;&lt;/div&gt;&lt;/h2&gt;  &lt;div style="margin-bottom: 0.5em"&gt;于 08-2-22 通过 &lt;a href="http://blog.minidx.com" class="f"&gt;全文检索博客&lt;/a&gt; 作者：Minidxer&lt;/div&gt;&lt;br style="display:none"&gt;  &lt;p&gt;前面介绍了比较多的很实惠的美国虚拟主机提供商以及各相关的优惠码等系列文章，这里做一个列表，方便阅读。&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blog.minidx.com/wp-content/themes/i3theme-1-5-right/images/mini-blogroll.gif"&gt; &lt;a href="http://blog.minidx.com/2007/11/07/67.html"&gt;GoDaddy域名注册、空间购买的优惠码(coupon)&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;img src="http://blog.minidx.com/wp-content/themes/i3theme-1-5-right/images/mini-blogroll.gif"&gt;&lt;a href="http://blog.minidx.com/2007/11/21/120.html"&gt;欧洲最大的互联网服务商1AND1(1&amp;amp;1)的介绍&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blog.minidx.com/wp-content/themes/i3theme-1-5-right/images/mini-blogroll.gif"&gt;&lt;a href="http://blog.minidx.com/2007/12/26/309.html"&gt;超级便宜的国外虚拟主机ucvhost–1美元/月&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blog.minidx.com/wp-content/themes/i3theme-1-5-right/images/mini-blogroll.gif"&gt;&lt;a href="http://blog.minidx.com/2008/02/04/473.html"&gt;HostGator的简单介绍以及部分优惠码（Hostgator Coupon Code）&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blog.minidx.com/wp-content/themes/i3theme-1-5-right/images/mini-blogroll.gif"&gt;&lt;a href="http://blog.minidx.com/2008/02/05/474.html"&gt;Lunarpages的一点介绍以及购买其虚拟主机的优惠码(coupon code)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blog.minidx.com/wp-content/themes/i3theme-1-5-right/images/mini-blogroll.gif"&gt;&lt;a href="http://blog.minidx.com/2008/02/05/475.html"&gt;超级便宜的美国虚拟主机商Techhosting的介绍以及优惠码(coupon code)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blog.minidx.com/wp-content/themes/i3theme-1-5-right/images/mini-blogroll.gif"&gt;&lt;a href="http://blog.minidx.com/2008/02/06/481.html"&gt;美国主机服务商vistapages的介绍以及优惠码(coupon code)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blog.minidx.com/wp-content/themes/i3theme-1-5-right/images/mini-blogroll.gif"&gt;&lt;a href="http://blog.minidx.com/2008/02/08/487.html"&gt;webhostingbuzz虚拟主机商的介绍以及优惠码(Coupon Code)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blog.minidx.com/wp-content/themes/i3theme-1-5-right/images/mini-blogroll.gif"&gt;&lt;a href="http://blog.minidx.com/2008/02/09/491.html"&gt;美国虚拟主机商ixwebhosting相关介绍(该公司不提供优惠码Coupon Code)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blog.minidx.com/wp-content/themes/i3theme-1-5-right/images/mini-blogroll.gif"&gt;&lt;a href="http://blog.minidx.com/2008/02/10/494.html"&gt;美国虚拟主机提供商DreamHost的介绍以及相关优惠码(Coupon Code)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blog.minidx.com/wp-content/themes/i3theme-1-5-right/images/mini-blogroll.gif"&gt;&lt;a href="http://blog.minidx.com/2008/02/13/496.html"&gt;美国老牌虚拟主机提供商iPowerweb的一点介绍&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blog.minidx.com/wp-content/themes/i3theme-1-5-right/images/mini-blogroll.gif"&gt;&lt;a href="http://blog.minidx.com/2008/02/17/501.html"&gt;便宜好用的博客专用主机–蓝色印痕计划(Blue Print Plan)介绍&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blog.minidx.com/wp-content/themes/i3theme-1-5-right/images/mini-blogroll.gif"&gt;&lt;a href="http://blog.minidx.com/2008/02/07/484.html"&gt;jamroll.net提供350MB空间/5GB流量/PHP/MYSQL/FTP/CP绑定顶级域名免费空间&lt;/a&gt;&lt;/p&gt;  &lt;div style="background:#EDEDED none repeat scroll 0%;border:1px solid #990033;line-height:40px;text-align:center"&gt;Permalink:&lt;a href="http://blog.minidx.com/2008/02/23/506.html"&gt;http://blog.minidx.com/2008/02/23/506.html&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h3&gt;Related Post&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.minidx.com/2008/02/10/494.html" title="美国虚拟主机提供商DreamHost的介绍以及相关优惠码(Coupon Code)"&gt;美国虚拟主机提供商DreamHost的介绍以及相关优惠码(Coupon Code)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.minidx.com/2008/02/13/496.html" title="美国老牌虚拟主机提供商iPowerweb的一点介绍"&gt;美国老牌虚拟主机提供商iPowerweb的一点介绍&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.minidx.com/2008/02/09/491.html" title="美国虚拟主机商ixwebhosting相关介绍(该公司不提供优惠码Coupon Code)"&gt;美国虚拟主机商ixwebhosting相关介绍(该公司不提供优惠码Coupon Code)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.minidx.com/2008/02/17/501.html" title="便宜好用的博客专用主机–蓝色印痕计划(Blue Print Plan)介绍"&gt;便宜好用的博客专用主机–蓝色印痕计划(Blue Print Plan)介绍&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.minidx.com/2008/02/08/487.html" title="webhostingbuzz虚拟主机商的介绍以及优惠码(Coupon Code)"&gt;webhostingbuzz虚拟主机商的介绍以及优惠码(Coupon Code)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.minidx.com/2008/02/07/484.html" title="jamroll.net提供350MB空间/5GB流量/PHP/MYSQL/FTP/CP绑定顶级域名免费空间"&gt;jamroll.net提供350MB空间/5GB流量/PHP/MYSQL/FTP/CP绑定顶级域名免费空间&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.minidx.com/2008/02/05/475.html" title="超级便宜的美国虚拟主机商Techhosting的介绍以及优惠码(coupon code)"&gt;超级便宜的美国虚拟主机商Techhosting的介绍以及优惠码(coupon code)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.minidx.com/2008/02/05/474.html" title="Lunarpages的一点介绍以及购买其虚拟主机的优惠码(coupon code)"&gt;Lunarpages的一点介绍以及购买其虚拟主机的优惠码(coupon code)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.minidx.com/2008/02/04/473.html" title="HostGator的简单介绍以及部分优惠码（Hostgator Coupon Code）"&gt;HostGator的简单介绍以及部分优惠码（Hostgator Coupon Code）&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.minidx.com/2008/01/13/422.html" title="买了Ntt.cc域名，升级了空间后就遇到Godaddy维护"&gt;买了Ntt.cc域名，升级了空间后就遇到Godaddy维护&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.minidx.com/2007/12/28/312.html" title="blogsvertise.com的申请以及付费评论使用的一些总结"&gt;blogsvertise.com的申请以及付费评论使用的一些总结&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.minidx.com/2007/12/26/309.html" title="超级便宜的国外虚拟主机ucvhost–1美元/月"&gt;超级便宜的国外虚拟主机ucvhost–1美元/月&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.minidx.com/2007/11/23/126.html" title="支付了购买虚拟主机和独立IP的一年费用"&gt;支付了购买虚拟主机和独立IP的一年费用&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.minidx.com/2007/11/21/120.html" title="欧洲最大的互联网服务商1AND1(1&amp;amp;1)的介绍"&gt;欧洲最大的互联网服务商1AND1(1&amp;amp;1)的介绍&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.minidx.com/2007/11/17/95.html" title="Godaddy虚拟主机对Zend Optimizer和GD Library的支持情况"&gt;Godaddy虚拟主机对Zend Optimizer和GD Library的支持情况&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.minidx.com/2007/11/10/74.html" title="最近浪费了不少时间"&gt;最近浪费了不少时间&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.minidx.com/2007/11/07/67.html" title="GoDaddy域名注册、空间购买的优惠码(coupon)"&gt;GoDaddy域名注册、空间购买的优惠码(coupon)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.minidx.com/2007/11/05/54.html" title="停止了对Minidx.cn的解析"&gt;停止了对Minidx.cn的解析&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.minidx.com/2007/11/05/53.html" title="godaddy的SSL证书和独立IP，该选哪一个比较好？"&gt;godaddy的SSL证书和独立IP，该选哪一个比较好？&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;  &lt;br&gt;  &lt;div style="margin: 0px 2px; padding-top: 1px;    background-color: #c3d9ff; font-size: 1px !important;    line-height: 0px !important;"&gt;&amp;nbsp;&lt;/div&gt;  &lt;div style="margin: 0px 1px; padding-top: 1px;    background-color: #c3d9ff; font-size: 1px !important;    line-height: 0px !important;"&gt;&amp;nbsp;&lt;/div&gt;  &lt;div style="padding: 4px; background-color: #c3d9ff;"&gt;&lt;h3 style="margin:0px 3px;font-family:sans-serif"&gt;可从此处完成的操作：&lt;/h3&gt;  &lt;ul style="font-family:sans-serif"&gt;&lt;li&gt;使用 &lt;b&gt;Google 阅读器&lt;/b&gt;&lt;a href="http://www.google.com/reader/view/feed%2Fhttp%3A%2F%2Fblog.minidx.com%2Ffeed?source=email"&gt;订阅全文检索博客&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;&lt;a href="http://www.google.com/reader/?source=email"&gt;开始使用 Google 阅读器&lt;/a&gt;，轻松地与&lt;b&gt;您喜爱的所有网站&lt;/b&gt;保持同步更新&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;  &lt;div style="margin: 0px 1px; padding-top: 1px;    background-color: #c3d9ff; font-size: 1px !important;    line-height: 0px !important;"&gt;&amp;nbsp;&lt;/div&gt;  &lt;div style="margin: 0px 2px; padding-top: 1px;    background-color: #c3d9ff; font-size: 1px !important;    line-height: 0px !important;"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5906929445033990464-7524139120959705985?l=irlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5906929445033990464&amp;postID=7524139120959705985&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/7524139120959705985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/7524139120959705985'/><link rel='alternate' type='text/html' href='http://irlab.blogspot.com/2008/02/blog-post.html' title='实用美国虚拟主机提供商介绍一览'/><author><name>xlqb</name><uri>http://www.blogger.com/profile/07757898792107625243</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5906929445033990464.post-5121958671410680100</id><published>2008-02-15T13:58:00.001+08:00</published><updated>2008-02-15T13:58:17.819+08:00</updated><title type='text'>荷塘月色 : 介绍两种国内访问Blogger.com的方式</title><content type='html'>&lt;a href="http://blog.tanggaowei.com/2006/07/bloggercom.html"&gt;荷塘月色 : 介绍两种国内访问Blogger.com的方式&lt;/a&gt;: "国内无法访问Blogspot.com，这一直困扰着许多Blogger.com 爱好者们。最近，我也加入了Blogger.com爱好者的队伍。因为，我发现了两个可以方便访问 Blogger.com空间的方法：
一、通过第三方网站提供的免费域名
以http://blogname.blogspot.com/为例：
(1)www.pkblogs.com
http://www.pkblogs.com/ blogname/
相关链接：http://www.pkblogs.com/
(2)nyud.net:8089
http://blogname.blogspot.com.nyud.net:8090/
相关文章：让正常访问blogspot变成现实"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5906929445033990464-5121958671410680100?l=irlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://blog.tanggaowei.com/2006/07/bloggercom.html' title='荷塘月色 : 介绍两种国内访问Blogger.com的方式'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5906929445033990464&amp;postID=5121958671410680100&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/5121958671410680100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/5121958671410680100'/><link rel='alternate' type='text/html' href='http://irlab.blogspot.com/2008/02/bloggercom_15.html' title='荷塘月色 : 介绍两种国内访问Blogger.com的方式'/><author><name>xlqb</name><uri>http://www.blogger.com/profile/07757898792107625243</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5906929445033990464.post-5064186291674033819</id><published>2008-02-15T13:58:00.000+08:00</published><updated>2008-02-15T13:58:09.936+08:00</updated><title type='text'>荷塘月色 : 介绍两种国内访问Blogger.com的方式</title><content type='html'>&lt;a href="http://blog.tanggaowei.com/2006/07/bloggercom.html"&gt;荷塘月色 : 介绍两种国内访问Blogger.com的方式&lt;/a&gt;: "国内无法访问Blogspot.com，这一直困扰着许多Blogger.com 爱好者们。最近，我也加入了Blogger.com爱好者的队伍。因为，我发现了两个可以方便访问 Blogger.com空间的方法：
一、通过第三方网站提供的免费域名
以http://blogname.blogspot.com/为例：
(1)www.pkblogs.com
http://www.pkblogs.com/ blogname/
相关链接：http://www.pkblogs.com/
(2)nyud.net:8089
http://blogname.blogspot.com.nyud.net:8090/
相关文章：让正常访问blogspot变成现实"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5906929445033990464-5064186291674033819?l=irlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://blog.tanggaowei.com/2006/07/bloggercom.html' title='荷塘月色 : 介绍两种国内访问Blogger.com的方式'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5906929445033990464&amp;postID=5064186291674033819&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/5064186291674033819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/5064186291674033819'/><link rel='alternate' type='text/html' href='http://irlab.blogspot.com/2008/02/bloggercom.html' title='荷塘月色 : 介绍两种国内访问Blogger.com的方式'/><author><name>xlqb</name><uri>http://www.blogger.com/profile/07757898792107625243</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5906929445033990464.post-6902246460791717236</id><published>2008-02-15T00:03:00.000+08:00</published><updated>2008-02-15T00:03:50.050+08:00</updated><title type='text'>我的Wordpress模板修改 | 某瓜的瓜棚</title><content type='html'>&lt;a href="http://mougua.yo2.cn/2007/05/02/%e6%88%91%e7%9a%84wordpress%e6%a8%a1%e6%9d%bf%e4%bf%ae%e6%94%b9/"&gt;我的Wordpress模板修改 | 某瓜的瓜棚&lt;/a&gt;: "我的Wordpress模板修改
02
 
May
 Posted by 某瓜 as Wordpress
前几天才耍起Yo2的blog，发觉真的是那个爽啊，偶对oneoo和charles两位大大的敬仰之情就像滔滔江水延绵不断……（省略赞美之情n字）。
Wordpress确实是个强大易用的blog系统，丰富的模板更使它广受欢迎（废话）。但下载下来的模板经常有各种问题。下面就说说偶的（当然老鸟可以跳过…OTL）。
偶用的是thememe里面的Webby Blue 1.0模板，下载下来是一个rar压缩包，而Yo2只支持zip格式的模板上传，所以第一步需要把rar的压缩包压缩成zip。压缩�"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5906929445033990464-6902246460791717236?l=irlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://mougua.yo2.cn/2007/05/02/%e6%88%91%e7%9a%84wordpress%e6%a8%a1%e6%9d%bf%e4%bf%ae%e6%94%b9/' title='我的Wordpress模板修改 | 某瓜的瓜棚'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5906929445033990464&amp;postID=6902246460791717236&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/6902246460791717236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/6902246460791717236'/><link rel='alternate' type='text/html' href='http://irlab.blogspot.com/2008/02/wordpress.html' title='我的Wordpress模板修改 | 某瓜的瓜棚'/><author><name>xlqb</name><uri>http://www.blogger.com/profile/07757898792107625243</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5906929445033990464.post-8743140570194028688</id><published>2008-01-29T23:45:00.000+08:00</published><updated>2008-02-14T00:05:09.228+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='随笔写'/><title type='text'>哈斯日志: Google中文搜索的快照和部分关键词被屏蔽</title><content type='html'>&lt;a href="http://blog.loverty.org/2004/09/google_09.html"&gt;哈斯日志: Google中文搜索的快照和部分关键词被屏蔽&lt;/a&gt;
Google中文搜索的快照和部分关键词被屏蔽 
Google Search &amp; Cache Filtering Behind China's Great Firewall
由加拿大和美国两所大学共同组成的OpenNet运动再次掀起了研究中国国家防火墙技术的高潮。他们就是Google Search &amp; Cache Filtering Behind China's Great Firewall(第24条)研究报告的发布人，其报告的原文见http://www.opennetinitiative.net/bulletins/006/。
研究者通过从QQ的客户端关键词列表过滤DLL中获得的过滤词表。察看其过滤词列表：http://journalism.berkeley.edu/projects/chinadn/en/archives/002885.html
一直以来已为是Google"自律"呢,原来也是被权力强奸哦!
ps:
如下法能访问blogspot，比如我自己曾经在blogger上申请过一个blog，由于一直不能访问，就废掉，今天我去看居然还可以访问。
访问方法如下http://loverty.blogspot.com.nyud.net:8090/
就是用你的http://useid.blogspot.com.nyud.net:8090 就可以了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5906929445033990464-8743140570194028688?l=irlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://blog.loverty.org/2004/09/google_09.html' title='哈斯日志: Google中文搜索的快照和部分关键词被屏蔽'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5906929445033990464&amp;postID=8743140570194028688&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/8743140570194028688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/8743140570194028688'/><link rel='alternate' type='text/html' href='http://irlab.blogspot.com/2008/01/google.html' title='哈斯日志: Google中文搜索的快照和部分关键词被屏蔽'/><author><name>xlqb</name><uri>http://www.blogger.com/profile/07757898792107625243</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5906929445033990464.post-851527272631673095</id><published>2007-11-19T13:07:00.000+08:00</published><updated>2007-11-19T13:06:49.914+08:00</updated><title type='text'>Eclipse快捷键[转贴] </title><content type='html'>&lt;DIV&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;本文档从&lt;A href="http://dev.21tx.com/java/base/eclipse/"   target=_blank&gt;Eclipse&lt;/A&gt;软件上整理，是列出了标准的快捷键，未列出Emacs快捷键。&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;转贴请注明作者和出处。&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;编辑&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;作用域 功能 快捷键 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 查找并替换 Ctrl+F &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;文本编辑器 查找上一个 Ctrl+Shift+K &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;文本编辑器 查找下一个 Ctrl+K &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 撤销 Ctrl+Z &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 复制 Ctrl+C &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 恢复上一个选择 Alt+Shift+↓ &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 剪切 Ctrl+X &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 快速修正 Ctrl1+1 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 内容辅助 Alt+/ &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 全部选中 Ctrl+A &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 删除 Delete &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 上下文信息 Alt+？&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;Alt+Shift+?&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;Ctrl+Shift+Space &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;&lt;A href="http://dev.21tx.com/java/"   target=_blank&gt;Java&lt;/A&gt;编辑器 显示工具提示描述 F2 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;Java编辑器 选择封装元素 Alt+Shift+↑ &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;Java编辑器 选择上一个元素 Alt+Shift+← &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;Java编辑器 选择下一个元素 Alt+Shift+→ &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;文本编辑器 增量查找 Ctrl+J &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;文本编辑器 增量逆向查找 Ctrl+Shift+J &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 粘贴 Ctrl+V &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 重做 Ctrl+Y &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;?&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;查看&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;作用域 功能 快捷键 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 放大 Ctrl+= &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 缩小 Ctrl+- &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;?&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;窗口&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;作用域 功能 快捷键 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 激活编辑器 F12 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 切换编辑器 Ctrl+Shift+W &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 上一个编辑器 Ctrl+Shift+F6 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 上一个视图 Ctrl+Shift+F7 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 上一个透视图 Ctrl+Shift+F8 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 下一个编辑器 Ctrl+F6 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 下一个视图 Ctrl+F7 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 下一个透视图 Ctrl+F8 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;文本编辑器 显示标尺上下文菜单 Ctrl+W &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 显示视图菜单 Ctrl+F10 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 显示系统菜单 Alt+- &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;?&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;导航&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;作用域 功能 快捷键 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;Java编辑器 打开结构 Ctrl+F3 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 打开类型 Ctrl+Shift+T &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 打开类型层次结构 F4 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 打开声明 F3 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 打开外部javadoc Shift+F2 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 打开资源 Ctrl+Shift+R &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 后退历史记录 Alt+← &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 前进历史记录 Alt+→ &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 上一个 Ctrl+, &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 下一个 Ctrl+. &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;Java编辑器 显示大纲 Ctrl+O &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 在层次结构中打开类型 Ctrl+Shift+H &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 转至匹配的括号 Ctrl+Shift+P &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 转至上一个编辑位置 Ctrl+Q &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;Java编辑器 转至上一个成员 Ctrl+Shift+↑ &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;Java编辑器 转至下一个成员 Ctrl+Shift+↓ &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;文本编辑器 转至行 Ctrl+L &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;搜索&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;作用域 功能 快捷键 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 出现在文件中 Ctrl+Shift+U &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 打开搜索对话框 Ctrl+H &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 工作区中的声明 Ctrl+G &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 工作区中的引用 Ctrl+Shift+G &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;?&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;文本编辑&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;作用域 功能 快捷键 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;文本编辑器 改写切换 Insert &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;文本编辑器 上滚行 Ctrl+↑ &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;文本编辑器 下滚行 Ctrl+↓ &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;?&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;文件&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;作用域 功能 快捷键 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 保存 Ctrl+X &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;Ctrl+S &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 打印 Ctrl+P &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 关闭 Ctrl+F4 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 全部保存 Ctrl+Shift+S &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 全部关闭 Ctrl+Shift+F4 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 属性 Alt+Enter &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 新建 Ctrl+N &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;项目&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;作用域 功能 快捷键 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 全部构建 Ctrl+B &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;源代码&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;作用域 功能 快捷键 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;Java编辑器 格式化 Ctrl+Shift+F &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;Java编辑器 取消注释 Ctrl+\ &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;Java编辑器 注释 Ctrl+/ &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;Java编辑器 添加导入 Ctrl+Shift+M &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;Java编辑器 组织导入 Ctrl+Shift+O &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;Java编辑器 使用try/catch块来包围 未设置，太常用了，所以在这里列出,建议自己设置。&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;也可以使用Ctrl+1自动修正。 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;?&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;运行&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;作用域 功能 快捷键 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 单步返回 F7 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 单步跳过 F6 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 单步跳入 F5 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 单步跳入选择 Ctrl+F5 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 调试上次启动 F11 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 继续 F8 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 使用过滤器单步执行 Shift+F5 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 添加/去除断点 Ctrl+Shift+B &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 显示 Ctrl+Shift+D &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 运行上次启动 Ctrl+F11 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 运行至行 Ctrl+R &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 执行 Ctrl+U &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;重构&lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;作用域 功能 快捷键 &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 撤销重构 Alt+Shift+Z &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 抽取方法 Alt+Shift+M &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 抽取局部变量 Alt+Shift+L &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 内联 Alt+Shift+I &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 移动 Alt+Shift+V &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 重命名 Alt+Shift+R &lt;BR&gt;  &lt;P style="TEXT-INDENT: 2em"&gt;全局 重做 Alt+Shift+Y   &lt;BR&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;/FONT&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5906929445033990464-851527272631673095?l=irlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5906929445033990464&amp;postID=851527272631673095&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/851527272631673095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/851527272631673095'/><link rel='alternate' type='text/html' href='http://irlab.blogspot.com/2007/11/eclipse.html' title='Eclipse快捷键[转贴] '/><author><name>xlqb</name><uri>http://www.blogger.com/profile/07757898792107625243</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5906929445033990464.post-1834755831141513246</id><published>2007-11-19T13:03:00.001+08:00</published><updated>2007-11-19T13:03:34.997+08:00</updated><title type='text'>语义搜索引擎综述(zhuan)</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;  &lt;DIV class=tit&gt;语义搜索引擎综述&lt;/DIV&gt;  &lt;DIV class=date&gt;2007-11-19 10:28&lt;/DIV&gt;  &lt;TABLE style="TABLE-LAYOUT: fixed"&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD&gt;        &lt;DIV class=cnt&gt;        &lt;H2&gt;&lt;FONT size=5&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT         face=Arial&gt;1．&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;网络搜索引擎的现状&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/H2&gt;        &lt;P&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;         &lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;搜索引擎在互联网的重要地位由来已久。&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;Yahoo         &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;作为门户网站奇迹般崛起所依靠的正是搜索引擎，&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;Google         &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;也以搜索引擎的技术创新、竞价排名和专业风格创造了新的奇迹。在国内，百度也在很短的时间里凭借搜索引擎取得很大成功。&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;P&gt;&lt;SPAN&gt;&lt;FONT size=3&gt;搜索引擎技术及业务模式的持续创新，不仅为互联网         注入了活力，而且其自身的价值正被重新审视和评估。互联网的发展使得信息短缺的问题被信息泛滥所取代，世界也已从信息时代走进信息经济时代，这两者的区别         在于，前者强调信息本身的价值，只要解决信息资源短缺就会带来价值的提升；后者认为信息并不稀缺，只有通过对信息的甄别、加工提纯和挖掘才能带来价值的提         升。&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;        &lt;P&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;据中国国家互联网中心（&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;CNNIC&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;）&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;2005&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;年&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;1&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;月发布的第&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;15&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;次互联网发展统计报告&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SUP&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman" size=3&gt;[&lt;/FONT&gt;&lt;A         href="http://xchuspace.spaces.msn.com/mmm2006-07-07_16.32/#_edn1"&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;SPAN         style="FONT-SIZE: 10.5pt"&gt;&lt;U&gt;&lt;FONT         color=#0000ff&gt;[1]&lt;/FONT&gt;&lt;/U&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;FONT         face="Times New Roman" size=3&gt;]&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SUP&gt;&lt;FONT         size=3&gt;&lt;SPAN&gt;，我国的网络用户有&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;9400&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;万人，比&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;2004&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;年&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;6&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;月发布的&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;14&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;次报告又增加了&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;700&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;万。在用户经营使用的网络服务中，搜索引擎仅次于电子邮箱排在第&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;2&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;位。有&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;98.5%&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;的用户上网最主要的是获取信息，通过搜索引擎获取信息的占&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;70.7%&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;，搜索引擎成为未知状态下发现有效信息的最有效方式。&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;H2&gt;&lt;FONT size=5&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT         face=Arial&gt;2．&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;网络搜索引擎的工作原理&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/H2&gt;        &lt;P&gt;&lt;SPAN&gt;&lt;FONT size=3&gt;搜索引擎的原理，可以看作三步：&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;        &lt;P&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;a)         &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;从互联网上抓取网页；&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;P&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;b)         &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;建立索引数据库；&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;P&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;c)         &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;在索引数据库中搜索排序。&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;P&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;1.         &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;从互联网上抓取网页&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;P&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;利用能够从互联网上自动收集网页的&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;Spider&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;系统程序，自动访问互联网，并沿着任何网页中的所有&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;URL&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;爬到其它网页，重复这过程，并把爬过的所有网页收集回来。&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;P&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;2.         &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;建立索引数据库&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;P&gt;&lt;FONT         size=3&gt;&lt;SPAN&gt;由分析索引系统程序对收集回来的网页进行分析，提取相关网页信息（包括网页所在&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;URL&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;、编码类型、页面内容包含的所有关键词、关键词位置、生成时间、大小、与其它网页的链接关系等），根据一定的相关度算法进行大量复杂计算，得到每一个网页针对页面文字中及超链中每一个关键词的相关度（或重要性），然后用这些相关信息建立网页索引数据库。&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;P&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;3.         &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;在索引数据库中搜索排序&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;P&gt;&lt;SPAN&gt;&lt;FONT size=3&gt;当用户输入关键词搜索后，由搜索系统程序从网页索         引数据库中找到符合该关键词的所有相关网页。因为所有相关网页针对该关键词的相关度早已算好，所以只需按照现成的相关度数值排序，相关度越高，排名越靠         前。最后，由页面生成系统将搜索结果的链接地址和页面内容摘要等内容组织起来返回给用户。&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;        &lt;H2&gt;&lt;FONT size=5&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT         face=Arial&gt;3．&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;网络搜索引擎的评价指标&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/H2&gt;        &lt;P&gt;&lt;SPAN&gt;&lt;FONT         size=3&gt;评价搜索引擎的主要指标有查全率、查准率、响应时间、覆盖范围、用户使用方便性等等。&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;        &lt;P&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;&lt;FONT size=3&gt;1．&lt;/FONT&gt;&lt;SPAN         style="FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;         &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;查全率（&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;Recall&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;）&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;P&gt;&lt;FONT         size=3&gt;&lt;SPAN&gt;查全率又叫召回率，是指检索出的相关文档占全部相关文档的比率。即用户通过搜索引擎所获取的有用信息与整个&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;Internet&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;中相关信息的比率。&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;P&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;&lt;FONT size=3&gt;2．&lt;/FONT&gt;&lt;SPAN         style="FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;         &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;查准率（&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;Precision&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;）&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;P&gt;&lt;SPAN&gt;&lt;FONT         size=3&gt;查准率是指获取的相关文档与获取文档的比率。即用户通过搜索引擎所获取的真正是用户需要的信息占获取信息的比率。搜索引擎的查准率是个复杂的概念，一方面表示搜索引擎对搜索结果的排序能力，另一方面却体现了搜索引擎对垃圾网页的抗干扰能力。&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;        &lt;P&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;&lt;FONT size=3&gt;3．&lt;/FONT&gt;&lt;SPAN         style="FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;         &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;响应时间（&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;Response   Time&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;）&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;P&gt;&lt;SPAN&gt;&lt;FONT size=3&gt;响应时间是指用户发出查询请求后到看到查询结果的这段时间。&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;        &lt;P&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;&lt;FONT size=3&gt;4．&lt;/FONT&gt;&lt;SPAN         style="FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;         &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;覆盖范围（&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;Coverage&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;）&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;P&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;覆盖范围是指搜索引擎索引的&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;Web&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;页面占整个&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;Internet&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;中页面的比例。&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;P&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;&lt;FONT size=3&gt;5．&lt;/FONT&gt;&lt;SPAN         style="FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;         &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;用户方便性（&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;Convenience&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;）&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;P&gt;&lt;SPAN&gt;&lt;FONT         size=3&gt;用户方便性包括查询接口是否直观、易于使用、查询语法是否丰富，显示结果是否易于查看等。&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;        &lt;H2&gt;&lt;FONT size=5&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT         face=Arial&gt;4．&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;网络搜索引擎的主要技术&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/H2&gt;        &lt;P&gt;&lt;SPAN&gt;&lt;FONT         size=3&gt;网络搜索引擎做为信息检索系统的一个分支，理所当然的涉及到信息检索方面的技术，同时它做为一个独立、成熟的领域也有自己的技术空间：&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;        &lt;P&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman" size=3&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;        &lt;P&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;1&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;．&lt;/SPAN&gt;&lt;FONT         face="Times New Roman"&gt; &lt;/FONT&gt;&lt;SPAN&gt;目录检索和全文检索&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;P&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;         &lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;传统的搜索引擎一般使用两种技术来实现信息检索：&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;P&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;         &lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;一是使用网站分类技术实现目录检索，即把网站进行树状的归类，登陆的网站属于至少一个类别，对每个站点都有简略的描述。&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;Yahoo&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;采用了这种方法。为了分类科学准确，需要有一支各科人才组成的维护队伍。&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;         &lt;SPAN&gt;二是使用全文检索技术。全文检索技术处理的对象是文本，它能够对大量文档建立由字（词）到文档的倒排索引，在此基础上，用户使用关键词来对文档进行查询时，系统将给用户返回该关键词的网页。&lt;/SPAN&gt;         &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;P&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman" size=3&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;        &lt;P&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;2&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;．&lt;/SPAN&gt;&lt;FONT         face="Times New Roman"&gt; &lt;/FONT&gt;&lt;SPAN&gt;索引文件结构&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;P&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;         &lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;全         文检索的两个关键技术是索引和检索。检索又是基于所建立的索引结构进行的。索引文件主要分为正向索引和倒排索引。正向索引是基于文档的，每一个文档对应一         个索引文件，其中记录着这个文档中出现的词。倒排索引是基于词汇表的，每一个特征词对应一个倒排索引，其中记录着所有出现过这个词的文档。目前，技术比较         成熟、也是公认效率较高的索引存储结构是倒排文件。需要明确的是，中文的构词方式、句法、语法都与英文有很大区别，因此，不同于英文全文检索的索引方法，         中文全文检索中主要的建立索引方法是字索引和词索引。字索引保证了高的召回率，不会出现漏查错误，但是会出现多查和误查。检索结果中会出现不少与检索意图         无关的条目。另外，基于字索引的全文检索的检索效率也比较低。而词索引保证了较高的查准率和检索效率，但是由于中文分词能力的局限，导致基于词索引的全文         检索必定会存在漏检情况。另外，对于未登陆词，词索引显得力不从心。现存比较实用的中文信息检索系统一般都结合使用了字词混合索引，或者扩展的词索引，来         保证召回率和查准率。&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;P&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;         &lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;网络搜索引擎由于各自的策略不同，在选择索引对象的内容时也有不同。有些搜索引擎对于信息库中的页面建立全文索引，有些只建立摘要部分，或者每个段落前面部分的索引，还有些搜索引擎（如&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;Google&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;）建立索引的时候，同时考虑超文本的不同标记所表示的不同含义。如粗体、大字体显示的东西往往比较重要；放在锚链中的信息往往是它所指向页面的信息的概括，所以用它来作为它所指向的页面的重要信息。&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;Google&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;，&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;Infoseek&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;还在建立索引的过程中收集页面中的超链接。这些超链接反映了收集到的信息之间的空间结构。利用这些结果信息可以提高页面相关度判别时候的准确度。&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;P&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman" size=3&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;        &lt;P&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;3&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;．&lt;/SPAN&gt;&lt;FONT         face="Times New Roman"&gt; &lt;/FONT&gt;&lt;SPAN&gt;数据源文件的分布策略&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;P&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;         &lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;搜索引擎的数据源文件主要包括索引文件和原文档。目前，数据源文件的分布策略主要有集中存放和分布式存放。文献&lt;/SPAN&gt;&lt;/FONT&gt;&lt;A         href="http://xchuspace.spaces.msn.com/mmm2006-07-07_16.32/#_edn2"&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;SPAN         style="FONT-SIZE: 10.5pt"&gt;&lt;U&gt;&lt;FONT         color=#0000ff&gt;[2]&lt;/FONT&gt;&lt;/U&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;FONT         size=3&gt;&lt;SPAN&gt;指出&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;Google&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;就         是采用了集群的方式集中存放数据源文件，事实上，几乎所有的商业搜索引擎都采用集中存放的方式，这是因为分布式存放策略有一个硬伤，就是搜索请求从一个端         点传送到另外一个端点消耗的时间让用户难以忍受。但是，随着互联网上信息的急剧膨胀，改进后的分布式策略是最终的解决方案。&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;P&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman" size=3&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;        &lt;P&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;4&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;．&lt;/SPAN&gt;&lt;FONT         face="Times New Roman"&gt; &lt;/FONT&gt;&lt;SPAN&gt;索引大文件的存放策略&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;P&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;         &lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;倒排文件是一个大文件，这是因为倒排文件中存放的记录（&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;Hit&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;）表示的是文档中出现本特征词的状况。目前的商业搜索引擎的文档集中的文档数量非常之大，因此倒排文件的记录数也会很大，最终导致倒排文件的尺寸非常大。&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;P&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;         &lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;对于大文件首先考虑的是压缩，像是&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;Google&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;存放的索引文件就是经过压缩的。好的压缩算法同时要求压缩比尽可能高、查找压缩文件容易、解压缩时间短。即使压缩之后的文件仍然大到不能以独立的文件形式存放，目前有两种分离大文件为多个小文件的策略：&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;P&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;         &lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;一是基于文档集的分离。主要是将文档集分成有限个子集，对于每一个子集建立各自的索引文件，检索过程就演变为对多个文档子集的检索，最后做的合并处理。&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;P&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;         &lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;一是基于索引文件的分离。即是将索引大文件分为有限个子文件，并设计一张表记录这种分离情况，当要检索这个索引文件时就查找这张表，根据表的记录去查找每一个子文件。文献&lt;/SPAN&gt;&lt;/FONT&gt;&lt;A         href="http://xchuspace.spaces.msn.com/mmm2006-07-07_16.32/#_edn3"&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;SPAN         style="FONT-SIZE: 10.5pt"&gt;&lt;U&gt;&lt;FONT         color=#0000ff&gt;[3]&lt;/FONT&gt;&lt;/U&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;FONT         size=3&gt;&lt;SPAN&gt;指出&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;Google&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;将索引大文件分离为若干个小文件，每一个小文件都以独立的&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;linux&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;文件存放，通过&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;linux&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;系统管理这些小文件，这正是这个策略的一种表现。&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;P&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman" size=3&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;        &lt;P&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;&lt;FONT size=3&gt;5．&lt;/FONT&gt;&lt;SPAN         style="FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;         &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT size=3&gt;排序算法&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;        &lt;P&gt;&lt;FONT         size=3&gt;&lt;SPAN&gt;各种搜索引擎的技术改进和优化，都直接反应到搜索结果的排序上。许多搜索引擎都在进一步研究新的排序方法，来提升客户的满意度。目前，不同搜索引擎基于不同的搜索策略设计有多种不同的排序算法，以&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;Google&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;为例，它采用很多种排序算法支持搜索结果，其中最典型的代表有&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;PageRank&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;和&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;HillTop&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;，这两种都属于超链接分析技术。&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;H2&gt;&lt;FONT size=5&gt;&lt;SPAN style="FONT-WEIGHT: normal"&gt;&lt;FONT         face=Arial&gt;5&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN         style="FONT-WEIGHT: normal"&gt;．&lt;/SPAN&gt;&lt;SPAN&gt;语义搜索的兴起&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/H2&gt;        &lt;P&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;目前实用化的信息检索系统主要基于人工分类目录或         关键词匹配。前者对海量信息资源的揭示的效率不高、深度有限；后者在信息的语义和语用的揭示上有局限性。信息检索系统在智能处理能力上的缺乏，导致这些工         具远远不能满足用户的需求。如何解决好诸如信息组织、知识表示、机器理解与人机交互等问题，对于提高信息利用的效率，是非常重要和迫切的。近年来，语义网         的提出为解决这些问题提供了锲机，由于语义网中的资源被结构化，能被计算机所理解和识别，这样提供了改进传统搜索技术的机会。语义检索的目的是通过从语义         网上获取的数据增强并改进传统的搜索结果&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;(&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;基于信息检索技术&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;)&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;。         它实现了用户检索请求的本体化，整个搜索引擎像领域专家一样，不仅给出查询结果，还给出了与检索请求相关的资源，大大提高检索的精度和覆盖率；实现了本体         层次的检索，突破了关键词检索局限于形式的固有缺陷。它的出现提高了用户的满意度，减少了不相关的返回结果，提高了检索的精度和覆盖率。&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;P&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;最初人们通过代表语义的&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;HTML&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;标签来改造网页，主要有&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;GDA&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;系统和&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN&gt;&lt;BR&gt;&lt;FONT         face="Times New Roman"         size=3&gt;SHOE(SimpleHTMLOntologyExtensions)&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT         size=3&gt;&lt;SPAN&gt;系统等。但这些系统的不足是仅能处理经过&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;HTML&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;标签改造的网页。&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;P&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;XML&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;是非常有前途的语言，因为它将网页的内容、结构和描述分离，并且非常适合知识的描述。但是&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;XML&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;通过它的句法结构仅能描述一些语义属性。&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;P&gt;&lt;SPAN&gt;&lt;FONT size=3&gt;语义网络的建立使得以语义为基础的搜索引擎同时可         以建立起来。在语义搜索引擎中，每一个查询都在一些本体的上下文范围内执行，来自本体的一些指南可以提高检索的准确性。在语义检索中，使用的是概念匹配，         即自动抽取文档的概念，加以标引，用户在系统的辅助下选用合适的词语表达自己的信息需求，然后在两者之间执行概念匹配，即匹配在语义上相同、相近、相包含         的词语。&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;        &lt;H2&gt;&lt;FONT size=5&gt;&lt;SPAN&gt;&lt;FONT         face=Arial&gt;6&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;．语义搜索当前的应用&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/H2&gt;        &lt;P align=left&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;当前基于&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;ontology         &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;的语义检索系统已经得到了广泛的关注和应用，出现了一系列优秀的应用系统，其中典型的有两个：&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;SWOOGLE&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;――语义网中的基于蜘蛛网的检索系统，系统从每个搜索到的文本中抽取本体，根据本体之间的相关度来比较文本之间的关系；&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;TUCUXI(InTelligent Hunter Agent for Concept         Understanding and LeXical         ChaIning)&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;，该系统根据查找的本体在网页上爬行，决定哪种网页最满足需求。特别的，&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;TUCUXI         &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;判断文档的相关性是同&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;Map of Meanings         &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;比较用户所查询的相关本体。&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;Map of Meanings         &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;语义丰富，用来对资源文本的表达。&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;TUCUXI &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;采用了&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;MOMIS         &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;公用字典来表征用户查询的本体。在语义网中&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;,&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;基于&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;Ontology         &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;的语义检索搜索引擎有&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;SHOE&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;、&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;OntoBroker&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;、&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;OntoSeek&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;、&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;WebKB&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;、&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;Corese&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;。&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;        &lt;H2&gt;&lt;FONT size=5&gt;&lt;SPAN style="FONT-WEIGHT: normal"&gt;&lt;FONT         face=Arial&gt;7&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN         style="FONT-WEIGHT: normal"&gt;．&lt;/SPAN&gt;&lt;SPAN&gt;总结&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/H2&gt;        &lt;P&gt;&lt;FONT size=3&gt;&lt;SPAN&gt;语义搜索引擎是未来搜索引擎发展的方向，它的发展主要受限于语义&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT         face="Times New Roman"&gt;web&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;的发展以及自然语言处理技术。语义搜索引擎设计的最终目标是让计算机具有人的智能，以解决问题的形式返回给用户。语义搜索引擎设计的当前目标是让计算机返回的结果更有针对性、准确性。&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/DIV&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;/FONT&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5906929445033990464-1834755831141513246?l=irlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5906929445033990464&amp;postID=1834755831141513246&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/1834755831141513246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/1834755831141513246'/><link rel='alternate' type='text/html' href='http://irlab.blogspot.com/2007/11/zhuan.html' title='语义搜索引擎综述(zhuan)'/><author><name>xlqb</name><uri>http://www.blogger.com/profile/07757898792107625243</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5906929445033990464.post-7266737072921656318</id><published>2007-11-18T15:02:00.001+08:00</published><updated>2007-11-18T15:02:25.948+08:00</updated><title type='text'>【搜索引擎技术普及 - 5]信息检索的一些初步知识 --来源：sogoulab</title><content type='html'>&lt;DIV&gt;  &lt;DIV&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;FONT face=Verdana   size=2&gt;&lt;/FONT&gt;&lt;/DIV&gt;  &lt;DIV&gt;&lt;FONT face=Verdana size=2&gt;  &lt;DIV&gt;&lt;FONT face=Verdana&gt;最近吧上有不少朋友讨论搜索引擎的结果相关性排序问题，所以这次知识普及的重点想放在与之相关的信息检索知识上   &lt;BR&gt;&lt;BR&gt;&lt;IMG   src="http://img64.pp.sohu.com/images/2007/4/21/11/3/112a9c3cebc.jpg"   onload=changeImageSize(this,540,540); border=0&gt;   &lt;BR&gt;&lt;BR&gt;以上是一个信息检索系统的基本架构和运行示意图，引自信息检索一本很好的入门教科书《modern information   retrieval》（现代信息检索），现在貌似机械工业出版社有了中文版，大家有兴趣可以买来或者借来看看。   &lt;BR&gt;&lt;BR&gt;传统意义的文本信息检索系统是由文本处理、内容索引、查询处理、用户界面等模块组成的。   &lt;BR&gt;&lt;BR&gt;从数据处理对象的角度分析，信息检索系统面对的处理对象则包括文本语料库与检索用户两方面的内容。具体的运行流程上，系统将语料库中的文本经过取词根（英文）、分词（中文）、去除停用词等操作后输入进索引模块，索引模块以词项（term）为中心组织倒排索引（inverted   index），从而完成系统准备工作。用户进行检索时，首先通过用户界面输入其查询需求（query），系统通过查询模块在倒排索引中定位相关文档集合，再依据相关文档与查询需求的相似度对相关文档进行排序（ranking），并通过用户界面反馈给用户检索结果。   &lt;BR&gt;&lt;BR&gt;检索系统中，使用何种模型进行查询需求与文档的相似度计算是关键性的研究问题，信息检索研究中的模型研究，大多是针对这类相似度计算模型而进行的。从20世纪60年代中期以来，人们提出了大量的相似度评价模型。从最初的为一些较小的和较为结构化的文档所设计的特殊模型（如文献记录，包括题目、作者和主题码等），发展到现在具有较强理论基础和能处理多种文档格式的模型。总的来说，当前应用比较广泛的检索模型有如下三种：   &lt;BR&gt;&lt;BR&gt;1．布尔模型(Boolean   Model)。布尔模型又称精确匹配模型，是许多商业信息检索系统尤其是早期联机信息检索系统的理论基础。在布尔模型中，文档和查询都被表示为索引项的集合。其优势在于：实现简单，计算复杂度低，支持结构化查询等，因此在计算机硬件水平较低的早期信息检索系统应用中得到了青睐。目前，不少图书馆信息检索系统还是基于布尔模型进行搭建的。   &lt;BR&gt;&lt;BR&gt;2．统计模型(Statistical   Model)，统计模型基于文本统计信息（如词项频度统计、文档频度统计等）和统计自然语言处理方法进行文本相似度计算。统计模型从布尔模型的"精确匹配"发展到"最优匹配"，可以说真正把信息检索与传统的数据搜索区别开来。而具体来说，其又包括向量空间模型(Vector   Space Model)和概率模型(Probabilistic   Model)两类。向量空间模型把文档和查询表示成一个高维空间中的向量，用距离作为相似度的度量。而概率模型则把检索看作是文档表示和查询之间匹配成功的概率估计问题，使用概率理论做指导。统计模型是当前应用最广泛的检索模型，在从小规模纯文本信息检索系统到搜索引擎在内的各种检索系统中广泛应用。   &lt;BR&gt;&lt;BR&gt;3. 语言与知识模型(Linguistic and Knowledge-based   Model)。与统计模型不同，基于语言和知识的检索模型试图考察查询背后的用户真实需求，从而更加准确的理解用户意图，获得更好的检索效果。目前较常用的做法是通过考察用户查询和相关文档之间的语言模型的相似程度，来进行文档相关度的计算，即计算按照文档的语言模型有多大可能性生成用户查询。语言和知识模型在本世纪初以来得到了较为广泛的应用，目前信息检索研究领域应用的较为广泛的Lemur/Indri系统，就是基于此模型进行内容相似度计算的。   &lt;BR&gt;&lt;BR&gt;以上我们对信息检索系统的整体运行流程和其中的相似度计算模型进行了简单介绍，总体而言，信息检索系统的架构设计自上个世纪五十年代信息检索问世以来没有经历过大的改动，而直到今天，这个架构即使在处理海量规模网络文本数据的问题上也是能够满足应用需求的。当前信息检索研究的重点，一方面在于利用自然语言处理方面的研究成果对检索相似度模型框架进行修正；另一方面则在于对检索系统的应用对象加以拓展，针对专门检索系统如网络信息检索系统、多媒体检索系统等开展研究和分析。   &lt;BR&gt;&lt;BR&gt;关于这部分内容的详细数学描述，有兴趣的读者可以参考&lt;A   href="http://www.scils.rutgers.edu/~aspoerri/InfoCrystal/InfoCrystal.htm"   target=_blank&gt;http://www.scils.rutgers.edu/~aspoerri/InfoCrystal/InfoCrystal.htm&lt;/A&gt;，MIT毕业的Spoerri博士的一个开放项目。   &lt;/DIV&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5906929445033990464-7266737072921656318?l=irlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5906929445033990464&amp;postID=7266737072921656318&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/7266737072921656318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/7266737072921656318'/><link rel='alternate' type='text/html' href='http://irlab.blogspot.com/2007/11/5-sogoulab.html' title='【搜索引擎技术普及 - 5]信息检索的一些初步知识 --来源：sogoulab'/><author><name>xlqb</name><uri>http://www.blogger.com/profile/07757898792107625243</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5906929445033990464.post-1749651576909945056</id><published>2007-11-15T15:35:00.000+08:00</published><updated>2007-11-15T15:32:58.153+08:00</updated><title type='text'>Bash 实例，第 3 部分</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;  &lt;P&gt;2000 年 5 月 01 日&lt;/P&gt;  &lt;BLOCKQUOTE&gt;Daniel Robbins 在其最后一篇 &lt;I&gt;Bash实例&lt;/I&gt;文章中详细讲述了 Gentoo Linux ebuild     系统，这个展示 bash能力的极佳范例。循序渐进地，他为您展示如何实现 ebuild系统，并触及很多方便的     bash技术和设计策略。在本文末尾，您将很好地掌握制造完全基于 bash的应用所涉及的技术，并开始为自己的自动构建系统编码。 &lt;/BLOCKQUOTE&gt;&lt;!--START RESERVED FOR FUTURE USE INCLUDE FILES--&gt;&lt;!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --&gt;&lt;!--END RESERVED FOR FUTURE USE INCLUDE FILES--&gt;  &lt;P&gt;&lt;A name=N1005F&gt;&lt;SPAN class=atitle&gt;进入 ebuild 系统&lt;/SPAN&gt;&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;我真是一直期待着这第三篇、也是最后一篇 &lt;I&gt;Bash 实例&lt;/I&gt;文章，因为既然已经在 &lt;A   href="http://www.ibm.com/software/developerworks/library/bash.html"&gt;第 1 篇&lt;/A&gt;和   &lt;A href="http://www.ibm.com/software/developerworks/library/bash2.html"&gt;第 2   篇&lt;/A&gt; 中讲述了 bash 编程基础，就可以集中讲述象 bash   应用开发和程序设计这样更高级的主题。在本文中，将通过我花了许多时间来编码和细化的项目，Gentoo Linux ebuild 系统，来给您大量实际的、现实世界的   bash 开发经验。 &lt;/P&gt;  &lt;P&gt;我是 Gentoo Linux（目前还是 beta 版的下一代 Linux OS）的首席设计师。我的主要责任之一就是确保所有二进制包（类似于   RPM）都正确创建并一起使用。正如您可能知道的，标准 Linux 系统不是由一棵统一的源树组成（象 BSD），而实际上是由超过 25   个协同工作的核心包组成。这其中包括：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=3 border=0&gt;    &lt;TBODY&gt;    &lt;TR vAlign=top&gt;      &lt;TD&gt;&lt;B&gt;包&lt;/B&gt; &lt;/TD&gt;      &lt;TD&gt;&lt;B&gt;描述&lt;/B&gt; &lt;/TD&gt;&lt;/TR&gt;    &lt;TR vAlign=top&gt;      &lt;TD&gt;linux&lt;/TD&gt;      &lt;TD&gt;实际内核&lt;/TD&gt;&lt;/TR&gt;    &lt;TR vAlign=top&gt;      &lt;TD&gt;util-linux&lt;/TD&gt;      &lt;TD&gt;与 Linux 相关的杂项程序集合&lt;/TD&gt;&lt;/TR&gt;    &lt;TR vAlign=top&gt;      &lt;TD&gt;e2fsprogs&lt;/TD&gt;      &lt;TD&gt;与 ext2 文件系统相关的实用程序集合&lt;/TD&gt;&lt;/TR&gt;    &lt;TR vAlign=top&gt;      &lt;TD&gt;glibc&lt;/TD&gt;      &lt;TD&gt;GNU C 库&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;  &lt;P&gt;每个包都位于各自的 tar   压缩包中，并由不同的独立开发人员或开发小组维护。要创建一个发行版，必须对每个包分别进行下载、编译和打包处理。每次要修复、升级或改进包时，都必须重复编译和打包步骤（并且，包确实更新得很快）。为了帮助消除创建和更新包所涉及的重复步骤，我创建了   ebuild 系统，该系统几乎全用 bash 编写。为了增加您的 bash 知识，我将循序渐进地为您演示如何实现该 ebuild   系统的解包和编译部分。在解释每一步时，还将讨论为什么要作出某些设计决定。在本文末尾，您不仅将极好地掌握大型 bash   编程项目，还实现了完整自动构建系统的很大一部分。&lt;/P&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD&gt;&lt;IMG height=1 alt=""         src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"&gt;&lt;BR&gt;&lt;IMG         height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8     border=0&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;  &lt;TABLE class=no-print cellSpacing=0 cellPadding=0 align=right&gt;    &lt;TBODY&gt;    &lt;TR align=right&gt;      &lt;TD&gt;&lt;IMG height=4 alt="" src="http://www.ibm.com/i/c.gif"   width="100%"&gt;&lt;BR&gt;        &lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;          &lt;TBODY&gt;          &lt;TR&gt;            &lt;TD vAlign=center&gt;&lt;IMG height=16 alt=""               src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16               border=0&gt;&lt;BR&gt;&lt;/TD&gt;            &lt;TD vAlign=top align=right&gt;&lt;A class=fbox               href="http://www.ibm.com/developerworks/cn/linux/shell/bash/bash-3/#main"&gt;&lt;B&gt;回页首&lt;/B&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;  &lt;P&gt;&lt;A name=N100B7&gt;&lt;SPAN class=atitle&gt;为什么选择 bash？&lt;/SPAN&gt;&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;Bash 是 Gentoo Linux ebuild 系统的基本组件。选择它做为 ebuild   的主要语言有几个原因。首先，其语法不复杂，并且为人们所熟悉，这特别适合于调用外部程序。自动构建系统是自动调用外部程序的"胶合代码"，而 bash   非常适合于这种类型的应用。第二，Bash 对函数的支持允许 ebuild 系统使用模块化、易于理解的代码。第三，ebuild 系统利用了 bash   对环境变量的支持，允许包维护人员和开发人员在运行时对其进行方便的在线配置。&lt;/P&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD&gt;&lt;IMG height=1 alt=""         src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"&gt;&lt;BR&gt;&lt;IMG         height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8     border=0&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;  &lt;TABLE class=no-print cellSpacing=0 cellPadding=0 align=right&gt;    &lt;TBODY&gt;    &lt;TR align=right&gt;      &lt;TD&gt;&lt;IMG height=4 alt="" src="http://www.ibm.com/i/c.gif"   width="100%"&gt;&lt;BR&gt;        &lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;          &lt;TBODY&gt;          &lt;TR&gt;            &lt;TD vAlign=center&gt;&lt;IMG height=16 alt=""               src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16               border=0&gt;&lt;BR&gt;&lt;/TD&gt;            &lt;TD vAlign=top align=right&gt;&lt;A class=fbox               href="http://www.ibm.com/developerworks/cn/linux/shell/bash/bash-3/#main"&gt;&lt;B&gt;回页首&lt;/B&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;  &lt;P&gt;&lt;A name=N100C0&gt;&lt;SPAN class=atitle&gt;构建过程回顾&lt;/SPAN&gt;&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;在讨论 ebuild 系统之前，让我们回顾一下编译和安装包都牵涉些什么。例如，让我们看一下 "sed" 包，这个作为所有 Linux 版本一部分的标准   GNU 文本流编辑实用程序。首先，下载源代码 tar 压缩包 (sed-3.02.tar.gz)（请参阅 &lt;A   href="http://www.ibm.com/developerworks/cn/linux/shell/bash/bash-3/#resources"&gt;参考资料&lt;/A&gt;   ）。我们将把这个档案存储在 /usr/src/distfiles 中，将使用环境变量 "$DISTDIR" 来引用该目录。"$DISTDIR" 是所有原始源代码   tar 压缩包所在的目录，它是一个大型源代码库。 &lt;/P&gt;  &lt;P&gt;下一步是创建名为 "work" 的临时目录，该目录存放已经解压的源代码。以后将使用 "$WORKDIR"   环境变量引用该目录。要做到这点，进入有写权限的目录，然后输入：&lt;/P&gt;&lt;BR&gt;&lt;A name=N100D0&gt;&lt;B&gt;将 sed   解压缩到临时目录&lt;/B&gt;&lt;/A&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;$ mkdir work  $ cd work  $ tar xzf /usr/src/distfiles/sed-3.02.tar.gz  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;然后，解压缩 tar 压缩包，创建一个包含所有源代码、名为 sed-3.02 的目录。以后将使用环境变量 "$SRCDIR" 引用 sed-3.02   目录。要编译程序，输入：&lt;/P&gt;&lt;BR&gt;&lt;A name=N100DD&gt;&lt;B&gt;将 sed 解压缩到临时目录&lt;/B&gt;&lt;/A&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;$ cd sed-3.02  $ ./configure --prefix=/usr  （autoconf 生成适当的 make 文件，这要花一些时间）  $ make  (从源代码编译包，也要花一点时间）  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;因为在本文中只讲述解包和编译步骤，所以将略过 "make install" 步骤。如果要编写 bash   脚本来执行所有这些步骤，则代码可能类似于：&lt;/P&gt;&lt;BR&gt;&lt;A name=N100EA&gt;&lt;B&gt;要执行解包／编译过程的样本 bash 脚本&lt;/B&gt;&lt;/A&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;#!/usr/bin/env bash  if [ -d work ]  then   # remove old work directory if it exists       rm -rf work  fi  mkdir work  cd work  tar xzf /usr/src/distfiles/sed-3.02.tar.gz  cd sed-3.02  ./configure --prefix=/usr  make  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD&gt;&lt;IMG height=1 alt=""         src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"&gt;&lt;BR&gt;&lt;IMG         height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8     border=0&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;  &lt;TABLE class=no-print cellSpacing=0 cellPadding=0 align=right&gt;    &lt;TBODY&gt;    &lt;TR align=right&gt;      &lt;TD&gt;&lt;IMG height=4 alt="" src="http://www.ibm.com/i/c.gif"   width="100%"&gt;&lt;BR&gt;        &lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;          &lt;TBODY&gt;          &lt;TR&gt;            &lt;TD vAlign=center&gt;&lt;IMG height=16 alt=""               src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16               border=0&gt;&lt;BR&gt;&lt;/TD&gt;            &lt;TD vAlign=top align=right&gt;&lt;A class=fbox               href="http://www.ibm.com/developerworks/cn/linux/shell/bash/bash-3/#main"&gt;&lt;B&gt;回页首&lt;/B&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;  &lt;P&gt;&lt;A name=N100F4&gt;&lt;SPAN class=atitle&gt;使代码通用&lt;/SPAN&gt;&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;虽然可以使用这个自动编译脚本，但它不是很灵活。基本上，bash   脚本只包含在命令行输入的所有命令列表。虽然可以使用这种解决方案，但是，最好做一个只通过更改几行就可以快速解包和编译任何包的适用脚本。这样，包维护人员将新包添加到发行版所需的工作就大为减少。让我们先尝试一下使用许多不同的环境变量来完成，使构建脚本更加适用：&lt;/P&gt;&lt;BR&gt;&lt;A   name=N100FD&gt;&lt;B&gt;新的、更通用的脚本&lt;/B&gt;&lt;/A&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;#!/usr/bin/env bash  # P is the package name  P=sed-3.02  # A is the archive name  A=${P}.tar.gz  export ORIGDIR=`pwd`  export WORKDIR=${ORIGDIR}/work  export SRCDIR=${WORKDIR}/${P}  if [ -z "$DISTDIR" ]  then       # set DISTDIR to /usr/src/distfiles if not already set      DISTDIR=/usr/src/distfiles  fi  export DISTDIR  if [ -d ${WORKDIR} ]  then          # remove old work directory if it exists       rm -rf ${WORKDIR}  fi  mkdir ${WORKDIR}  cd ${WORKDIR}  tar xzf ${DISTDIR}/${A}  cd ${SRCDIR}  ./configure --prefix=/usr  make  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;已经向代码中添加了很多环境变量，但是，它基本上还是执行同一功能。但是，如果现在要要编译任何标准的 GNU 基于 autoconf 的源代码 tar   压缩包，只需简单地将该文件复制到一个新文件（用合适的名称来反映它所编译的新包名），然后将 "$A" 和 "$P"   的值更改成新值即可。所有其它环境变量都自动调整成正确设置，并且脚本按预想工作。虽然这很方便，但是代码还有改进余地。这段代码比我们开始创建的   "transcript"   脚本要长很多。既然任何编程项目的目标之一是减少用户复杂度，所以最好大幅度缩短代码，或者至少更好地组织代码。可以用一个巧妙的方法来做到这点 --   将代码拆成两个单独文件。将该文件存为 "sed-3.02.ebuild"：&lt;/P&gt;&lt;BR&gt;&lt;A   name=N1010A&gt;&lt;B&gt;sed-3.02.ebuild&lt;/B&gt;&lt;/A&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;#the sed ebuild file -- very simple!  P=sed-3.02  A=${P}.tar.gz       &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;第一个文件不重要，只包含那些必须在每个包中配置的环境变量。下面是第二个文件，它包含操作的主要部分。将它存为   "ebuild"，并使它成为可执行文件：&lt;/P&gt;&lt;BR&gt;&lt;A name=N10117&gt;&lt;B&gt;ebuild 脚本&lt;/B&gt;&lt;/A&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;#!/usr/bin/env bash  if [ $# -ne 1 ]  then       echo "one argument expected."      exit 1  fi  if [ -e "$1" ]  then       source $1  else      echo "ebuild file $1 not found."      exit 1  fi  export ORIGDIR=`pwd`  export WORKDIR=${ORIGDIR}/work  export SRCDIR=${WORKDIR}/${P}  if [ -z "$DISTDIR" ]  then       # set DISTDIR to /usr/src/distfiles if not already set      DISTDIR=/usr/src/distfiles  fi  export DISTDIR  if [ -d ${WORKDIR} ]  then          # remove old work directory if it exists       rm -rf ${WORKDIR}  fi  mkdir ${WORKDIR}  cd ${WORKDIR}  tar xzf ${DISTDIR}/${A}  cd ${SRCDIR}  ./configure --prefix=/usr  make  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;既然已经将构建系统拆成两个文件，我敢打赌，您一定在想它的工作原理。基本上，要编译 sed，输入：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;$ ./ebuild sed-3.02.ebuild&lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;当执行 "ebuild" 时，它首先试图 "source" 变量 "$1"。这是什么意思？还记得 &lt;A   href="http://www.ibm.com/software/developerworks/library/bash2.html"&gt;前一篇文章&lt;/A&gt;   所讲的吗："$1" 是第一个命令行自变量 -- 在这里，是 "sed-3.02.ebuild"。在 bash 中，"source" 命令从文件中读入 bash   语句，然后执行它们，就好象它们直接出现在 "source" 命令所在的文件中一样。因此，"source ${1}" 导致 "ebuild" 脚本执行在   "sed-3.02.ebuild" 中定义 "$P" 和 "$A" 的命令。这种设计更改确实方便，因为如果要编译另一个程序，而不是   sed，可以简单地创建一个新的 .ebuild 文件，然后将其作为自变量传递给 "ebuild" 脚本。通过这种方式，.ebuild 文件最终非常简单，而将   ebuild 系统复杂的操作部分存在一处，即 "ebuild" 脚本中。通过这种方式，只需编辑 "ebuild" 脚本就可以升级或增强 ebuild   系统，同时将实现细节保留在 ebuild 文件之外。这里有一个 gzip 的样本 ebuild 文件： &lt;/P&gt;&lt;BR&gt;&lt;A   name=N1012F&gt;&lt;B&gt;gzip-1.2.4a.ebuild&lt;/B&gt;&lt;/A&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;#another really simple ebuild script!  P=gzip-1.2.4a  A=${P}.tar.gz  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD&gt;&lt;IMG height=1 alt=""         src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"&gt;&lt;BR&gt;&lt;IMG         height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8     border=0&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;  &lt;TABLE class=no-print cellSpacing=0 cellPadding=0 align=right&gt;    &lt;TBODY&gt;    &lt;TR align=right&gt;      &lt;TD&gt;&lt;IMG height=4 alt="" src="http://www.ibm.com/i/c.gif"   width="100%"&gt;&lt;BR&gt;        &lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;          &lt;TBODY&gt;          &lt;TR&gt;            &lt;TD vAlign=center&gt;&lt;IMG height=16 alt=""               src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16               border=0&gt;&lt;BR&gt;&lt;/TD&gt;            &lt;TD vAlign=top align=right&gt;&lt;A class=fbox               href="http://www.ibm.com/developerworks/cn/linux/shell/bash/bash-3/#main"&gt;&lt;B&gt;回页首&lt;/B&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;  &lt;P&gt;&lt;A name=N10139&gt;&lt;SPAN class=atitle&gt;添加功能性&lt;/SPAN&gt;&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;好，我们正在取得进展。但是，我还想添加某些额外功能性。我希望 ebuild 脚本再接受一个命令行自变量："compile"、"unpack" 或   "all"。这个命令行自变量告诉 ebuild 脚本要执行构建过程的哪一步。通过这种方式，可以告诉 ebuild   解包档案，但不进行编译（以便在开始编译之前查看源代码档案）。要做到这点，将添加一条 case 语句，该语句将测试   "$2"，然后根据其值执行不同操作。代码如下：&lt;/P&gt;&lt;BR&gt;&lt;A name=N10142&gt;&lt;B&gt;ebuild，修定本 2&lt;/B&gt;&lt;/A&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;#!/usr/bin/env bash  if [ $# -ne 2 ]  then       echo "Please specify two args - .ebuild file and unpack, compile or all"      exit 1  fi  if [ -z "$DISTDIR" ]  then       # set DISTDIR to /usr/src/distfiles if not already set      DISTDIR=/usr/src/distfiles  fi  export DISTDIR  ebuild_unpack() {      #make sure we're in the right directory       cd ${ORIGDIR}            if [ -d ${WORKDIR} ]      then              rm -rf ${WORKDIR}      fi      mkdir ${WORKDIR}      cd ${WORKDIR}      if [ ! -e ${DISTDIR}/${A} ]      then          echo "${DISTDIR}/${A} does not exist.  Please download first."          exit 1      fi          tar xzf ${DISTDIR}/${A}      echo "Unpacked ${DISTDIR}/${A}."      #source is now correctly unpacked  }  ebuild_compile() {            #make sure we're in the right directory      cd ${SRCDIR}      if [ ! -d "${SRCDIR}" ]      then          echo "${SRCDIR} does not exist -- please unpack first."          exit 1          fi      ./configure --prefix=/usr      make       }  export ORIGDIR=`pwd`  export WORKDIR=${ORIGDIR}/work  if [ -e "$1" ]  then       source $1  else      echo "Ebuild file $1 not found."      exit 1  fi  export SRCDIR=${WORKDIR}/${P}  case "${2}" in      unpack)          ebuild_unpack          ;;      compile)          ebuild_compile          ;;      all)          ebuild_unpack          ebuild_compile          ;;      *)          echo "Please specify unpack, compile or all as the second arg"          exit 1          ;;  esac  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;已经做了很多改动，下面来回顾一下。首先，将编译和解包步骤放入各自的函数中，其函数名分别为 ebuild_compile() 和   ebuild_unpack()。这是个好的步骤，因为代码正变得越来越复杂，而新函数提供了一定的模块性，使代码更有条理。在每个函数的第一行，显式 "cd"   到想要的目录，因为，随着代码变得越来越模块化而不是线形化，出现疏忽而在错误的当前工作目录中执行函数的可能性也变大。"cd"   命令显式地使我们处于正确的位置，并防止以后出现错误 - 这是重要的步骤，特别是在函数中删除文件时更是如此。&lt;/P&gt;  &lt;P&gt;另外，还在 ebuild_compile() 函数的开始处添加了一个有用的检查。现在，它检查以确保 "$SRCDIR"   存在，如果不存在，则打印一条告诉用户首先解包档案然后退出的错误消息。如果愿意，可以改变这种行为，以便在 "$SRCDIR" 不存在的情况下，ebuild   脚本将自动解包源代码档案。可以用以下代码替换 ebuild_compile() 来做到这点：&lt;/P&gt;&lt;BR&gt;&lt;A   name=N10152&gt;&lt;B&gt;ebuild_compile() 上的新代码&lt;/B&gt;&lt;/A&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;ebuild_compile() {      #make sure we're in the right directory        if [ ! -d "${SRCDIR}" ]      then          ebuild_unpack          fi      cd ${SRCDIR}      ./configure --prefix=/usr      make       }  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;ebuild 脚本第二版中最明显的改动之一就是代码末尾新的 case 语句。这条 case   语句只是检查第二个命令行自变量，然后根据其值执行正确操作。如果现在输入：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;$ ebuild sed-3.02.ebuild&lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;就会得到一条错误消息。现在需要告诉 ebuild 做什么，如下所示：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;$ ebuild sed-3.02.ebuild unpack&lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;或&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;$ ebuild sed-3.02.ebuild compile&lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;或&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;$ ebuild sed-3.02.ebuild all&lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;如果提供上面所列之外的第二个命令行自变量，将得到一条错误消息（* 子句），然后，程序退出。&lt;/P&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD&gt;&lt;IMG height=1 alt=""         src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"&gt;&lt;BR&gt;&lt;IMG         height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8     border=0&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;  &lt;TABLE class=no-print cellSpacing=0 cellPadding=0 align=right&gt;    &lt;TBODY&gt;    &lt;TR align=right&gt;      &lt;TD&gt;&lt;IMG height=4 alt="" src="http://www.ibm.com/i/c.gif"   width="100%"&gt;&lt;BR&gt;        &lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;          &lt;TBODY&gt;          &lt;TR&gt;            &lt;TD vAlign=center&gt;&lt;IMG height=16 alt=""               src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16               border=0&gt;&lt;BR&gt;&lt;/TD&gt;            &lt;TD vAlign=top align=right&gt;&lt;A class=fbox               href="http://www.ibm.com/developerworks/cn/linux/shell/bash/bash-3/#main"&gt;&lt;B&gt;回页首&lt;/B&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;  &lt;P&gt;&lt;A name=N1017B&gt;&lt;SPAN class=atitle&gt;使代码模块化&lt;/SPAN&gt;&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;既然代码很高级并且实用，您可能很想创建几个更高级的 ebuild 脚本，以解包和编译所喜爱的程序。如果这样做，迟早会遇到一些不使用 autoconf   ("./configure") 的源代码，或者可能遇到其它使用非标准编译过程的脚本。需要再对 ebuild   系统做一些改动，以适应这些程序。但是在做之前，最好先想一下如何完成。&lt;/P&gt;  &lt;P&gt;将 "./configure --prefix=/usr; make" 硬编码到编译阶段的妙处之一是：大多数时候，它可以正确工作。但是，还必须使   ebuild 系统适应那些不使用 autoconf 或正常 make 文件的源代码。要解决这个问题，建议 ebuild 脚本缺省执行以下操作：&lt;/P&gt;  &lt;OL&gt;    &lt;LI&gt;如果在 "${SRCDIR}" 中有一个配置脚本，则按如下执行它： &lt;BR&gt;&lt;CODE&gt;./configure     --prefix=/usr&lt;/CODE&gt; &lt;BR&gt;否则，跳过这步。 &lt;/LI&gt;    &lt;LI&gt;执行以下命令： &lt;BR&gt;&lt;CODE&gt;make&lt;/CODE&gt; &lt;/LI&gt;&lt;/OL&gt;  &lt;P&gt;既然 ebuild 只在 configure 实际存在时才运行它，现在可以自动地适应那些不使用 autoconf 但有标准 make   文件的程序。但是，在简单的 "make" 对某些源代码无效时该怎么办？需要一些处理这些情况的特定代码来覆盖合理的缺省值。要做到这一点，将把   ebuild_compile() 函数转换成两个函数。第一个函数（可将其当成"父"函数）的名称仍是 ebuild_compile()。但是，将有一个名为   user_compile() 的新函数，该函数只包含合理的缺省操作：&lt;/P&gt;&lt;BR&gt;&lt;A name=N101A1&gt;&lt;B&gt;拆成两个函数的   ebuild_compile()&lt;/B&gt;&lt;/A&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;user_compile() {      #we're already in ${SRCDIR}      if [ -e configure ]      then          #run configure script if it exists          ./configure --prefix=/usr      fi      #run make      make  }            ebuild_compile() {      if [ ! -d "${SRCDIR}" ]      then          echo "${SRCDIR} does not exist -- please unpack first."          exit 1      fi      #make sure we're in the right directory        cd ${SRCDIR}      user_compile  }  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;现在这样做的原因可能还不是很明显，但是，再忍耐一下。虽然这段代码与 ebuild 前一版的工作方式几乎相同，但是现在可以做一些以前无法做的 -- 可以在   sed-3.02.ebuild 中覆盖 user_compile()。因此，如果缺省的 user_compile() 不满足要求，可以在 .ebuild   文件中定义一个新的，使其包含编译包所必需的命令。例如，这里有一个 e2fsprogs-1.18 的 ebuild 文件，它需要一个略有不同的   "./configure" 行：&lt;/P&gt;&lt;BR&gt;&lt;A name=N101AE&gt;&lt;B&gt;e2fsprogs-1.18.ebuild&lt;/B&gt;&lt;/A&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;#this ebuild file overrides the default user_compile()  P=e2fsprogs-1.18  A=${P}.tar.gz     user_compile() {         ./configure --enable-elf-shlibs         make  }  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;现在，将完全按照我们希望的方式编译 e2fsprogs。但是，对于大多数包来说，可以省略 .ebuild 文件中的任何定制 user_compile()   函数，而使用缺省的 user_compile() 函数。&lt;/P&gt;  &lt;P&gt;ebuild 脚本又怎样知道要使用哪个 user_compile() 函数呢？实际上，这很简单。ebuild 脚本中，在执行   e2fsprogs-1.18.ebuild 文件之前定义缺省 user_compile() 函数。如果在 e2fsprogs-1.18.ebuild 中有一个   user_compile()，则它覆盖前面定义的缺省版本。如果没有，则使用缺省 user_compile() 函数。&lt;/P&gt;  &lt;P&gt;这是好工具，我们已经添加了很多灵活性，而无需任何复杂代码（如果不需要的话）。在这里就不讲了，但是，还应该对 ebuild_unpack()   做类似修改，以便用户可以覆盖缺省解包过程。如果要做任何修补，或者文件包含在多个档案中，则这非常方便。还有个好主意是修改解包代码，以便它可以缺省识别由 bzip2   压缩的 tar 压缩包。&lt;/P&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD&gt;&lt;IMG height=1 alt=""         src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"&gt;&lt;BR&gt;&lt;IMG         height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8     border=0&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;  &lt;TABLE class=no-print cellSpacing=0 cellPadding=0 align=right&gt;    &lt;TBODY&gt;    &lt;TR align=right&gt;      &lt;TD&gt;&lt;IMG height=4 alt="" src="http://www.ibm.com/i/c.gif"   width="100%"&gt;&lt;BR&gt;        &lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;          &lt;TBODY&gt;          &lt;TR&gt;            &lt;TD vAlign=center&gt;&lt;IMG height=16 alt=""               src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16               border=0&gt;&lt;BR&gt;&lt;/TD&gt;            &lt;TD vAlign=top align=right&gt;&lt;A class=fbox               href="http://www.ibm.com/developerworks/cn/linux/shell/bash/bash-3/#main"&gt;&lt;B&gt;回页首&lt;/B&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;  &lt;P&gt;&lt;A name=N101C1&gt;&lt;SPAN class=atitle&gt;配置文件&lt;/SPAN&gt;&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;目前为止，已经讲了很多不方便的 bash 技术，现在再讲一个。通常，如果程序在 /etc 中有一个配置文件是很方便的。幸运的是，用 bash   做到这点很容易。只需创建以下文件，然后并其存为 /etc/ebuild.conf 即可：&lt;/P&gt;&lt;BR&gt;&lt;A   name=N101CA&gt;&lt;B&gt;/ect/ebuild.conf&lt;/B&gt;&lt;/A&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;# /etc/ebuild.conf: set system-wide ebuild options in this file  # MAKEOPTS are options passed to make  MAKEOPTS="-j2"  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;在该例中，只包括了一个配置选项，但是，您可以包括更多。bash   的一个妙处是：通过执行该文件，就可以对它进行语法分析。在大多数解释型语言中，都可以使用这个设计窍门。执行 /etc/ebuild.conf 之后，在   ebuild 脚本中定义 "$MAKEOPTS"。将利用它允许用户向 make 传递选项。通常，将使用该选项来允许用户告诉 ebuild 执行 &lt;A   href="http://www.ibm.com/developerworks/cn/linux/shell/bash/bash-3/#7"&gt;并行   make&lt;/A&gt;。 &lt;/P&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD&gt;&lt;IMG height=1 alt=""         src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"&gt;&lt;BR&gt;&lt;IMG         height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8     border=0&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;  &lt;TABLE class=no-print cellSpacing=0 cellPadding=0 align=right&gt;    &lt;TBODY&gt;    &lt;TR align=right&gt;      &lt;TD&gt;&lt;IMG height=4 alt="" src="http://www.ibm.com/i/c.gif"   width="100%"&gt;&lt;BR&gt;        &lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;          &lt;TBODY&gt;          &lt;TR&gt;            &lt;TD vAlign=center&gt;&lt;IMG height=16 alt=""               src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16               border=0&gt;&lt;BR&gt;&lt;/TD&gt;            &lt;TD vAlign=top align=right&gt;&lt;A class=fbox               href="http://www.ibm.com/developerworks/cn/linux/shell/bash/bash-3/#main"&gt;&lt;B&gt;回页首&lt;/B&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;  &lt;P&gt;&lt;A name=7&gt;&lt;SPAN class=atitle&gt;什么是并行 make？&lt;/SPAN&gt;&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;为了提高多处理器系统的编译速度，make 支持并行编译程序。这意味着，make   同时编译用户指定数目的源文件（以便使用多处理器系统中的额外处理器），而不是一次只编译一个源文件。通过向 make 传递 -j # 选项来启用并行   make，如下所示：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;make -j4 MAKE="make -j4"&lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;这行代码指示 make 同时编译四个程序。 &lt;CODE&gt;MAKE="make -j4"&lt;/CODE&gt; 自变量告诉 make，向其启动的任何子 make   进程传递 -j4 选项。 &lt;/P&gt;  &lt;P&gt;这里是 ebuild 程序的最终版本：&lt;/P&gt;&lt;BR&gt;&lt;A name=N101F2&gt;&lt;B&gt;ebuild，最终版本&lt;/B&gt;&lt;/A&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;#!/usr/bin/env bash  if [ $# -ne 2 ]  then       echo "Please specify ebuild file and unpack, compile or all"      exit 1  fi  source /etc/ebuild.conf  if [ -z "$DISTDIR" ]  then       # set DISTDIR to /usr/src/distfiles if not already set      DISTDIR=/usr/src/distfiles  fi  export DISTDIR  ebuild_unpack() {      #make sure we're in the right directory       cd ${ORIGDIR}            if [ -d ${WORKDIR} ]      then              rm -rf ${WORKDIR}      fi      mkdir ${WORKDIR}      cd ${WORKDIR}      if [ ! -e ${DISTDIR}/${A} ]      then          echo "${DISTDIR}/${A} does not exist.  Please download first."          exit 1      fi      tar xzf ${DISTDIR}/${A}      echo "Unpacked ${DISTDIR}/${A}."      #source is now correctly unpacked  }  user_compile() {      #we're already in ${SRCDIR}      if [ -e configure ]      then          #run configure script if it exists          ./configure --prefix=/usr      fi          #run make          make $MAKEOPTS MAKE="make $MAKEOPTS"    }   ebuild_compile() {      if [ ! -d "${SRCDIR}" ]      then          echo "${SRCDIR} does not exist -- please unpack first."          exit 1      fi          #make sure we're in the right directory        cd ${SRCDIR}      user_compile  }  export ORIGDIR=`pwd`  export WORKDIR=${ORIGDIR}/work  if [ -e "$1" ]  then       source $1  else      echo "Ebuild file $1 not found."      exit 1  fi  export SRCDIR=${WORKDIR}/${P}  case "${2}" in      unpack)          ebuild_unpack          ;;      compile)          ebuild_compile          ;;      all)          ebuild_unpack          ebuild_compile          ;;      *)          echo "Please specify unpack, compile or all as the second arg"          exit 1          ;;  esac  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;请注意，在文件的开始部分执行 /etc/ebuild.conf。另外，还要注意，在缺省 user_compile() 函数中使用   "$MAKEOPTS"。您可能在想，这管用吗 - 毕竟，在执行实际上事先定义 "$MAKEOPTS" 的 /etc/ebuild.conf 之前，我们引用了   "$MAKEOPTS"。对我们来说幸运的是，这没有问题，因为变量扩展只在执行 user_compile() 时才发生。在执行 user_compile()   时，已经执行了 /etc/ebuild.conf，并且 "$MAKEOPTS" 也被设置成正确的值。&lt;/P&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD&gt;&lt;IMG height=1 alt=""         src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"&gt;&lt;BR&gt;&lt;IMG         height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8     border=0&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;  &lt;TABLE class=no-print cellSpacing=0 cellPadding=0 align=right&gt;    &lt;TBODY&gt;    &lt;TR align=right&gt;      &lt;TD&gt;&lt;IMG height=4 alt="" src="http://www.ibm.com/i/c.gif"   width="100%"&gt;&lt;BR&gt;        &lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;          &lt;TBODY&gt;          &lt;TR&gt;            &lt;TD vAlign=center&gt;&lt;IMG height=16 alt=""               src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16               border=0&gt;&lt;BR&gt;&lt;/TD&gt;            &lt;TD vAlign=top align=right&gt;&lt;A class=fbox               href="http://www.ibm.com/developerworks/cn/linux/shell/bash/bash-3/#main"&gt;&lt;B&gt;回页首&lt;/B&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;  &lt;P&gt;&lt;A name=N101FF&gt;&lt;SPAN class=atitle&gt;结束语&lt;/SPAN&gt;&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;本文已经讲述了很多 bash 编程技术，但是，只触及到 bash 能力的一些皮毛。例如，Gentoo Linux ebuild   产品不仅自动解包和编译每个包，还可以：&lt;/P&gt;  &lt;UL&gt;    &lt;LI&gt;如果在 "$DISTDIR" 没找到源代码，则自动下载&lt;/LI&gt;    &lt;LI&gt;通过使用 MD5 消息摘要，验证源代码没有受到破坏&lt;/LI&gt;    &lt;LI&gt;如果请求，则将编译过的应用程序安装到正在使用的文件系统，并记录所有安装的文件，以便日后可以方便地将包卸载。&lt;/LI&gt;    &lt;LI&gt;如果请求，则将编译过的应用程序打包成 tar 压缩包（以您希望的形式压缩），以便以后可以在另一台计算机上，或者在基于 CD     的安装过程中（如果在构建发行版 CD）安装。&lt;/LI&gt;&lt;/UL&gt;  &lt;P&gt;另外，ebuild 系统产品还有几个全局配置选项，允许用户指定选项，例如在编译过程中使用什么优化标志，在那些支持它的包中是否应该缺省启用可选的包支持（例如   GNOME 和 slang）。&lt;/P&gt;  &lt;P&gt;显然，bash 可以实现的功能远比本系列文章中所触及的要多。关于这个不可思议的工具，希望您已经学到了很多，并鼓舞您使用 bash   来加快和增强开发项目。&lt;/P&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;/FONT&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5906929445033990464-1749651576909945056?l=irlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5906929445033990464&amp;postID=1749651576909945056&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/1749651576909945056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/1749651576909945056'/><link rel='alternate' type='text/html' href='http://irlab.blogspot.com/2007/11/bash-3.html' title='Bash 实例，第 3 部分'/><author><name>xlqb</name><uri>http://www.blogger.com/profile/07757898792107625243</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5906929445033990464.post-4135102481906486568</id><published>2007-11-15T15:32:00.000+08:00</published><updated>2007-11-15T15:30:45.150+08:00</updated><title type='text'>Bash 实例，第 2 部分</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;  &lt;P&gt;2000 年 4 月 01 日&lt;/P&gt;  &lt;BLOCKQUOTE&gt;在前一篇 bash 的介绍性文章中，Daniel Robbins 为您讲解了脚本语言的一些基本元素和使用 bash     的原因。在本文（即第二部分）中，Daniel 继续前一篇的内容，并讲解条件 (if-then) 语句、循环和更多的 bash   基本结构。&lt;/BLOCKQUOTE&gt;&lt;!--START RESERVED FOR FUTURE USE INCLUDE FILES--&gt;&lt;!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --&gt;&lt;!--END RESERVED FOR FUTURE USE INCLUDE FILES--&gt;  &lt;P&gt;我们先看一下处理命令行自变量的简单技巧，然后再看看 bash 基本编程结构。&lt;/P&gt;  &lt;P&gt;&lt;A name=N10058&gt;&lt;SPAN class=atitle&gt;接收自变量&lt;/SPAN&gt;&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;在 &lt;A   href="http://www.ibm.com/software/developerworks/library/bash.html"&gt;介绍性文章&lt;/A&gt;   中的样本程序中，我们使用环境变量 "$1" 来引用第一个命令行自变量。类似地，可以使用 "$2"、"$3"   等来引用传递给脚本的第二和第三个自变量。这里有一个例子： &lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt; #!/usr/bin/env bash      echo name of script is $0   echo first argument is $1   echo second argument is $2   echo seventeenth argument is $17   echo number of arguments is $#  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;除以下两个细节之外，此例无需说明。第一，"$0" 将扩展成从命令行调用的脚本名称，"$#"   将扩展成传递给脚本的自变量数目。试验以上脚本，通过传递不同类型的命令行自变量来了解其工作原理。&lt;/P&gt;  &lt;P&gt;有时需要一次引用 &lt;I&gt;所有&lt;/I&gt; 命令行自变量。针对这种用途，bash 实现了变量 "$@"，它扩展成所有用空格分开的命令行参数。在本文稍后的   "for" 循环部分中，您将看到使用该变量的例子。 &lt;/P&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD&gt;&lt;IMG height=1 alt=""         src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"&gt;&lt;BR&gt;&lt;IMG         height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8     border=0&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;  &lt;TABLE class=no-print cellSpacing=0 cellPadding=0 align=right&gt;    &lt;TBODY&gt;    &lt;TR align=right&gt;      &lt;TD&gt;&lt;IMG height=4 alt="" src="http://www.ibm.com/i/c.gif"   width="100%"&gt;&lt;BR&gt;        &lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;          &lt;TBODY&gt;          &lt;TR&gt;            &lt;TD vAlign=center&gt;&lt;IMG height=16 alt=""               src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16               border=0&gt;&lt;BR&gt;&lt;/TD&gt;            &lt;TD vAlign=top align=right&gt;&lt;A class=fbox               href="http://www.ibm.com/developerworks/cn/linux/shell/bash/bash-2/#main"&gt;&lt;B&gt;回页首&lt;/B&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;  &lt;P&gt;&lt;A name=N10072&gt;&lt;SPAN class=atitle&gt;Bash 编程结构&lt;/SPAN&gt;&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;如果您曾用过如 C、Pascal、Python 或 Perl 那样的过程语言编程，则一定熟悉 "if" 语句和 "for"   循环那样的标准编程结构。对于这些标准结构的大多数，Bash 有自己的版本。在下几节中，将介绍几种 bash   结构，并演示这些结构和您已经熟悉的其它编程语言中结构的差异。如果以前编程不多，也不必担心。我提供了足够的信息和示例，使您可以跟上本文的进度。&lt;/P&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD&gt;&lt;IMG height=1 alt=""         src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"&gt;&lt;BR&gt;&lt;IMG         height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8     border=0&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;  &lt;TABLE class=no-print cellSpacing=0 cellPadding=0 align=right&gt;    &lt;TBODY&gt;    &lt;TR align=right&gt;      &lt;TD&gt;&lt;IMG height=4 alt="" src="http://www.ibm.com/i/c.gif"   width="100%"&gt;&lt;BR&gt;        &lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;          &lt;TBODY&gt;          &lt;TR&gt;            &lt;TD vAlign=center&gt;&lt;IMG height=16 alt=""               src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16               border=0&gt;&lt;BR&gt;&lt;/TD&gt;            &lt;TD vAlign=top align=right&gt;&lt;A class=fbox               href="http://www.ibm.com/developerworks/cn/linux/shell/bash/bash-2/#main"&gt;&lt;B&gt;回页首&lt;/B&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;  &lt;P&gt;&lt;A name=N1007B&gt;&lt;SPAN class=atitle&gt;方便的条件语句&lt;/SPAN&gt;&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;如果您曾用 C 编写过与文件相关的代码，则应该知道：要比较特定文件是否比另一个文件新需要大量工作。那是因为 C   没有任何内置语法来进行这种比较，必须使用两个 stat() 调用和两个 stat 结构来进行手工比较。相反，bash   内置了标准文件比较运算符，因此，确定"/tmp/myfile 是否可读"与查看"$myvar 是否大于 4"一样容易。&lt;/P&gt;  &lt;P&gt;下表列出最常用的 bash 比较运算符。同时还有如何正确使用每一选项的示例。示例要跟在 "if" 之后。例如：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt; if [ -z "$myvar" ]  then       echo "myvar is not defined"  fi  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=3 border=0&gt;    &lt;TBODY&gt;    &lt;TR vAlign=top bgColor=#0033cc&gt;      &lt;TD&gt;&lt;B&gt;运算符&lt;/B&gt; &lt;/TD&gt;      &lt;TD&gt;&lt;B&gt;描述&lt;/B&gt; &lt;/TD&gt;      &lt;TD&gt;&lt;B&gt;示例&lt;/B&gt; &lt;/TD&gt;&lt;/TR&gt;    &lt;TR vAlign=top bgColor=#888888&gt;      &lt;TD colSpan=3&gt;&lt;B&gt;文件比较运算符 &lt;/B&gt;&lt;/TD&gt;&lt;/TR&gt;    &lt;TR vAlign=top bgColor=#eeeeee&gt;      &lt;TD&gt;-e &lt;I&gt;filename&lt;/I&gt; &lt;/TD&gt;      &lt;TD&gt;如果 &lt;I&gt;filename&lt;/I&gt;存在，则为真 &lt;/TD&gt;      &lt;TD&gt;[ -e /var/log/syslog ]&lt;/TD&gt;&lt;/TR&gt;    &lt;TR vAlign=top bgColor=#eeeeee&gt;      &lt;TD&gt;-d &lt;I&gt;filename&lt;/I&gt; &lt;/TD&gt;      &lt;TD&gt;如果 &lt;I&gt;filename&lt;/I&gt;为目录，则为真 &lt;/TD&gt;      &lt;TD&gt;[ -d /tmp/mydir ]&lt;/TD&gt;&lt;/TR&gt;    &lt;TR vAlign=top bgColor=#eeeeee&gt;      &lt;TD&gt;-f &lt;I&gt;filename&lt;/I&gt; &lt;/TD&gt;      &lt;TD&gt;如果 &lt;I&gt;filename&lt;/I&gt;为常规文件，则为真 &lt;/TD&gt;      &lt;TD&gt;[ -f /usr/bin/grep ]&lt;/TD&gt;&lt;/TR&gt;    &lt;TR vAlign=top bgColor=#eeeeee&gt;      &lt;TD&gt;-L &lt;I&gt;filename&lt;/I&gt; &lt;/TD&gt;      &lt;TD&gt;如果 &lt;I&gt;filename&lt;/I&gt;为符号链接，则为真 &lt;/TD&gt;      &lt;TD&gt;[ -L /usr/bin/grep ]&lt;/TD&gt;&lt;/TR&gt;    &lt;TR vAlign=top bgColor=#eeeeee&gt;      &lt;TD&gt;-r &lt;I&gt;filename&lt;/I&gt; &lt;/TD&gt;      &lt;TD&gt;如果 &lt;I&gt;filename&lt;/I&gt;可读，则为真 &lt;/TD&gt;      &lt;TD&gt;[ -r /var/log/syslog ]&lt;/TD&gt;&lt;/TR&gt;    &lt;TR vAlign=top bgColor=#eeeeee&gt;      &lt;TD&gt;-w &lt;I&gt;filename&lt;/I&gt; &lt;/TD&gt;      &lt;TD&gt;如果 &lt;I&gt;filename&lt;/I&gt;可写，则为真 &lt;/TD&gt;      &lt;TD&gt;[ -w /var/mytmp.txt ]&lt;/TD&gt;&lt;/TR&gt;    &lt;TR vAlign=top bgColor=#eeeeee&gt;      &lt;TD&gt;-x &lt;I&gt;filename&lt;/I&gt; &lt;/TD&gt;      &lt;TD&gt;如果 &lt;I&gt;filename&lt;/I&gt;可执行，则为真 &lt;/TD&gt;      &lt;TD&gt;[ -L /usr/bin/grep ]&lt;/TD&gt;&lt;/TR&gt;    &lt;TR vAlign=top bgColor=#eeeeee&gt;      &lt;TD&gt;&lt;I&gt;filename1&lt;/I&gt;-nt &lt;I&gt;filename2&lt;/I&gt; &lt;/TD&gt;      &lt;TD&gt;如果 &lt;I&gt;filename1&lt;/I&gt;比 &lt;I&gt;filename2&lt;/I&gt;新，则为真 &lt;/TD&gt;      &lt;TD&gt;[ /tmp/install/etc/services -nt /etc/services ]&lt;/TD&gt;&lt;/TR&gt;    &lt;TR vAlign=top bgColor=#eeeeee&gt;      &lt;TD&gt;&lt;I&gt;filename1&lt;/I&gt;-ot &lt;I&gt;filename2&lt;/I&gt; &lt;/TD&gt;      &lt;TD&gt;如果 &lt;I&gt;filename1&lt;/I&gt;比 &lt;I&gt;filename2&lt;/I&gt;旧，则为真 &lt;/TD&gt;      &lt;TD&gt;[ /boot/bzImage -ot arch/i386/boot/bzImage ]&lt;/TD&gt;&lt;/TR&gt;    &lt;TR vAlign=top bgColor=#888888&gt;      &lt;TD colSpan=3&gt;&lt;B&gt;字符串比较运算符 &lt;/B&gt;（请注意引号的使用，这是防止空格扰乱代码的好方法） &lt;/TD&gt;&lt;/TR&gt;    &lt;TR vAlign=top bgColor=#eeeeee&gt;      &lt;TD&gt;-z &lt;I&gt;string&lt;/I&gt; &lt;/TD&gt;      &lt;TD&gt;如果 &lt;I&gt;string&lt;/I&gt;长度为零，则为真 &lt;/TD&gt;      &lt;TD&gt;[ -z "$myvar" ]&lt;/TD&gt;&lt;/TR&gt;    &lt;TR vAlign=top bgColor=#eeeeee&gt;      &lt;TD&gt;-n &lt;I&gt;string&lt;/I&gt; &lt;/TD&gt;      &lt;TD&gt;如果 &lt;I&gt;string&lt;/I&gt;长度非零，则为真 &lt;/TD&gt;      &lt;TD&gt;[ -n "$myvar" ]&lt;/TD&gt;&lt;/TR&gt;    &lt;TR vAlign=top bgColor=#eeeeee&gt;      &lt;TD&gt;&lt;I&gt;string1&lt;/I&gt;= &lt;I&gt;string2&lt;/I&gt; &lt;/TD&gt;      &lt;TD&gt;如果 &lt;I&gt;string1&lt;/I&gt;与 &lt;I&gt;string2&lt;/I&gt;相同，则为真 &lt;/TD&gt;      &lt;TD&gt;[ "$myvar" = "one two three" ]&lt;/TD&gt;&lt;/TR&gt;    &lt;TR vAlign=top bgColor=#eeeeee&gt;      &lt;TD&gt;&lt;I&gt;string1&lt;/I&gt;!= &lt;I&gt;string2&lt;/I&gt; &lt;/TD&gt;      &lt;TD&gt;如果 &lt;I&gt;string1&lt;/I&gt;与 &lt;I&gt;string2&lt;/I&gt;不同，则为真 &lt;/TD&gt;      &lt;TD&gt;[ "$myvar" != "one two three" ]&lt;/TD&gt;&lt;/TR&gt;    &lt;TR vAlign=top bgColor=#888888&gt;      &lt;TD colSpan=3&gt;&lt;B&gt;算术比较运算符 &lt;/B&gt;&lt;/TD&gt;&lt;/TR&gt;    &lt;TR vAlign=top bgColor=#eeeeee&gt;      &lt;TD&gt;&lt;I&gt;num1&lt;/I&gt;-eq &lt;I&gt;num2&lt;/I&gt; &lt;/TD&gt;      &lt;TD&gt;等于&lt;/TD&gt;      &lt;TD&gt;[ 3 -eq $mynum ]&lt;/TD&gt;&lt;/TR&gt;    &lt;TR vAlign=top bgColor=#eeeeee&gt;      &lt;TD&gt;&lt;I&gt;num1&lt;/I&gt;-ne &lt;I&gt;num2&lt;/I&gt; &lt;/TD&gt;      &lt;TD&gt;不等于&lt;/TD&gt;      &lt;TD&gt;[ 3 -ne $mynum ]&lt;/TD&gt;&lt;/TR&gt;    &lt;TR vAlign=top bgColor=#eeeeee&gt;      &lt;TD&gt;&lt;I&gt;num1&lt;/I&gt;-lt &lt;I&gt;num2&lt;/I&gt; &lt;/TD&gt;      &lt;TD&gt;小于&lt;/TD&gt;      &lt;TD&gt;[ 3 -lt $mynum ]&lt;/TD&gt;&lt;/TR&gt;    &lt;TR vAlign=top bgColor=#eeeeee&gt;      &lt;TD&gt;&lt;I&gt;num1&lt;/I&gt;-le &lt;I&gt;num2&lt;/I&gt; &lt;/TD&gt;      &lt;TD&gt;小于或等于&lt;/TD&gt;      &lt;TD&gt;[ 3 -le $mynum ]&lt;/TD&gt;&lt;/TR&gt;    &lt;TR vAlign=top bgColor=#eeeeee&gt;      &lt;TD&gt;&lt;I&gt;num1&lt;/I&gt;-gt &lt;I&gt;num2&lt;/I&gt; &lt;/TD&gt;      &lt;TD&gt;大于&lt;/TD&gt;      &lt;TD&gt;[ 3 -gt $mynum ]&lt;/TD&gt;&lt;/TR&gt;    &lt;TR vAlign=top bgColor=#eeeeee&gt;      &lt;TD&gt;&lt;I&gt;num1&lt;/I&gt;-ge &lt;I&gt;num2&lt;/I&gt; &lt;/TD&gt;      &lt;TD&gt;大于或等于&lt;/TD&gt;      &lt;TD&gt;[ 3 -ge $mynum ]&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;  &lt;P&gt;有时，有几种不同方法来进行特定比较。例如，以下两个代码段的功能相同：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt; if [ "$myvar" -eq 3 ]  then        echo "myvar equals 3"  fi         if [ "$myvar" = "3" ]  then        echo "myvar equals 3"  fi  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;上面两个比较执行相同的功能，但是第一个使用算术比较运算符，而第二个使用字符串比较运算符。&lt;/P&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD&gt;&lt;IMG height=1 alt=""         src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"&gt;&lt;BR&gt;&lt;IMG         height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8     border=0&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;  &lt;TABLE class=no-print cellSpacing=0 cellPadding=0 align=right&gt;    &lt;TBODY&gt;    &lt;TR align=right&gt;      &lt;TD&gt;&lt;IMG height=4 alt="" src="http://www.ibm.com/i/c.gif"   width="100%"&gt;&lt;BR&gt;        &lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;          &lt;TBODY&gt;          &lt;TR&gt;            &lt;TD vAlign=center&gt;&lt;IMG height=16 alt=""               src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16               border=0&gt;&lt;BR&gt;&lt;/TD&gt;            &lt;TD vAlign=top align=right&gt;&lt;A class=fbox               href="http://www.ibm.com/developerworks/cn/linux/shell/bash/bash-2/#main"&gt;&lt;B&gt;回页首&lt;/B&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;  &lt;P&gt;&lt;A name=N10278&gt;&lt;SPAN class=atitle&gt;字符串比较说明&lt;/SPAN&gt;&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;大多数时候，虽然可以不使用括起字符串和字符串变量的双引号，但这并不是好主意。为什么呢？因为如果环境变量中恰巧有一个空格或制表键，bash   将无法分辨，从而无法正常工作。这里有一个错误的比较示例：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt; if [ $myvar = "foo bar oni" ]  then        echo "yes"  fi  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;在上例中，如果 myvar 等于 "foo"，则代码将按预想工作，不进行打印。但是，如果 myvar 等于 "foo bar   oni"，则代码将因以下错误失败：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt; [: too many arguments  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;在这种情况下，"$myvar"（等于 "foo bar oni"）中的空格迷惑了 bash。bash 扩展 "$myvar" 之后，代码如下：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt; [ foo bar oni = "foo bar oni" ]  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;因为环境变量没放在双引号中，所以 bash   认为方括号中的自变量过多。可以用双引号将字符串自变量括起来消除该问题。请记住，如果养成将所有字符串自变量用双引号括起的习惯，将除去很多类似的编程错误。"foo   bar oni" 比较 &lt;I&gt;应该&lt;/I&gt;写成： &lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt; if [ "$myvar" = "foo bar oni" ]  then        echo "yes"  fi  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="40%" align=right border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD width=10&gt;&lt;IMG height=1 alt="" src="http://www.ibm.com/i/c.gif"         width=10&gt;&lt;/TD&gt;      &lt;TD&gt;        &lt;TABLE cellSpacing=0 cellPadding=5 width="100%" border=1&gt;          &lt;TBODY&gt;          &lt;TR&gt;            &lt;TD bgColor=#eeeeee&gt;&lt;A name=N1029F&gt;&lt;B&gt;更多引用细节&lt;/B&gt;&lt;/A&gt;&lt;BR&gt;              &lt;P&gt;如果要扩展环境变量，则必须将它们用 &lt;I&gt;双引号&lt;/I&gt;、而不是单引号括起。单引号 &lt;I&gt;禁用&lt;/I&gt; 变量（和历史）扩展。               &lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;  &lt;P&gt;以上代码将按预想工作，而不会有任何令人不快的意外出现。&lt;/P&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD&gt;&lt;IMG height=1 alt=""         src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"&gt;&lt;BR&gt;&lt;IMG         height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8     border=0&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;  &lt;TABLE class=no-print cellSpacing=0 cellPadding=0 align=right&gt;    &lt;TBODY&gt;    &lt;TR align=right&gt;      &lt;TD&gt;&lt;IMG height=4 alt="" src="http://www.ibm.com/i/c.gif"   width="100%"&gt;&lt;BR&gt;        &lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;          &lt;TBODY&gt;          &lt;TR&gt;            &lt;TD vAlign=center&gt;&lt;IMG height=16 alt=""               src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16               border=0&gt;&lt;BR&gt;&lt;/TD&gt;            &lt;TD vAlign=top align=right&gt;&lt;A class=fbox               href="http://www.ibm.com/developerworks/cn/linux/shell/bash/bash-2/#main"&gt;&lt;B&gt;回页首&lt;/B&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;  &lt;P&gt;&lt;A name=N102B2&gt;&lt;SPAN class=atitle&gt;循环结构："for"&lt;/SPAN&gt;&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;好了，已经讲了条件语句，下面该探索 bash 循环结构了。我们将从标准的 "for" 循环开始。这里有一个简单的例子：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;    #!/usr/bin/env bash      for x in one two three four   do       echo number $x   done                输出：      number one   number two    number three    number four        &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;发生了什么？"for" 循环中的 "for x" 部分定义了一个名为 "$x" 的新环境变量（也称为循环控制变量），它的值被依次设置为   "one"、"two"、"three" 和 "four"。每一次赋值之后，执行一次循环体（"do" 和 "done"   之间的代码）。在循环体内，象其它环境变量一样，使用标准的变量扩展语法来引用循环控制变量 "$x"。还要注意，"for" 循环总是接收 "in"   语句之后的某种类型的字列表。在本例中，指定了四个英语单词，但是字列表也可以引用磁盘上的文件，甚至文件通配符。看看下面的例子，该例演示如何使用标准 shell   通配符：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt; #!/usr/bin/env bash      for myfile in /etc/r*   do       if [ -d "$myfile" ]   then          echo "$myfile (dir)"  else         echo "$myfile"  fi   done                输出：      /etc/rc.d (dir)   /etc/resolv.conf   /etc/resolv.conf~   /etc/rpc                          &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;以上代码列出在 /etc 中每个以 "r" 开头的文件。要做到这点，bash 在执行循环之前首先取得通配符 /etc/r*，然后扩展它，用字符串   /etc/rc.d /etc/resolv.conf /etc/resolv.conf~ /etc/rpc 替换。一旦进入循环，根据 myfile   是否为目录，"-d" 条件运算符用来执行两个不同操作。如果是目录，则将 "(dir)" 附加到输出行。&lt;/P&gt;  &lt;P&gt;还可以在字列表中使用多个通配符、甚至是环境变量：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;    for x in /etc/r--? /var/lo* /home/drobbins/mystuff/* /tmp/${MYPATH}/*   do       cp $x /mnt/mydir   done  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;Bash 将在所有正确位置上执行通配符和环境变量扩展，并可能创建一个非常长的字列表。&lt;/P&gt;  &lt;P&gt;虽然所有通配符扩展示例使用了 &lt;I&gt;绝对&lt;/I&gt;路径，但也可以使用相对路径，如下所示： &lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;    for x in ../* mystuff/*   do       echo $x is a silly file   done  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;在上例中，bash 相对于当前工作目录执行通配符扩展，就象在命令行中使用相对路径一样。研究一下通配符扩展。您将注意到，如果在通配符中使用绝对路径，bash   将通配符扩展成一个绝对路径列表。否则，bash 将在后面的字列表中使用相对路径。如果只引用当前工作目录中的文件（例如，如果输入 "for x in   *"），则产生的文件列表将没有路径信息的前缀。请记住，可以使用 "basename" 可执行程序来除去前面的路径信息，如下所示：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;    for x in /var/log/*   do       echo `basename $x` is a file living in /var/log   done  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;当然，在脚本的命令行自变量上执行循环通常很方便。这里有一个如何使用本文开始提到的 "$@" 变量的例子：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;    #!/usr/bin/env bash      for thing in "$@"   do       echo you typed ${thing}.   done                输出：      $ allargs hello there you silly   you typed hello.   you typed there.   you typed you.   you typed silly.        &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD&gt;&lt;IMG height=1 alt=""         src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"&gt;&lt;BR&gt;&lt;IMG         height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8     border=0&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;  &lt;TABLE class=no-print cellSpacing=0 cellPadding=0 align=right&gt;    &lt;TBODY&gt;    &lt;TR align=right&gt;      &lt;TD&gt;&lt;IMG height=4 alt="" src="http://www.ibm.com/i/c.gif"   width="100%"&gt;&lt;BR&gt;        &lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;          &lt;TBODY&gt;          &lt;TR&gt;            &lt;TD vAlign=center&gt;&lt;IMG height=16 alt=""               src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16               border=0&gt;&lt;BR&gt;&lt;/TD&gt;            &lt;TD vAlign=top align=right&gt;&lt;A class=fbox               href="http://www.ibm.com/developerworks/cn/linux/shell/bash/bash-2/#main"&gt;&lt;B&gt;回页首&lt;/B&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;  &lt;P&gt;&lt;A name=N102F7&gt;&lt;SPAN class=atitle&gt;Shell 算术&lt;/SPAN&gt;&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;在学习另一类型的循环结构之前，最好先熟悉如何执行 shell 算术。是的，确实如此：可以使用 shell   结构来执行简单的整数运算。只需将特定的算术表达式用 "$((" 和 "))" 括起，bash 就可以计算表达式。这里有一些例子：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt; $ echo $(( 100 / 3 ))   33   $ myvar="56"   $ echo $(( $myvar + 12 ))   68   $ echo $(( $myvar - $myvar ))  0 $ myvar=$(( $myvar + 1 ))  $ echo $myvar   57  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD&gt;&lt;IMG height=1 alt=""         src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"&gt;&lt;BR&gt;&lt;IMG         height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8     border=0&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;  &lt;TABLE class=no-print cellSpacing=0 cellPadding=0 align=right&gt;    &lt;TBODY&gt;    &lt;TR align=right&gt;      &lt;TD&gt;&lt;IMG height=4 alt="" src="http://www.ibm.com/i/c.gif"   width="100%"&gt;&lt;BR&gt;        &lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;          &lt;TBODY&gt;          &lt;TR&gt;            &lt;TD vAlign=center&gt;&lt;IMG height=16 alt=""               src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16               border=0&gt;&lt;BR&gt;&lt;/TD&gt;            &lt;TD vAlign=top align=right&gt;&lt;A class=fbox               href="http://www.ibm.com/developerworks/cn/linux/shell/bash/bash-2/#main"&gt;&lt;B&gt;回页首&lt;/B&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;  &lt;P&gt;&lt;A name=N10304&gt;&lt;SPAN class=atitle&gt;更多的循环结构："while" 和 "until"&lt;/SPAN&gt;&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;只要特定条件为真，"while" 语句就会执行，其格式如下：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt; while [ condition ]   do       statements   done  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;通常使用 "While" 语句来循环一定次数，比如，下例将循环 10 次：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt; myvar=0   while [ $myvar -ne 10 ]   do       echo $myvar       myvar=$(( $myvar + 1 ))   done  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;可以看到，上例使用了算术表达式来使条件最终为假，并导致循环终止。&lt;/P&gt;  &lt;P&gt;"Until" 语句提供了与 "while" 语句相反的功能：只要特定条件为 &lt;I&gt;假&lt;/I&gt; ，它们就重复。下面是一个与前面的 "while"   循环具有同等功能的 "until" 循环： &lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt; myvar=0   until [ $myvar -eq 10 ]   do       echo $myvar       myvar=$(( $myvar + 1 ))   done  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD&gt;&lt;IMG height=1 alt=""         src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"&gt;&lt;BR&gt;&lt;IMG         height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8     border=0&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;  &lt;TABLE class=no-print cellSpacing=0 cellPadding=0 align=right&gt;    &lt;TBODY&gt;    &lt;TR align=right&gt;      &lt;TD&gt;&lt;IMG height=4 alt="" src="http://www.ibm.com/i/c.gif"   width="100%"&gt;&lt;BR&gt;        &lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;          &lt;TBODY&gt;          &lt;TR&gt;            &lt;TD vAlign=center&gt;&lt;IMG height=16 alt=""               src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16               border=0&gt;&lt;BR&gt;&lt;/TD&gt;            &lt;TD vAlign=top align=right&gt;&lt;A class=fbox               href="http://www.ibm.com/developerworks/cn/linux/shell/bash/bash-2/#main"&gt;&lt;B&gt;回页首&lt;/B&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;  &lt;P&gt;&lt;A name=N10325&gt;&lt;SPAN class=atitle&gt;Case 语句&lt;/SPAN&gt;&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;Case 语句是另一种便利的条件结构。这里有一个示例片段：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;    case "${x##*.}" in        gz)              gzunpack ${SROOT}/${x}              ;;        bz2)              bz2unpack ${SROOT}/${x}              ;;        *)              echo "Archive format not recognized."              exit              ;;   esac                                        &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;在上例中，bash 首先扩展 "${x##*.}"。在代码中，"$x" 是文件的名称，"${x##.*}"   除去文件中最后句点后文本之外的所有文本。然后，bash 将产生的字符串与 ")" 左边列出的值做比较。在本例中，"${x##.*}" 先与 "gz"   比较，然后是 "bz2"，最后是 "*"。如果 "${x##.*}" 与这些字符串或模式中的任何一个匹配，则执行紧接 ")" 之后的行，直到 ";;"   为止，然后 bash 继续执行结束符 "esac"   之后的行。如果不匹配任何模式或字符串，则不执行任何代码行，在这个特殊的代码片段中，至少要执行一个代码块，因为任何不与 "gz" 或 "bz2"   匹配的字符串都将与 "*" 模式匹配。&lt;/P&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD&gt;&lt;IMG height=1 alt=""         src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"&gt;&lt;BR&gt;&lt;IMG         height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8     border=0&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;  &lt;TABLE class=no-print cellSpacing=0 cellPadding=0 align=right&gt;    &lt;TBODY&gt;    &lt;TR align=right&gt;      &lt;TD&gt;&lt;IMG height=4 alt="" src="http://www.ibm.com/i/c.gif"   width="100%"&gt;&lt;BR&gt;        &lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;          &lt;TBODY&gt;          &lt;TR&gt;            &lt;TD vAlign=center&gt;&lt;IMG height=16 alt=""               src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16               border=0&gt;&lt;BR&gt;&lt;/TD&gt;            &lt;TD vAlign=top align=right&gt;&lt;A class=fbox               href="http://www.ibm.com/developerworks/cn/linux/shell/bash/bash-2/#main"&gt;&lt;B&gt;回页首&lt;/B&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;  &lt;P&gt;&lt;A name=N10335&gt;&lt;SPAN class=atitle&gt;函数与名称空间&lt;/SPAN&gt;&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;在 bash 中，甚至可以定义与其它过程语言（如 Pascal 和 C）类似的函数。在 bash   中，函数甚至可以使用与脚本接收命令行自变量类似的方式来接收自变量。让我们看一下样本函数定义，然后再从那里继续：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;    tarview() {       echo -n "Displaying contents of $1 "       if [ ${1##*.} = tar ]  then            echo "(uncompressed tar)"           tar tvf $1       elif [ ${1##*.} = gz ]  then            echo "(gzip-compressed tar)"           tar tzvf $1       elif [ ${1##*.} = bz2 ]  then            echo "(bzip2-compressed tar)"           cat $1 | bzip2 -d | tar tvf -  fi   }  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="40%" align=right border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD width=10&gt;&lt;IMG height=1 alt="" src="http://www.ibm.com/i/c.gif"         width=10&gt;&lt;/TD&gt;      &lt;TD&gt;        &lt;TABLE cellSpacing=0 cellPadding=5 width="100%" border=1&gt;          &lt;TBODY&gt;          &lt;TR&gt;            &lt;TD bgColor=#eeeeee&gt;&lt;A name=N10344&gt;&lt;B&gt;另一种情况&lt;/B&gt;&lt;/A&gt;&lt;BR&gt;              &lt;P&gt;可以使用 "case" 语句来编写上面的代码。您知道如何编写吗？     &lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;  &lt;P&gt;我们在上面定义了一个名为 "tarview" 的函数，它接收一个自变量，即某种类型的 tar 文件。在执行该函数时，它确定自变量是哪种 tar   文件类型（未压缩的、gzip 压缩的或 bzip2 压缩的），打印一行信息性消息，然后显示 tar   文件的内容。应该如下调用上面的函数（在输入、粘贴或找到该函数后，从脚本或命令行调用它）：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt; $ tarview shorten.tar.gz   Displaying contents of shorten.tar.gz (gzip-compressed tar)   drwxr-xr-x ajr/abbot         0 1999-02-27 16:17 shorten-2.3a/   -rw-r--r-- ajr/abbot      1143 1997-09-04 04:06 shorten-2.3a/Makefile   -rw-r--r-- ajr/abbot      1199 1996-02-04 12:24 shorten-2.3a/INSTALL   -rw-r--r-- ajr/abbot       839 1996-05-29 00:19 shorten-2.3a/LICENSE   ....    &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="40%" align=right border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD width=10&gt;&lt;IMG height=1 alt="" src="http://www.ibm.com/i/c.gif"         width=10&gt;&lt;/TD&gt;      &lt;TD&gt;        &lt;TABLE cellSpacing=0 cellPadding=5 width="100%" border=1&gt;          &lt;TBODY&gt;          &lt;TR&gt;            &lt;TD bgColor=#eeeeee&gt;&lt;A name=N10357&gt;&lt;B&gt;交互地使用它们&lt;/B&gt;&lt;/A&gt;&lt;BR&gt;              &lt;P&gt;别忘了，可以将函数（如上面的函数）放在 ~/.bashrc 或 ~/.bash_profile 中，以便在 bash               中随时使用它们。 &lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;  &lt;P&gt;如您所见，可以使用与引用命令行自变量同样的机制来在函数定义内部引用自变量。另外，将把 "$#" 宏扩展成包含自变量的数目。唯一可能不完全相同的是变量   "$0"，它将扩展成字符串 "bash"（如果从 shell 交互运行函数）或调用函数的脚本名称。&lt;/P&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD&gt;&lt;IMG height=1 alt=""         src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"&gt;&lt;BR&gt;&lt;IMG         height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8     border=0&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;  &lt;TABLE class=no-print cellSpacing=0 cellPadding=0 align=right&gt;    &lt;TBODY&gt;    &lt;TR align=right&gt;      &lt;TD&gt;&lt;IMG height=4 alt="" src="http://www.ibm.com/i/c.gif"   width="100%"&gt;&lt;BR&gt;        &lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;          &lt;TBODY&gt;          &lt;TR&gt;            &lt;TD vAlign=center&gt;&lt;IMG height=16 alt=""               src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16               border=0&gt;&lt;BR&gt;&lt;/TD&gt;            &lt;TD vAlign=top align=right&gt;&lt;A class=fbox               href="http://www.ibm.com/developerworks/cn/linux/shell/bash/bash-2/#main"&gt;&lt;B&gt;回页首&lt;/B&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;  &lt;P&gt;&lt;A name=N10364&gt;&lt;SPAN class=atitle&gt;名称空间&lt;/SPAN&gt;&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;经常需要在函数中创建环境变量。虽然有可能，但是还有一个技术细节应该了解。在大多数编译语言（如   C）中，当在函数内部创建变量时，变量被放置在单独的局部名称空间中。因此，如果在 C 中定义一个名为 myfunction 的函数，并在该函数中定义一个名为   "x" 的自变量，则任何名为 "x" 的全局变量（函数之外的变量）将不受它的印象，从而消除了负作用。&lt;/P&gt;  &lt;P&gt;在 C 中是这样，但在 bash 中却不是。在 bash 中，每当在函数内部创建环境变量，就将其添加到   &lt;I&gt;全局&lt;/I&gt;名称空间。这意味着，该变量将重写函数之外的全局变量，并在函数退出之后继续存在： &lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt; #!/usr/bin/env bash      myvar="hello"      myfunc() {          myvar="one two three"       for x in $myvar       do           echo $x       done   }      myfunc      echo $myvar $x  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;运行此脚本时，它将输出 "one two three three"，这显示了在函数中定义的 "$myvar" 如何影响全局变量   "$myvar"，以及循环控制变量 "$x" 如何在函数退出之后继续存在（如果 "$x" 全局变量存在，也将受到影响）。&lt;/P&gt;  &lt;P&gt;在这个简单的例子中，很容易找到该错误，并通过使用其它变量名来改正错误。但这不是正确的方法，解决此问题的最好方法是通过使用 "local"   命令，在一开始就预防影响全局变量的可能性。当使用 "local" 在函数内部创建变量时，将把它们放在   &lt;I&gt;局部&lt;/I&gt;名称空间中，并且不会影响任何全局变量。这里演示了如何实现上述代码，以便不重写全局变量： &lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;    #!/usr/bin/env bash      myvar="hello"      myfunc() {       local x       local myvar="one two three"       for x in $myvar       do           echo $x       done   }      myfunc      echo $myvar $x  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;此函数将输出 "hello" -- 不重写全局变量 "$myvar"，"$x" 在 myfunc   之外不继续存在。在函数的第一行，我们创建了以后要使用的局部变量 x，而在第二个例子 (local myvar="one two three"")   中，我们创建了局部变量 myvar， &lt;I&gt;同时&lt;/I&gt; 为其赋值。在将循环控制变量定义为局部变量时，使用第一种形式很方便，因为不允许说："for local   x in $myvar"。此函数不影响任何全局变量，鼓励您用这种方式设计所有的函数。只有在明确希望要修改全局变量时，才 &lt;I&gt;不&lt;/I&gt;应该使用   "local"。 &lt;/P&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;/FONT&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5906929445033990464-4135102481906486568?l=irlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5906929445033990464&amp;postID=4135102481906486568&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/4135102481906486568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/4135102481906486568'/><link rel='alternate' type='text/html' href='http://irlab.blogspot.com/2007/11/bash-2.html' title='Bash 实例，第 2 部分'/><author><name>xlqb</name><uri>http://www.blogger.com/profile/07757898792107625243</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5906929445033990464.post-5843178376571540662</id><published>2007-11-15T15:31:00.000+08:00</published><updated>2007-11-15T15:29:18.407+08:00</updated><title type='text'>Bash 实例，第一部分</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Verdana&gt;&lt;FONT color=#c0c0c0&gt;&lt;FONT size=2&gt;  &lt;P&gt;2000 年 3 月 01 日&lt;/P&gt;  &lt;BLOCKQUOTE&gt;通过学习如何使用 bash 脚本语言编程，将使 Linux 的日常交互更有趣和有生产力，同时还可以利用那些已熟悉和喜爱的标准     UNIX 概念（如管道和重定向）。在此三部分系列中，Daniel Robbins 将以示例指导您如何用 bash     编程。他将讲述非常基本的知识（这使此系列十分适合初学者），并在后续系列中逐步引入更高级特性。&lt;/BLOCKQUOTE&gt;&lt;!--START RESERVED FOR FUTURE USE INCLUDE FILES--&gt;&lt;!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --&gt;&lt;!--END RESERVED FOR FUTURE USE INCLUDE FILES--&gt;  &lt;P&gt;您可能要问：为什么要学习 Bash 编程？好，以下是几条令人信服的理由：&lt;/P&gt;  &lt;P&gt;&lt;A name=N10054&gt;&lt;SPAN class=atitle&gt;已经在运行它&lt;/SPAN&gt;&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;如果查看一下，可能会发现：您现在正在运行 bash。因为 bash 是标准 Linux shell，并用于各种目的，所以，即使更改了缺省   shell，bash 可能 &lt;I&gt;仍&lt;/I&gt; 在系统中某处运行。因为 bash 已在运行，以后运行的任何 bash   脚本都天生是有效利用内存的，因为它们与任何已运行的 bash 进程共享内存。如果正在运行的工具可以胜任工作，并且做得很好，为什么还要装入一个 500K   的解释器？ &lt;/P&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD&gt;&lt;IMG height=1 alt=""         src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"&gt;&lt;BR&gt;&lt;IMG         height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8     border=0&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;  &lt;TABLE class=no-print cellSpacing=0 cellPadding=0 align=right&gt;    &lt;TBODY&gt;    &lt;TR align=right&gt;      &lt;TD&gt;&lt;IMG height=4 alt="" src="http://www.ibm.com/i/c.gif"   width="100%"&gt;&lt;BR&gt;        &lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;          &lt;TBODY&gt;          &lt;TR&gt;            &lt;TD vAlign=center&gt;&lt;IMG height=16 alt=""               src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16               border=0&gt;&lt;BR&gt;&lt;/TD&gt;            &lt;TD vAlign=top align=right&gt;&lt;A class=fbox               href="http://www.ibm.com/developerworks/cn/linux/shell/bash/bash-1/#main"&gt;&lt;B&gt;回页首&lt;/B&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;  &lt;P&gt;&lt;A name=N10060&gt;&lt;SPAN class=atitle&gt;已经在使用它&lt;/SPAN&gt;&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;不仅在运行 bash，实际上，您每天还在与 bash 打交道。它总在那里，因此学习如何最大限度使用它是有意义的。这样做将使您的 bash   经验更有趣和有生产力。但是为什么要学习 bash &lt;I&gt;编程&lt;/I&gt; ？很简单，因为您已在考虑如何运行命令、CPing   文件以及管道化和重定向输出。为什么不学习一种语言，以便使用和利用那些已熟悉和喜爱的强大省时的概念？命令 shell 开启了 UNIX 系统的潜能，而 bash   正是 &lt;I&gt;这个&lt;/I&gt; Linux shell。它是您和机器之间的高级纽带。增长 bash 知识吧，这将自动提高您在 Linux 和 UNIX 中的生产力   -- 就那么简单。 &lt;/P&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD&gt;&lt;IMG height=1 alt=""         src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"&gt;&lt;BR&gt;&lt;IMG         height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8     border=0&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;  &lt;TABLE class=no-print cellSpacing=0 cellPadding=0 align=right&gt;    &lt;TBODY&gt;    &lt;TR align=right&gt;      &lt;TD&gt;&lt;IMG height=4 alt="" src="http://www.ibm.com/i/c.gif"   width="100%"&gt;&lt;BR&gt;        &lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;          &lt;TBODY&gt;          &lt;TR&gt;            &lt;TD vAlign=center&gt;&lt;IMG height=16 alt=""               src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16               border=0&gt;&lt;BR&gt;&lt;/TD&gt;            &lt;TD vAlign=top align=right&gt;&lt;A class=fbox               href="http://www.ibm.com/developerworks/cn/linux/shell/bash/bash-1/#main"&gt;&lt;B&gt;回页首&lt;/B&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;  &lt;P&gt;&lt;A name=N1006F&gt;&lt;SPAN class=atitle&gt;Bash 困惑&lt;/SPAN&gt;&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;以错误方式学习 bash 令人十分困惑。许多新手输入 "man bash" 来查看 bash 帮助页，但只得到非常简单和技术方面的 shell   功能性描述。还有人输入 "info bash"（来查看 GNU 信息文档），只能得到重新显示的帮助页，或者（如果幸运）略为友好的信息文档。&lt;/P&gt;  &lt;P&gt;尽管这可能使初学者有些失望，但标准 bash 文档无法满足所有人的要求，它只适合那些已大体熟悉 shell   编程的人。帮助页中确实有很多极好的技术信息，但对初学者的帮助却有限。&lt;/P&gt;  &lt;P&gt;这就是本系列的目的所在。在本系列中，我将讲述如何实际使用 bash   编程概念，以便编写自己的脚本。与技术描述不同，我将以简单的语言为您解释，使您不仅知道事情做什么，还知道应在何时使用。在此三部分系列末尾，您将可以自己编写复杂的   bash 脚本，并可以自如地使用 bash 以及通过阅读（和理解）标准 bash 文档来补充知识。让我们开始吧。&lt;/P&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD&gt;&lt;IMG height=1 alt=""         src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"&gt;&lt;BR&gt;&lt;IMG         height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8     border=0&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;  &lt;TABLE class=no-print cellSpacing=0 cellPadding=0 align=right&gt;    &lt;TBODY&gt;    &lt;TR align=right&gt;      &lt;TD&gt;&lt;IMG height=4 alt="" src="http://www.ibm.com/i/c.gif"   width="100%"&gt;&lt;BR&gt;        &lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;          &lt;TBODY&gt;          &lt;TR&gt;            &lt;TD vAlign=center&gt;&lt;IMG height=16 alt=""               src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16               border=0&gt;&lt;BR&gt;&lt;/TD&gt;            &lt;TD vAlign=top align=right&gt;&lt;A class=fbox               href="http://www.ibm.com/developerworks/cn/linux/shell/bash/bash-1/#main"&gt;&lt;B&gt;回页首&lt;/B&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;  &lt;P&gt;&lt;A name=N1007E&gt;&lt;SPAN class=atitle&gt;环境变量&lt;/SPAN&gt;&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;在 bash 和几乎所有其它 shell 中，用户可以定义环境变量，这些环境变量在以 ASCII 字符串存储。环境变量的最便利之处在于：它们是 UNIX   进程模型的标准部分。这意味着：环境变量不仅由 shell 脚本独用，而且还可以由编译过的标准程序使用。当在 bash   中"导出"环境变量时，以后运行的任何程序，不管是不是 shell 脚本，都可以读取设置。一个很好的例子是 vipw 命令，它通常允许 root   用户编辑系统口令文件。通过将 EDITOR 环境变量设置成喜爱的文本编辑器名称，可以配置 vipw，使其使用该编辑器，而不使用 vi，如果习惯于 xemacs   而确实不喜欢 vi，那么这是很便利的。&lt;/P&gt;  &lt;P&gt;在 bash 中定义环境变量的标准方法是：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;$ myvar='This is my environment variable!'  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;以上命令定义了一个名为 "myvar" 的环境变量，并包含字符串 "This is my environment   variable!"。以上有几点注意事项：第一，在等号 "="   的两边没有空格，任何空格将导致错误（试一下看看）。第二个件要注意的事是：虽然在定义一个字时可以省略引号，但是当定义的环境变量值多于一个字时（包含空格或制表键），引号是必须的。&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="40%" align=right border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD width=10&gt;&lt;IMG height=1 alt="" src="http://www.ibm.com/i/c.gif"         width=10&gt;&lt;/TD&gt;      &lt;TD&gt;        &lt;TABLE cellSpacing=0 cellPadding=5 width="100%" border=1&gt;          &lt;TBODY&gt;          &lt;TR&gt;            &lt;TD bgColor=#eeeeee&gt;&lt;A name=sidebar&gt;&lt;B&gt;引用细节&lt;/B&gt;&lt;/A&gt;&lt;BR&gt;              &lt;P&gt;有关如何在 bash 中使用引号的非常详尽的信息，请参阅 bash               帮助页面中的"引用"一节。特殊字符序列由其它值"扩展"（替换）确实使 bash 中字符串的处理变得复杂。本系列将只讲述最常用的引用功能。               &lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;  &lt;P&gt;第三，虽然通常可以用双引号来替代单引号，但在上例中，这样做会导致错误。为什么呢？因为使用单引号禁用了称为扩展的 bash   特性，其中，特殊字符和字符系列由值替换。例如，"!" 字符是历史扩展字符，bash 通常将其替换为前面输入的命令。（本系列文章中将不讲述历史扩展，因为它在   bash 编程中不常用。有关历史扩展的详细信息，请参阅 bash   帮助页中的"历史扩展"一节。）尽管这个类似于宏的功能很便利，但我们现在只想在环境变量后面加上一个简单的感叹号，而不是宏。&lt;/P&gt;  &lt;P&gt;现在，让我们看一下如何实际使用环境变量。这有一个例子：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;$ echo $myvar  This is my environment variable!  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;通过在环境变量的前面加上一个 $，可以使 bash 用 myvar 的值替换它。这在 bash 术语中叫做"变量扩展"。但是，这样做将怎样：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;$ echo foo$myvarbar  foo  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;我们希望回显 "fooThis is my environment variable!bar"，但却不是这样。错在哪里？简单地说，bash   变量扩展设施陷入了困惑。它无法识别要扩展哪一个变量：$m、$my、$myvar 、$myvarbar 等等。如何更明确清楚地告述 bash   引用哪一个变量？试一下这个：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;$ echo foo${myvar}bar  fooThis is my environment variable!bar  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;如您所见，当环境变量没有与周围文本明显分开时，可以用花括号将它括起。虽然 $myvar 可以更快输入，并且在大多数情况下正确工作，但 ${myvar}   却能在几乎所有情况下正确通过语法分析。除此之外，二者相同，将在本系列的余下部分看到变量扩展的两种形式。请记住：当环境变量没有用空白（空格或制表键）与周围文本分开时，请使用更明确的花括号形式。&lt;/P&gt;  &lt;P&gt;回想一下，我们还提到过可以"导出"变量。当导出环境变量时，它可以自动地由以后运行的任何脚本或可执行程序环境使用。shell 脚本可以使用 shell   的内置环境变量支持"到达"环境变量，而 C 程序可以使用 getenv() 函数调用。这里有一些 C 代码示例，输入并编译它们 -- 它将帮助我们从 C   的角度理解环境变量：&lt;/P&gt;&lt;BR&gt;&lt;A name=N100BB&gt;&lt;B&gt;myvar.c -- 样本环境变量 C 程序&lt;/B&gt;&lt;/A&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;#include &amp;lt;stdio.h&amp;gt;  #include &amp;lt;stdlib.h&amp;gt;  int main(void) {    char *myenvvar=getenv("EDITOR");    printf("The editor environment variable is set to %s\n",myenvvar);  }  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;将上面的代码保存到文件 myenv.c 中，然后发出以下命令进行编译：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;$ gcc myenv.c -o myenv  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;现在，目录中将有一个可执行程序，它在运行时将打印 EDITOR 环境变量的值（如果有值的话）。这是在我机器上运行时的情况：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;$ ./myenv  The editor environment variable is set to (null)  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;啊... 因为没有将 EDITOR 环境变量设置成任何值，所以 C 程序得到一个空字符串。让我们试着将它设置成特定值：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;$ EDITOR=xemacs  $ ./myenv  The editor environment variable is set to (null)  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;虽然希望 myenv 打印值 "xemacs"，但是因为还没有导出环境变量，所以它却没有很好地工作。这次让它正确工作：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;$ export EDITOR  $ ./myenv  The editor environment variable is set to xemacs  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;现在，如您亲眼所见：不导出环境变量，另一个进程（在本例中是示例 C   程序）就看不到环境变量。顺便提一句，如果愿意，可以在一行定义并导出环境变量，如下所示：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;$ export EDITOR=xemacs  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;这与两行版本的效果相同。现在该演示如何使用 unset 来除去环境变量：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;$ unset EDITOR  $ ./myenv  The editor environment variable is set to (null)  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="40%" align=right border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD width=10&gt;&lt;IMG height=1 alt="" src="http://www.ibm.com/i/c.gif"         width=10&gt;&lt;/TD&gt;      &lt;TD&gt;        &lt;TABLE cellSpacing=0 cellPadding=5 width="100%" border=1&gt;          &lt;TBODY&gt;          &lt;TR&gt;            &lt;TD bgColor=#eeeeee&gt;&lt;A name=N100F1&gt;&lt;B&gt;dirname 和 basename&lt;/B&gt;&lt;/A&gt;&lt;BR&gt;              &lt;P&gt;请注意：dirname 和 basename 不是磁盘上的文件或目录，它们只是字符串操作命令。         &lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD&gt;&lt;IMG height=1 alt=""         src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"&gt;&lt;BR&gt;&lt;IMG         height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8     border=0&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;  &lt;TABLE class=no-print cellSpacing=0 cellPadding=0 align=right&gt;    &lt;TBODY&gt;    &lt;TR align=right&gt;      &lt;TD&gt;&lt;IMG height=4 alt="" src="http://www.ibm.com/i/c.gif"   width="100%"&gt;&lt;BR&gt;        &lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;          &lt;TBODY&gt;          &lt;TR&gt;            &lt;TD vAlign=center&gt;&lt;IMG height=16 alt=""               src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16               border=0&gt;&lt;BR&gt;&lt;/TD&gt;            &lt;TD vAlign=top align=right&gt;&lt;A class=fbox               href="http://www.ibm.com/developerworks/cn/linux/shell/bash/bash-1/#main"&gt;&lt;B&gt;回页首&lt;/B&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;  &lt;P&gt;&lt;A name=N100FB&gt;&lt;SPAN class=atitle&gt;截断字符串概述&lt;/SPAN&gt;&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;截断字符串是将初始字符串截断成较小的独立块，它是一般 shell 脚本每天执行的任务之一。很多时候，shell   脚本需要采用全限定路径，并找到结束的文件或目录。虽然可以用 bash 编码实现（而且有趣），但标准 basename UNIX   可执行程序可以极好地完成此工作：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;$ basename /usr/local/share/doc/foo/foo.txt  foo.txt  $ basename /usr/home/drobbins  drobbins  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;Basename 是一个截断字符串的极简便工具。它的相关命令 dirname 返回 basename 丢弃的"另"一部分路径。&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;$ dirname /usr/local/share/doc/foo/foo.txt  /usr/local/share/doc/foo  $ dirname /usr/home/drobbins/  /usr/home  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD&gt;&lt;IMG height=1 alt=""         src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"&gt;&lt;BR&gt;&lt;IMG         height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8     border=0&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;  &lt;TABLE class=no-print cellSpacing=0 cellPadding=0 align=right&gt;    &lt;TBODY&gt;    &lt;TR align=right&gt;      &lt;TD&gt;&lt;IMG height=4 alt="" src="http://www.ibm.com/i/c.gif"   width="100%"&gt;&lt;BR&gt;        &lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;          &lt;TBODY&gt;          &lt;TR&gt;            &lt;TD vAlign=center&gt;&lt;IMG height=16 alt=""               src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16               border=0&gt;&lt;BR&gt;&lt;/TD&gt;            &lt;TD vAlign=top align=right&gt;&lt;A class=fbox               href="http://www.ibm.com/developerworks/cn/linux/shell/bash/bash-1/#main"&gt;&lt;B&gt;回页首&lt;/B&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;  &lt;P&gt;&lt;A name=N1010F&gt;&lt;SPAN class=atitle&gt;命令替换&lt;/SPAN&gt;&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;需要知道一个简便操作：如何创建一个包含可执行命令结果的环境变量。这很容易：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;$ MYDIR=`dirname /usr/local/share/doc/foo/foo.txt`  $ echo $MYDIR  /usr/local/share/doc/foo  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;上面所做的称为"命令替换"。此例中有几点需要指出。在第一行，简单地将要执行的命令以 &lt;I&gt;反引号&lt;/I&gt; 括起。那不是标准的单引号，而是键盘中通常位于   Tab 键之上的单引号。可以用 bash 备用命令替换语法来做同样的事： &lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;$ MYDIR=$(dirname /usr/local/share/doc/foo/foo.txt)  $ echo $MYDIR  /usr/local/share/doc/foo  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;如您所见，bash 提供多种方法来执行完全一样的操作。使用命令替换可以将任何命令或命令管道放在 ` ` 或 $( )   之间，并将其分配给环境变量。真方便！下面是一个例子，演示如何在命令替换中使用管道：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;MYFILES=$(ls /etc | grep pa)  bash-2.03$ echo $MYFILES  pam.d passwd  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD&gt;&lt;IMG height=1 alt=""         src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"&gt;&lt;BR&gt;&lt;IMG         height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8     border=0&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;  &lt;TABLE class=no-print cellSpacing=0 cellPadding=0 align=right&gt;    &lt;TBODY&gt;    &lt;TR align=right&gt;      &lt;TD&gt;&lt;IMG height=4 alt="" src="http://www.ibm.com/i/c.gif"   width="100%"&gt;&lt;BR&gt;        &lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;          &lt;TBODY&gt;          &lt;TR&gt;            &lt;TD vAlign=center&gt;&lt;IMG height=16 alt=""               src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16               border=0&gt;&lt;BR&gt;&lt;/TD&gt;            &lt;TD vAlign=top align=right&gt;&lt;A class=fbox               href="http://www.ibm.com/developerworks/cn/linux/shell/bash/bash-1/#main"&gt;&lt;B&gt;回页首&lt;/B&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;  &lt;P&gt;&lt;A name=N1012D&gt;&lt;SPAN class=atitle&gt;象专业人员那样截断字符串&lt;/SPAN&gt;&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;尽管 basename 和 dirname   是很好的工具，但有时可能需要执行更高级的字符串"截断"，而不只是标准的路径名操作。当需要更强的说服力时，可以利用 bash 内置的变量扩展功能。已经使用了类似于   ${MYVAR} 的标准类型的变量扩展。但是 bash 自身也可以执行一些便利的字符串截断。看一下这些例子：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;$ MYVAR=foodforthought.jpg  $ echo ${MYVAR##*fo}  rthought.jpg  $ echo ${MYVAR#*fo}  odforthought.jpg  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;在第一个例子中，输入了 ${MYVAR##*fo}。它的确切含义是什么？基本上，在 ${ } 中输入环境变量名称，两个 ##，然后是通配符   ("*fo")。然后，bash 取得 MYVAR，找到从字符串 "foodforthought.jpg" 开始处开始、且匹配通配符 "*fo" 的   &lt;I&gt;最长&lt;/I&gt; 子字符串，然后将其从字符串的开始处截去。刚开始理解时会有些困难，为了感受一下这个特殊的 "##" 选项如何工作，让我们一步步地看看 bash   如何完成这个扩展。首先，它从 "foodforthought.jpg" 的开始处搜索与 "*fo" 通配符匹配的子字符串。以下是检查到的子字符串： &lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;f     fo      MATCHES *fo  foo   food  foodf         foodfo      MATCHES *fo  foodfor  foodfort      foodforth  foodfortho    foodforthou  foodforthoug  foodforthought  foodforthought.j  foodforthought.jp  foodforthought.jpg  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;在搜索了匹配的字符串之后，可以看到 bash 找到两个匹配。它选择最长的匹配，从初始字符串的开始处除去，然后返回结果。&lt;/P&gt;  &lt;P&gt;上面所示的第二个变量扩展形式看起来与第一个相同，但是它只使用一个 "#" -- 并且 bash 执行 &lt;I&gt;几乎&lt;/I&gt;   同样的过程。它查看与第一个例子相同的子字符串系列，但是 bash 从初始字符串除去 &lt;I&gt;最短&lt;/I&gt; 的匹配，然后返回结果。所以，一查到 "fo"   子字符串，它就从字符串中除去 "fo"，然后返回 "odforthought.jpg"。 &lt;/P&gt;  &lt;P&gt;这样说可能会令人十分困惑，下面以一简单方式记住这个功能。当搜索最长匹配时，使用 ##（因为 ## 比 # 长）。当搜索最短匹配时，使用   #。看，不难记吧！等一下，怎样记住应该使用 '#' 字符来从字符串开始部分除去？很简单！注意到了吗：在美国键盘上，shift-4 是 "$"，它是 bash   变量扩展字符。在键盘上，紧靠 "$" 左边的是 "#"。这样，可以看到："#" 位于 "$" 的"开始处"，因此（根据我们的记忆法），"#"   从字符串的开始处除去字符。您可能要问：如何从字符串末尾除去字符。如果猜到我们使用美国键盘上紧靠 "$" &lt;I&gt;右边&lt;/I&gt; 的字符   ("%)，那就猜对了。这里有一些简单的例子，解释如何截去字符串的末尾部分： &lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;$ MYFOO="chickensoup.tar.gz"  $ echo ${MYFOO%%.*}  chickensoup  $ echo ${MYFOO%.*}  chickensoup.tar  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;正如您所见，除了将匹配通配符从字符串末尾除去之外，% 和 %% 变量扩展选项与 # 和 ##   的工作方式相同。请注意：如果要从末尾除去特定子字符串，不必使用 "*" 字符：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;MYFOOD="chickensoup"  $ echo ${MYFOOD%%soup}  chicken  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;在此例中，使用 "%%" 或 "%" 并不重要，因为只能有一个匹配。还要记住：如果忘记了应该使用 "#" 还是 "%"，则看一下键盘上的 3、4 和 5   键，然后猜出来。&lt;/P&gt;  &lt;P&gt;可以根据特定字符偏移和长度，使用另一种形式的变量扩展，来选择特定子字符串。试着在 bash 中输入以下行：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;$ EXCLAIM=cowabunga  $ echo ${EXCLAIM:0:3}  cow  $ echo ${EXCLAIM:3:7}  abunga  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;这种形式的字符串截断非常简便，只需用冒号分开来指定起始字符和子字符串长度。&lt;/P&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD&gt;&lt;IMG height=1 alt=""         src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"&gt;&lt;BR&gt;&lt;IMG         height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8     border=0&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;  &lt;TABLE class=no-print cellSpacing=0 cellPadding=0 align=right&gt;    &lt;TBODY&gt;    &lt;TR align=right&gt;      &lt;TD&gt;&lt;IMG height=4 alt="" src="http://www.ibm.com/i/c.gif"   width="100%"&gt;&lt;BR&gt;        &lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;          &lt;TBODY&gt;          &lt;TR&gt;            &lt;TD vAlign=center&gt;&lt;IMG height=16 alt=""               src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16               border=0&gt;&lt;BR&gt;&lt;/TD&gt;            &lt;TD vAlign=top align=right&gt;&lt;A class=fbox               href="http://www.ibm.com/developerworks/cn/linux/shell/bash/bash-1/#main"&gt;&lt;B&gt;回页首&lt;/B&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;  &lt;P&gt;&lt;A name=N1016E&gt;&lt;SPAN class=atitle&gt;应用字符串截断&lt;/SPAN&gt;&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;现在我们已经学习了所有截断字符串的知识，下面写一个简单短小的 shell 脚本。我们的脚本将接受一个文件作为自变量，然后打印：该文件是否是一个 tar   文件。要确定它是否是 tar 文件，将在文件末尾查找模式 ".tar"。如下所示：&lt;/P&gt;&lt;BR&gt;&lt;A name=N10177&gt;&lt;B&gt;mytar.sh --   一个简单的脚本&lt;/B&gt;&lt;/A&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;#!/bin/bash  if [ "${1##*.}" = "tar" ]  then       echo This appears to be a tarball.  else      echo At first glance, this does not appear to be a tarball.  fi  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;要运行此脚本，将它输入到文件 mytar.sh 中，然后输入 "chmod 755 mytar.sh"，生成可执行文件。然后，如下做一下 tar   文件试验：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;$ ./mytar.sh thisfile.tar  This appears to be a tarball.  $ ./mytar.sh thatfile.gz  At first glance, this does not appear to be a tarball.  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;好，成功运行，但是不太实用。在使它更实用之前，先看一下上面使用的 "if" 语句。语句中使用了一个布尔表达式。在 bash 中，"="   比较运算符检查字符串是否相等。在 bash   中，所有布尔表达式都用方括号括起。但是布尔表达式实际上测试什么？让我们看一下左边。根据前面所学的字符串截断知识，"${1##*.}" 将从环境变量 "1"   包含的字符串开始部分除去最长的 "*." 匹配，并返回结果。这将返回文件中最后一个 "." 之后的所有部分。显然，如果文件以 ".tar" 结束，结果将是   "tar"，条件也为真。&lt;/P&gt;  &lt;P&gt;您可能会想：开始处的 "1" 环境变量是什么。很简单 -- $1 是传给脚本的第一个命令行自变量，$2 是第二个，以此类推。好，已经回顾了功能，下面来初探   "if" 语句。&lt;/P&gt;&lt;BR&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD&gt;&lt;IMG height=1 alt=""         src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"&gt;&lt;BR&gt;&lt;IMG         height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8     border=0&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;  &lt;TABLE class=no-print cellSpacing=0 cellPadding=0 align=right&gt;    &lt;TBODY&gt;    &lt;TR align=right&gt;      &lt;TD&gt;&lt;IMG height=4 alt="" src="http://www.ibm.com/i/c.gif"   width="100%"&gt;&lt;BR&gt;        &lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;          &lt;TBODY&gt;          &lt;TR&gt;            &lt;TD vAlign=center&gt;&lt;IMG height=16 alt=""               src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16               border=0&gt;&lt;BR&gt;&lt;/TD&gt;            &lt;TD vAlign=top align=right&gt;&lt;A class=fbox               href="http://www.ibm.com/developerworks/cn/linux/shell/bash/bash-1/#main"&gt;&lt;B&gt;回页首&lt;/B&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;  &lt;P&gt;&lt;A name=N1018E&gt;&lt;SPAN class=atitle&gt;If 语句&lt;/SPAN&gt;&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;与大多数语言一样，bash 有自己的条件形式。在使用时，要遵循以上格式；即，将 "if" 和 "then" 放在不同行，并使 "else" 和结束处必需的   "fi" 与它们水平对齐。这将使代码易于阅读和调试。除了 "if,else" 形式之外，还有其它形式的 "if" 语句：&lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;if [ condition ]  then       action  fi  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;只有当 &lt;CODE&gt;condition&lt;/CODE&gt; 为真时，该语句才执行操作，否则不执行操作，并继续执行 "fi" 之后的任何行。 &lt;/P&gt;  &lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=code-outline&gt;&lt;PRE class=displaycode&gt;if [ condition ]  then       action  elif [ condition2 ]  then       action2  .  .  .  elif [ condition3 ]  then   else      actionx  fi  &lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;  &lt;P&gt;以上 "elif" 形式将连续测试每个条件，并执行符合第一个 &lt;I&gt;真&lt;/I&gt; 条件的操作。如果没有条件为真，则将执行 "else"   操作，如果有一个条件为真，则继续执行整个 "if,elif,else" 语句之后的行。   &lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;/FONT&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5906929445033990464-5843178376571540662?l=irlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5906929445033990464&amp;postID=5843178376571540662&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/5843178376571540662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/5843178376571540662'/><link rel='alternate' type='text/html' href='http://irlab.blogspot.com/2007/11/bash.html' title='Bash 实例，第一部分'/><author><name>xlqb</name><uri>http://www.blogger.com/profile/07757898792107625243</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5906929445033990464.post-3451368492498520670</id><published>2007-11-15T10:53:00.001+08:00</published><updated>2007-11-15T10:53:20.815+08:00</updated><title type='text'>java HashMap 如何排序后输出</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Verdana&gt;&lt;FONT color=#000000   size=2&gt;工作中相信大家都会是HashMap记录一些映射，记录完后可能还需要对其排序后输出。下面是一简单例子，记录下以作备忘！&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;  &lt;DIV&gt;&lt;FONT face=Verdana size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;FONT face=Verdana   size=2&gt;&amp;nbsp; HashMap&amp;lt;Term, Float&amp;gt; termMap = new HashMap&amp;lt;Term,   Float&amp;gt;();&lt;/FONT&gt;  &lt;DIV&gt;&lt;FONT face=Verdana&gt;&amp;nbsp;&amp;nbsp;List entries = new   ArrayList(termMap.entrySet());&lt;BR&gt;&amp;nbsp;&amp;nbsp;Comparator cmp = new Comparator()   {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public int compare(Object o1, Object o2)   {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Map.Entry e1 = (Map.Entry)   o1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Map.Entry e2 = (Map.Entry)   o2;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Comparable v1 = (Comparable)   e1.getValue();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Comparable v2 = (Comparable)   e2.getValue();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return   v2.compareTo(v1);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;};&lt;BR&gt;&amp;nbsp;&amp;nbsp;Collections.sort(entries,   cmp);&lt;BR&gt;&amp;nbsp;&amp;nbsp;Iterator keys = entries.iterator();&lt;BR&gt;&amp;nbsp;&amp;nbsp;int   resultCounter = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;String queryString = "";&lt;BR&gt;&amp;nbsp;&amp;nbsp;while   (keys.hasNext() &amp;amp;&amp;amp; resultCounter &amp;lt; expandSize)   {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Map.Entry en = (Map.Entry)   keys.next();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Term t = new Term(((Term)   en.getKey()).field(),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((Term)   en.getKey()).text());&lt;BR&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println("oringe Term:" +   t);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (oringeSet.contains(t))   {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println("oringe Term:" +   t);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;queryString   += en.getKey() + "   ";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;resultCounter++;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;/DIV&gt;&lt;/FONT&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5906929445033990464-3451368492498520670?l=irlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5906929445033990464&amp;postID=3451368492498520670&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/3451368492498520670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/3451368492498520670'/><link rel='alternate' type='text/html' href='http://irlab.blogspot.com/2007/11/java-hashmap.html' title='java HashMap 如何排序后输出'/><author><name>xlqb</name><uri>http://www.blogger.com/profile/07757898792107625243</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5906929445033990464.post-6392053567934928482</id><published>2007-11-14T16:26:00.000+08:00</published><updated>2007-11-14T16:24:20.119+08:00</updated><title type='text'> java Map的访问方法备忘，Comparator例子 </title><content type='html'>&lt;DIV&gt;&lt;FONT face=Verdana&gt;  &lt;P&gt;1.把Map中的Key或Value转化为数组&lt;/P&gt;  &lt;P&gt;HashMap ssMap = new HashMap();&amp;nbsp;&lt;/P&gt;  &lt;P&gt;Counter counters[] = new   Counter[ssMap.size()];&amp;nbsp;&lt;BR&gt;ssMap.values().toArray(counters);&amp;nbsp;//转化，counters不需实例化&lt;BR&gt;Arrays.sort(counters,new   DfComparator());//排序&lt;/P&gt;  &lt;P&gt;2. Comparator 实例&lt;/P&gt;  &lt;P&gt;继承Comparator也可以实现排序，但相对Comparable接口更加灵活，用不同的Comparator实例可以实现不同的排序方法&lt;/P&gt;  &lt;P&gt;class DfComparator implements Comparator&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;public int   compare(Object o1, Object o2) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;// TODO Auto-generated method   stub&lt;BR&gt;&amp;nbsp;&amp;nbsp;Counter c1 = (Counter)o1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;Counter c2 =   (Counter)o2;&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;return c2.df - c1.df;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;public boolean   equals(Object obj)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;return   true;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&lt;BR&gt;}&lt;/P&gt;  &lt;P&gt;3.Map访问语句备忘&lt;/P&gt;  &lt;P&gt;&amp;nbsp;public static void print(Map map)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;Set set =   map.entrySet();&lt;BR&gt;&amp;nbsp;&amp;nbsp;Iterator iter =   set.iterator();&lt;BR&gt;&amp;nbsp;&amp;nbsp;while(iter.hasNext())&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Map.Entry   entry =   (Map.Entry)iter.next();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;entry.getKey();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;entry.getValue();&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;}&lt;/P&gt;&lt;/DIV&gt;&lt;/FONT&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5906929445033990464-6392053567934928482?l=irlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5906929445033990464&amp;postID=6392053567934928482&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/6392053567934928482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/6392053567934928482'/><link rel='alternate' type='text/html' href='http://irlab.blogspot.com/2007/11/java-mapcomparator.html' title=' java Map的访问方法备忘，Comparator例子 '/><author><name>xlqb</name><uri>http://www.blogger.com/profile/07757898792107625243</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5906929445033990464.post-2474871746513716367</id><published>2007-11-14T13:51:00.000+08:00</published><updated>2007-11-14T13:49:03.562+08:00</updated><title type='text'>博客有偿供稿，大势所趋</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Verdana&gt;&lt;FONT color=#c0c0c0&gt;&lt;FONT face=宋体   size=2&gt;&lt;STRONG&gt;博客有偿供稿，大势所趋&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;  &lt;DIV&gt;&lt;FONT face=Verdana&gt;&lt;STRONG&gt;&lt;FONT face=宋体 color=#c0c0c0   size=2&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;  &lt;DIV&gt;&lt;FONT face=Verdana&gt;&lt;STRONG&gt;&lt;FONT face=宋体 color=#c0c0c0   size=2&gt;web2.0时代个人的声音，越来越响亮，光就博客一项就给各大博客网站带来无数的流量，当然也给个人带来快乐，让个人的思想得到传播。看看老徐的博客点击突破上亿大关，现在正热的财经博客动辄点击过千万，甚至过亿，这些也许数据肯定会让各个频道的编辑汗颜，也会倍感危机，人民的力量实在伟大。&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/DIV&gt;  &lt;DIV&gt;&lt;FONT face=Verdana&gt;&lt;STRONG&gt;&lt;FONT face=宋体 color=#c0c0c0   size=2&gt;实际上这巨大的流量能给各大网址带来巨大的利润，但还没有那个博客给这些勤劳的供稿人正式付过稿费，我一直觉得会有那个一家网址会先吃螃蟹，但没想到的却是soosee这个刚开张的小网址，而且还打着公益的名义，但总算有了破冰的尝试，也许soosee只是争着做烈士，但我觉得博客有偿供稿，大势所趋。各位博主们，努力经营自己的博客吧！&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;/FONT&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5906929445033990464-2474871746513716367?l=irlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5906929445033990464&amp;postID=2474871746513716367&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/2474871746513716367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/2474871746513716367'/><link rel='alternate' type='text/html' href='http://irlab.blogspot.com/2007/11/blog-post_14.html' title='博客有偿供稿，大势所趋'/><author><name>xlqb</name><uri>http://www.blogger.com/profile/07757898792107625243</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5906929445033990464.post-4373965357510725476</id><published>2007-11-14T01:38:00.001+08:00</published><updated>2007-11-14T01:38:22.645+08:00</updated><title type='text'>如何读取Lucene索引数据1</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;  &lt;H4 class=TextColor1 id=subjcns!3BB36966ED98D3E5!408   style="MARGIN-BOTTOM: 0px"&gt;Lucene源码分析(1) -- 如何读取Lucene索引数据&lt;/H4&gt;  &lt;DIV class=bvMsg id=msgcns!3BB36966ED98D3E5!408&gt;  &lt;DIV&gt;终于清楚如何用读Lucene的索引   :-)。本文要介绍一下如何利用IndexReader获取信息。为什么要读索引呢？因为我需要实现这些功能：&lt;BR&gt;(1)   统计term在整个collection中的文档频度(document frequency, DF)；&lt;BR&gt;(2)   统计term在整个collection中出现的词次(term frequency in whole collection)；&lt;BR&gt;(3)   统计term在某个文档中出现的频度(term frequency, TF)；&lt;BR&gt;(4) 列出term在某文档中出现的位置(position)；&lt;BR&gt;(5)   整个collection中文档的个数；&lt;/DIV&gt;  &lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;  &lt;DIV&gt;那么为什么要用到这些数据呢？这些数据是实现TR(Text   Retrieval，文本检索)的必备的"原料"，而且是经过加工的。在检索之前，只有原始文本(raw   data)；经过索引器(indexer)的处理之后，原始文本变成了一个一个的term(或者token)，然后被indexer纪录下来所在的位置、出现的次数。有了这些数据，应用一些模型，就可以实现搜索引擎实现的功能――文本检索。&lt;/DIV&gt;  &lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;  &lt;DIV&gt;聪明的读者您可能会说，这看起来似乎很好做，不过就是计数(count)么。不错，就是计数，或者说是统计。但是看似简单的过程，如果加上空间(内存容量)的限制，就显得不那么简单了。假设如果每篇文档有100个term，每个term需要存储10字节信息，存1,000,000篇文档需要   10x100x10^6=10^9=2^30字节，也就是1GB。虽然现在1G内存不算什么，可是总不能把1GB的数据时时刻刻都放入内存吧。那么放入硬盘好了，现在需要用数据的时候，再把1GB数据从硬盘搬到内存。OK，可以先去冲杯咖啡，回来在继续下面的操作。这是1,000,000的文档，如果更多一点呢，现在没有任何辅助数据结构的方式，会导致很差的效率。&lt;/DIV&gt;  &lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;  &lt;DIV&gt;Lucene的索引会把数据分成段，并且在需要的时候才读，不需要的时候就让数据乖乖地呆在硬盘上。Lucene本身是一个优秀的索引引擎，能够提供有效的索引和检索机制。文本的目的是，介绍如用利用Lucene的API，如何从已经建好的索引的数据中读取需要的信息。至于Lucene如何使用，我会在后续的文章中逐渐介绍。&lt;/DIV&gt;  &lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;  &lt;DIV&gt;我们一步一步来看。这里建设已经有实现建好索引，存放在index目录下。好，要读索引，总得先生成一个读索引器(即Lucene中IndexReader的实例)。好，写下面的程序(程序为C#程序，本文使用DotLucene)。&lt;BR&gt;&amp;nbsp;IndexReader   reader;&lt;BR&gt;问题出来了，IndexReader是一个abstract类，不能实例化。那好，换派生类试试看。找到IndexReader的两个孩子――SegmentReader和MultiReader。用哪个呢？无论是哪个都需要一大堆参数(我是颇费了周折才搞清楚它们的用途，后面再解释)，似乎想用Lucene的索引数据不是那么容易啊。通过跟踪代码和查阅文档，我终于找到使用IndexReader的钥匙。原来IndexReader有一个"工厂模式"的static   interface――IndexReader.Open。定义如下：&lt;BR&gt;#0001&amp;nbsp; public static IndexReader   Open(System.String path)&lt;BR&gt;#0002&amp;nbsp; public static IndexReader   Open(System.IO.FileInfo path)&lt;BR&gt;#0003&amp;nbsp; public static IndexReader   Open(Directory directory)&lt;BR&gt;#0004&amp;nbsp; private static IndexReader   Open(Directory directory, bool   closeDirectory)&lt;BR&gt;其中有三个是public的接口，可供调用。打开一个索引，就是这么简单：&lt;BR&gt;#0001&amp;nbsp;   IndexReader reader = IndexReader.Open(index);&lt;BR&gt;&lt;/DIV&gt;  &lt;DIV&gt;实际上，这个打开索引经历了这样的一个过程：&lt;BR&gt;#0001&amp;nbsp; SegmentInfos infos = new   SegmentInfos();&lt;BR&gt;#0002&amp;nbsp; Directory directory =   FSDirectory.GetDirectory(index, false);&lt;BR&gt;#0003&amp;nbsp;   infos.Read(directory);&lt;BR&gt;#0004&amp;nbsp; bool closeDirectory =   false;&lt;BR&gt;#0005&amp;nbsp; if (infos.Count == 1)&lt;BR&gt;#0006&amp;nbsp; {&lt;BR&gt;#0007&amp;nbsp;   &amp;nbsp;// index is optimized&lt;BR&gt;#0008&amp;nbsp; &amp;nbsp;return new SegmentReader(infos,   infos.Info(0), closeDirectory);&lt;BR&gt;#0009&amp;nbsp; }&lt;BR&gt;#0010&amp;nbsp;   else&lt;BR&gt;#0011&amp;nbsp; {&lt;BR&gt;#0012&amp;nbsp; &amp;nbsp;IndexReader[] readers = new   IndexReader[infos.Count];&lt;BR&gt;#0013&amp;nbsp; &amp;nbsp;for (int i = 0; i &amp;lt;   infos.Count; i++)&lt;BR&gt;#0014&amp;nbsp; &amp;nbsp;&amp;nbsp;readers[i] = new   SegmentReader(infos.Info(i));&lt;BR&gt;#0015&amp;nbsp; &amp;nbsp;return new   MultiReader(directory, infos, closeDirectory, readers);&lt;BR&gt;#0016&amp;nbsp; }&lt;/DIV&gt;  &lt;DIV&gt;首先要读入索引的段信息(segment information,   #0001~#0003)，然后看一下有几个段：如果只有一个，那么可能是优化过的，直接读取这一个段就可以(#0008)；否则需要一次读入各个段(#0013~#0014)，然后再拼成一个MultiReader(#0015)。打开索引文件的过程就是这样。&lt;/DIV&gt;  &lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;  &lt;DIV&gt;接下来我们要看看如何读取信息了。用下面这段代码来说明。&lt;BR&gt;#0001&amp;nbsp; public static void   PrintIndex(IndexReader reader)&lt;BR&gt;#0002&amp;nbsp;   {&lt;BR&gt;#0003&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   //显示有多少个document&lt;BR&gt;#0004&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   System.Console.WriteLine(reader + "\tNumDocs = " +   reader.NumDocs());&lt;BR&gt;#0005&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 0; i &amp;lt;   reader.NumDocs(); i++)&lt;BR&gt;#0006&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   {&lt;BR&gt;#0007&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   System.Console.WriteLine(reader.Document(i));&lt;BR&gt;#0008&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   }&lt;BR&gt;#0009&amp;nbsp; &lt;BR&gt;#0010&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   //枚举term，获得&amp;lt;document, term freq, position*   &amp;gt;信息&lt;BR&gt;#0011&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TermEnum termEnum =   reader.Terms();&lt;BR&gt;#0012&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while   (termEnum.Next())&lt;BR&gt;#0013&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   {&lt;BR&gt;#0014&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   System.Console.Write(termEnum.Term());&lt;BR&gt;#0015&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   System.Console.WriteLine("\tDocFreq=" + termEnum.DocFreq());&lt;BR&gt;#0016&amp;nbsp;   &lt;BR&gt;#0017&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TermPositions   termPositions =   reader.TermPositions(termEnum.Term());&lt;BR&gt;#0018&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   int i = 0;&lt;BR&gt;#0019&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int j   = 0;&lt;BR&gt;#0020&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while   (termPositions.Next())&lt;BR&gt;#0021&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   {&lt;BR&gt;#0022&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   System.Console.WriteLine((i++) + "-&amp;gt;" + " DocNo:" + termPositions.Doc() + ",   Freq:" +   termPositions.Freq());&lt;BR&gt;#0023&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   for (j = 0; j &amp;lt; termPositions.Freq();   j++)&lt;BR&gt;#0024&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   System.Console.Write("[" + termPositions.NextPosition() +   "]");&lt;BR&gt;#0025&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   System.Console.WriteLine();&lt;BR&gt;#0026&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   }&lt;BR&gt;#0027&amp;nbsp; &lt;BR&gt;#0028&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   //直接获取 &amp;lt;term freq, document&amp;gt;   的信息&lt;BR&gt;#0029&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TermDocs   termDocs =   reader.TermDocs(termEnum.Term());&lt;BR&gt;#0030&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   while   (termDocs.Next())&lt;BR&gt;#0031&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   {&lt;BR&gt;#0032&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   System.Console.WriteLine((i++) + "-&amp;gt;" + " DocNo:" + termDocs.Doc() + ",   Freq:" +   termDocs.Freq());&lt;BR&gt;#0033&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   }&lt;BR&gt;#0034&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;#0035&amp;nbsp;   &lt;BR&gt;#0036&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // FieldInfos fieldInfos =   reader.fieldInfos;&lt;BR&gt;#0037&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // FieldInfo   pathFieldInfo = fieldInfos.FieldInfo("path");&lt;BR&gt;#0038&amp;nbsp;   &lt;BR&gt;#0039&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //显示 term frequency   vector&lt;BR&gt;#0040&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 0; i &amp;lt;   reader.NumDocs(); i++)&lt;BR&gt;#0041&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   {&lt;BR&gt;#0042&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   //对contents的token之后的term存于了TermFreqVector&lt;BR&gt;#0043&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   TermFreqVector termFreqVector = reader.GetTermFreqVector(i,   "contents");&lt;BR&gt;#0044&amp;nbsp;   &lt;BR&gt;#0045&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if   (termFreqVector ==   null)&lt;BR&gt;#0046&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   {&lt;BR&gt;#0047&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   System.Console.WriteLine("termFreqVector is   null.");&lt;BR&gt;#0048&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   continue;&lt;BR&gt;#0049&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   }&lt;BR&gt;#0050&amp;nbsp; &lt;BR&gt;#0051&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   String fieldName =   termFreqVector.GetField();&lt;BR&gt;#0052&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   String[] terms =   termFreqVector.GetTerms();&lt;BR&gt;#0053&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   int[] frequences = termFreqVector.GetTermFrequencies();&lt;BR&gt;#0054&amp;nbsp;   &lt;BR&gt;#0055&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   System.Console.Write("FieldName:" +   fieldName);&lt;BR&gt;#0056&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for   (int j = 0; j &amp;lt; terms.Length;   j++)&lt;BR&gt;#0057&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   {&lt;BR&gt;#0058&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   System.Console.Write("[" + terms[j] + ":" + frequences[j] +   "]");&lt;BR&gt;#0059&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   }&lt;BR&gt;#0060&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   System.Console.WriteLine();&lt;BR&gt;#0061&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   }&lt;BR&gt;#0062&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   System.Console.WriteLine();&lt;BR&gt;#0063&amp;nbsp; }&lt;/DIV&gt;  &lt;DIV&gt;#0004 计算document的个数&lt;BR&gt;#0012~#0034 枚举collection中所有的term&lt;BR&gt;其中#0017~#0026   枚举每个term在出现的document中的所有位置(第几个词，从1开始计数)；#0029~#0033   计算每个term出现在哪些文档和相应的出现频度(即DF和TF)。&lt;BR&gt;#0036~#0037在reader是SegmentReader类型的情况下有效。&lt;BR&gt;#0040~#0061可以快速的读取某篇文档中出现的term和相应的频度。但是这部分需要在建索引时，设置storeTermVector为true。比如&lt;BR&gt;&amp;nbsp;doc.Add(Field.Text("contents",   reader, true));&lt;BR&gt;其中的第三项即是。默认为false。&lt;/DIV&gt;  &lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;  &lt;DIV&gt;有了这些数据，就可以统计我需要的数据了。以后我会介绍如何建立索引，如何应用Lucene。&lt;/DIV&gt;&lt;/DIV&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;/FONT&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5906929445033990464-4373965357510725476?l=irlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5906929445033990464&amp;postID=4373965357510725476&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/4373965357510725476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/4373965357510725476'/><link rel='alternate' type='text/html' href='http://irlab.blogspot.com/2007/11/lucene1.html' title='如何读取Lucene索引数据1'/><author><name>xlqb</name><uri>http://www.blogger.com/profile/07757898792107625243</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5906929445033990464.post-3101987471748832014</id><published>2007-11-13T23:49:00.000+08:00</published><updated>2007-11-13T23:50:15.387+08:00</updated><title type='text'> NekoHTML学习笔记  (zhuan)</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;STRONG&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 13.5pt; FONT-FAMILY: 宋体"&gt;NekoHTML&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;STRONG&gt;&lt;SPAN   style="FONT-SIZE: 13.5pt; FONT-FAMILY: 宋体"&gt;学习笔记&lt;SPAN lang=EN-US&gt;&lt;?XML:NAMESPACE   PREFIX = O /&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;　　&lt;SPAN lang=EN-US&gt;&lt;A   href="http://www.infomall.cn/cgi-bin/mallgate/20031008/http:/www.apache.org/~andyc/"&gt;J.   Andrew Clark&lt;/A&gt;&lt;/SPAN&gt;用&lt;SPAN lang=EN-US&gt;Java&lt;/SPAN&gt;写了一系列的工具&lt;SPAN   lang=EN-US&gt;(Java APIs)&lt;/SPAN&gt;，&lt;SPAN lang=EN-US&gt;&lt;A title="CyberNeko HTML Parser"   href="http://www.infomall.cn/cgi-bin/mallgate/20031008/http:/www.apache.org/~andyc/neko/doc/html/index.html"&gt;NekoHTML&lt;/A&gt;&lt;/SPAN&gt;是其中之一。&lt;SPAN   lang=EN-US&gt;&lt;BR&gt;&lt;/SPAN&gt;　　&lt;SPAN lang=EN-US&gt;NekoHTML&lt;/SPAN&gt;是一个简单地&lt;SPAN   lang=EN-US&gt;HTML&lt;/SPAN&gt;扫描器和标签补偿器&lt;SPAN lang=EN-US&gt;(tag balancer)   ,&lt;/SPAN&gt;使得程序能解析&lt;SPAN lang=EN-US&gt;HTML&lt;/SPAN&gt;文档并用标准的&lt;SPAN   lang=EN-US&gt;XML&lt;/SPAN&gt;接口来访问其中的信息。这个解析器能投扫描&lt;SPAN lang=EN-US&gt;HTML&lt;/SPAN&gt;文件并&lt;SPAN   lang=EN-US&gt;"&lt;/SPAN&gt;修正&lt;SPAN lang=EN-US&gt;"&lt;/SPAN&gt;许多作者（人或机器）在编写&lt;SPAN   lang=EN-US&gt;HTML&lt;/SPAN&gt;文档过程中常犯的错误。&lt;SPAN   lang=EN-US&gt;NekoHTML&lt;/SPAN&gt;能增补缺失的父元素、自动用结束标签关闭相应的元素，以及不匹配的内嵌元素标签。&lt;SPAN   lang=EN-US&gt;NekoHTML&lt;/SPAN&gt;的开发使用了&lt;SPAN lang=EN-US&gt;Xerces Native Interface   (XNI)&lt;/SPAN&gt;，后者是&lt;SPAN lang=EN-US&gt;Xerces2&lt;/SPAN&gt;的实现基础。&lt;SPAN   lang=EN-US&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;A name=more&gt;&lt;/A&gt;&lt;SPAN   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;　　&lt;SPAN lang=EN-US&gt;   &lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;STRONG&gt;&lt;SPAN   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;一、运行要求&lt;SPAN   lang=EN-US&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;　　从&lt;SPAN   lang=EN-US&gt;NekoHTML&lt;/SPAN&gt;主页上下载&lt;SPAN   lang=EN-US&gt;nekohtml-latest.zip&lt;/SPAN&gt;，目前版本是&lt;SPAN   lang=EN-US&gt;0.8.&lt;BR&gt;&lt;/SPAN&gt;　　&lt;SPAN lang=EN-US&gt;NekoHTML&lt;/SPAN&gt;要求运行在&lt;SPAN   lang=EN-US&gt;java1.1&lt;/SPAN&gt;或更高版本，&lt;SPAN lang=EN-US&gt;Xerces-J   2.0&lt;/SPAN&gt;或更高版本。（我在试用时，随便拿了个&lt;SPAN   lang=EN-US&gt;xerces&lt;/SPAN&gt;的包来用，结果例如运行老时不能通过，折腾半天后才发现版本不够所致&lt;SPAN   lang=EN-US&gt;.:)&lt;BR&gt;&lt;/SPAN&gt;　　&lt;SPAN lang=EN-US&gt; &lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;STRONG&gt;&lt;SPAN   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;二、使用&lt;SPAN   lang=EN-US&gt;NekoHTML&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;BR&gt;1&lt;/SPAN&gt;&lt;SPAN   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;、透明地创建&lt;SPAN   lang=EN-US&gt;HTML&lt;/SPAN&gt;解析器&lt;SPAN lang=EN-US&gt;&lt;BR&gt;&lt;/SPAN&gt;　　利用&lt;SPAN   lang=EN-US&gt;Xerces2.0&lt;/SPAN&gt;为基础，应用程序通过&lt;SPAN   lang=EN-US&gt;JAXP&lt;/SPAN&gt;实例化解析器对象时，可以透明地创建&lt;SPAN   lang=EN-US&gt;HTML&lt;/SPAN&gt;解析器，此时只需要将&lt;SPAN lang=EN-US&gt;NekoHTML&lt;/SPAN&gt;的&lt;SPAN   lang=EN-US&gt;jar&lt;/SPAN&gt;文件，在&lt;SPAN lang=EN-US&gt;CLASSPATH&lt;/SPAN&gt;中放在&lt;SPAN   lang=EN-US&gt;Xerces&lt;/SPAN&gt;的&lt;SPAN lang=EN-US&gt;jar&lt;/SPAN&gt;文件之前即可。&lt;SPAN   lang=EN-US&gt;nekohtmlXni.jar&lt;/SPAN&gt;中的&lt;SPAN   lang=EN-US&gt;META-INF/services/org.apache.xerces.xni.parser.XMLParserConfiguration&lt;/SPAN&gt;文件会被&lt;SPAN   lang=EN-US&gt;Xerces&lt;/SPAN&gt;的读取并取代标准的设置文件，此处&lt;SPAN   lang=EN-US&gt;org.apache.xerces.xni.parser.XMLParserConfiguration&lt;/SPAN&gt;文件的内容就是一个字符串&lt;SPAN   lang=EN-US&gt;"org.cyberneko.html.HTMLConfiguration"&lt;/SPAN&gt;。这种方法的好处是简单透明，缺点是影响了&lt;SPAN   lang=EN-US&gt;Xerces&lt;/SPAN&gt;在其它情况下的使用。&lt;SPAN lang=EN-US&gt;   &lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;2&lt;/SPAN&gt;&lt;SPAN   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;、便利的&lt;SPAN   lang=EN-US&gt;HTML&lt;/SPAN&gt;解析器类&lt;SPAN lang=EN-US&gt;&lt;BR&gt;&lt;/SPAN&gt;　　要想避免上述的问题，可以使用&lt;SPAN   lang=EN-US&gt;org.cyberneko.html.parsers&lt;/SPAN&gt;包的&lt;SPAN lang=EN-US&gt;DOM&lt;/SPAN&gt;和&lt;SPAN   lang=EN-US&gt;SAX&lt;/SPAN&gt;解析器类来创建解析器，这两个类都使用了&lt;SPAN   lang=EN-US&gt;HTMLConfiguration&lt;/SPAN&gt;类。解析器一旦创建之后，就可以解析&lt;SPAN   lang=EN-US&gt;HTML&lt;/SPAN&gt;文件，并用标准的&lt;SPAN   lang=EN-US&gt;XML&lt;/SPAN&gt;接口来访问文件中的信息，就象面对的是一个&lt;SPAN lang=EN-US&gt;XML&lt;/SPAN&gt;文件一样。&lt;SPAN   lang=EN-US&gt;&lt;BR&gt;&lt;/SPAN&gt;　　下面的代码是&lt;SPAN   lang=EN-US&gt;NekoHTML&lt;/SPAN&gt;自带的例程，我改了一下，使其可以显示&lt;SPAN   lang=EN-US&gt;HTML&lt;/SPAN&gt;文件内容，而不显示类的名字。&lt;SPAN lang=EN-US&gt;   &lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;package sample;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;O:P&gt;&amp;nbsp;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;O:P&gt;&amp;nbsp;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;import   org.cyberneko.html.parsers.DOMParser;&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;import   org.w3c.dom.Document;&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;import   org.w3c.dom.Node;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;O:P&gt;&amp;nbsp;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;O:P&gt;&amp;nbsp;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;public class TestHTMLDOM   {&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;public   static void main(String[] argv) throws Exception {&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;DOMParser parser = new DOMParser();&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;for (int i = 0; i &amp;lt; argv.length; i++) {&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;parser.parse(argv[i]);&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;print(parser.getDocument(), "");&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;}&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;}&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;public   static void print(Node node, String indent) {&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;//&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;System.out.println(indent+node.getClass().getName());&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;if (node.getNodeValue() != null){&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;if("".equals(node.getNodeValue().trim())){&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;}else{&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;System.out.print(indent);&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;System.out.println(node.getNodeValue());&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;}&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;}&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;Node child = node.getFirstChild();&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;while (child != null) {&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;print(child, indent+" ");&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;child = child.getNextSibling();&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;}&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;}&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;}&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;编译运行如下：&lt;SPAN lang=EN-US&gt;   &lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;cd $NEKOHTML_HOME&lt;BR&gt;cp build_html.xml   build.xml&lt;BR&gt;ant&lt;BR&gt;java -cp   nekohtml.jar;nekohtmlSamples.jar;xmlParserAPIs.jar;xercesImpl.jar   sample.TestHTMLDOM test.html&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;如果一切正常可以显示&lt;SPAN   lang=EN-US&gt;HTML&lt;/SPAN&gt;的内容了。&lt;SPAN lang=EN-US&gt;&lt;BR&gt;3&lt;/SPAN&gt;、文档片段解析&lt;SPAN   lang=EN-US&gt;&lt;BR&gt;&lt;/SPAN&gt;　　除了&lt;SPAN lang=EN-US&gt;DOM&lt;/SPAN&gt;和&lt;SPAN   lang=EN-US&gt;SAX&lt;/SPAN&gt;类，&lt;SPAN lang=EN-US&gt;NekoHTML&lt;/SPAN&gt;还提供了一个实验性质的&lt;SPAN   lang=EN-US&gt;DOMFragmentParser&lt;/SPAN&gt;类，用以解析&lt;SPAN   lang=EN-US&gt;HTML&lt;/SPAN&gt;文件的片段。我个人认为，由于浏览器的强大的容错能力，即使一个片段的&lt;SPAN   lang=EN-US&gt;HTML&lt;/SPAN&gt;文件，也可以正确显示，由此也变相地造成了很多人不再关心的&lt;SPAN   lang=EN-US&gt;HTML&lt;/SPAN&gt;的完整要求了。这个类，也许将是用的最多的。下面，看看&lt;SPAN   lang=EN-US&gt;nutch&lt;/SPAN&gt;是如何使用&lt;SPAN lang=EN-US&gt;nekoHTML&lt;/SPAN&gt;的。&lt;SPAN lang=EN-US&gt;   &lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;package   net.nutch.fetcher;&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;...&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;import   org.cyberneko.html.parsers.*;&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;import org.xml.sax.*;&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;import org.w3c.dom.*;&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;import   org.w3c.dom.html.*;&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;import   org.apache.html.dom.*;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;O:P&gt;&amp;nbsp;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;O:P&gt;&amp;nbsp;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;/* A simple fetcher. */&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;public class Fetcher { &lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;....&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;private   DOMFragmentParser parser = new DOMFragmentParser();&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;....&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;private   void handleFetch(URL url, FetchListEntry fle, Http.Response   response)&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;throws IOException, SAXException {&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;//&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;判断&lt;SPAN   lang=EN-US&gt;HTTP&lt;/SPAN&gt;应答包的类型，只放过&lt;SPAN lang=EN-US&gt;html&lt;/SPAN&gt;文件&lt;SPAN   lang=EN-US&gt;&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;String contentType = response.getHeader("Content-Type");&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;if (contentType != null &amp;amp;&amp;amp;   !contentType.startsWith("text/html"))&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;throw new IOException("Unknown content-type: " +   contentType);&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;//&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;创建文件片段对象&lt;SPAN   lang=EN-US&gt;&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;DocumentFragment node = new   HTMLDocumentImpl().createDocumentFragment();&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;//&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;解析&lt;SPAN   lang=EN-US&gt;HTML&lt;/SPAN&gt;内容&lt;SPAN lang=EN-US&gt;&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;parser.parse(new InputSource(new   ByteArrayInputStream(response.getContent())),node);&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;//&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;取得全部文本内容&lt;SPAN   lang=EN-US&gt;&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;StringBuffer sb = new StringBuffer();&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;getText(sb, node);&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;String text = sb.toString();&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;//&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;取得标题信息&lt;SPAN   lang=EN-US&gt;&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;sb.setLength(0);&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;getTitle(sb, node);&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;String title = sb.toString().trim();&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;//&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;取得该页所有的出链&lt;SPAN   lang=EN-US&gt;&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;ArrayList l = new ArrayList();&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;getOutlinks(url, l, node);&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;//&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;显示结果，存储信息&lt;SPAN   lang=EN-US&gt;&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;Outlink[] outlinks = (Outlink[])l.toArray(new   Outlink[l.size()]);&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;LOG.fine("found " + outlinks.length + " outlinks in " +   url);&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;O:P&gt;&amp;nbsp;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;O:P&gt;&amp;nbsp;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;outputPage(new FetcherOutput(fle,   MD5Hash.digest(response.getContent()),&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;true,   title, outlinks),&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;new FetcherContent(response.getContent()),&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;new FetcherText(text));&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;}&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;private static void   getText(StringBuffer sb, Node node) {&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;if   (node.getNodeType() == Node.TEXT_NODE) {&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;sb.append(node.getNodeValue());//&lt;/SPAN&gt;&lt;SPAN   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;取得结点值，即开始与结束标签之间的信息&lt;SPAN   lang=EN-US&gt;&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;}&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;NodeList children = node.getChildNodes();&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;if (   children != null ) {&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;int len = children.getLength();&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;for ( int i = 0; i &amp;lt; len; i++ ) {&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;getText(sb, children.item(i));//&lt;/SPAN&gt;&lt;SPAN   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;递归遍历&lt;SPAN lang=EN-US&gt;DOM&lt;/SPAN&gt;树&lt;SPAN   lang=EN-US&gt;&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;}&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;}&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;   &lt;/SPAN&gt;}&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;O:P&gt;&amp;nbsp;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;O:P&gt;&amp;nbsp;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;private static   boolean getTitle(StringBuffer sb, Node node) {&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;if   (node.getNodeType() == Node.ELEMENT_NODE) {&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;if ("title".equalsIgnoreCase(node.getNodeName())) {&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;getText(sb, node);&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;return true;&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;}&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;}&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;NodeList children = node.getChildNodes();&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;if   (children != null) {&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;int len = children.getLength();&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;for (int i = 0; i &amp;lt; len; i++) {&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;if (getTitle(sb, children.item(i))) {&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;return true;&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;}&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;}&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;}&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;return   false;&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;   &lt;/SPAN&gt;}&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;O:P&gt;&amp;nbsp;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;O:P&gt;&amp;nbsp;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;private static void   getOutlinks(URL base, ArrayList outlinks, Node node) {&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;if   (node.getNodeType() == Node.ELEMENT_NODE) {&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;if ("a".equalsIgnoreCase(node.getNodeName())) {&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;StringBuffer linkText = new StringBuffer();&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;getText(linkText, node);&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;O:P&gt;&amp;nbsp;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;O:P&gt;&amp;nbsp;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;NamedNodeMap attrs = node.getAttributes();&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;String target= null;&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;for (int i= 0; i &amp;lt; attrs.getLength(); i++ ) {&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;if ("href".equalsIgnoreCase(attrs.item(i).getNodeName())) {&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;target= attrs.item(i).getNodeValue();//&lt;/SPAN&gt;&lt;SPAN   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;在&lt;SPAN   lang=EN-US&gt;DOM&lt;/SPAN&gt;树中，属性是一个结点。&lt;SPAN lang=EN-US&gt;&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;break;&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;}&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;}&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;if (target != null)&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;try {&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;URL url = new URL(base, target);&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;outlinks.add(new   Outlink(url.toString(),linkText.toString().trim()));&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;} catch (MalformedURLException e) {&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;// don't care&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;}&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;}&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;}&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;NodeList children = node.getChildNodes();&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;if (   children != null ) {&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;int len = children.getLength();&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;for ( int i = 0; i &amp;lt; len; i++ ) {&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;getOutlinks(base, outlinks, children.item(i));//&lt;/SPAN&gt;&lt;SPAN   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;递归遍历&lt;SPAN lang=EN-US&gt;DOM&lt;/SPAN&gt;树&lt;SPAN   lang=EN-US&gt;&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;}&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;}&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;   &lt;/SPAN&gt;}&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;....&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;}&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;注意，此处传递给解析过程&lt;SPAN   lang=EN-US&gt;parse&lt;/SPAN&gt;的文档片段对象，必须是由&lt;SPAN   lang=EN-US&gt;org.w3c.dom.html.HTMLDocument&lt;/SPAN&gt;类型的&lt;SPAN   lang=EN-US&gt;DOM&lt;/SPAN&gt;文档对象创建，否则有异常。&lt;SPAN lang=EN-US&gt;&lt;BR&gt;&lt;/SPAN&gt;　　&lt;SPAN   lang=EN-US&gt;HTMLConfiguration&lt;/SPAN&gt;可以用于创建任何基于&lt;SPAN   lang=EN-US&gt;XNI&lt;/SPAN&gt;解析器，可参考下例&lt;SPAN lang=EN-US&gt; &lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;package sample;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;O:P&gt;&amp;nbsp;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;O:P&gt;&amp;nbsp;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;import   org.apache.xerces.parsers.AbstractSAXParser;&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;import   org.cyberneko.html.HTMLConfiguration;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;O:P&gt;&amp;nbsp;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;O:P&gt;&amp;nbsp;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;public class HTMLSAXParser extends   AbstractSAXParser {&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;public   HTMLSAXParser() {&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;super(new HTMLConfiguration());&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;/SPAN&gt;}&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;}&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;STRONG&gt;&lt;SPAN   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;三、设置解析器参数&lt;SPAN   lang=EN-US&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;　　为了更加精确的控制解析的动作，&lt;SPAN   lang=EN-US&gt;nekohtml&lt;/SPAN&gt;提供了相应的设置函数。如下列：&lt;SPAN lang=EN-US&gt;   &lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;// settings on   HTMLConfiguration&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;org.apache.xerces.xni.parser.XMLParserConfiguration   config =&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;new   org.cyberneko.html.HTMLConfiguration();&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;config.setFeature("http://cyberneko.org/html/features/augmentations",   true);&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;config.setProperty("http://cyberneko.org/html/properties/names/elems",   "lower");&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;O:P&gt;&amp;nbsp;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;O:P&gt;&amp;nbsp;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;// settings on DOMParser&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;org.cyberneko.html.parsers.DOMParser   parser = &lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;new   org.cyberneko.html.parsers.DOMParser();&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;parser.setFeature("http://cyberneko.org/html/features/augmentations",   true);&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;parser.setProperty("http://cyberneko.org/html/properties/names/elems",   "lower");&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;O:P&gt;&amp;nbsp;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: center" align=center&gt;&lt;STRONG&gt;&lt;SPAN   lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;nekohtml&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;STRONG&gt;&lt;SPAN   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;功能&lt;SPAN   lang=EN-US&gt;(feature)&lt;/SPAN&gt;列表&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;DIV align=center&gt;  &lt;TABLE class=MsoNormalTable cellPadding=0 border=1&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;功能&lt;SPAN         lang=EN-US&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;默认值&lt;SPAN         lang=EN-US&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;描述&lt;SPAN         lang=EN-US&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;    &lt;TR&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;http://cyberneko.org/html/features/balance-tags         &lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;True&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;是否允许增补缺失的标签。如果要以&lt;SPAN         lang=EN-US&gt;XML&lt;/SPAN&gt;方式操作&lt;SPAN         lang=EN-US&gt;HTML&lt;/SPAN&gt;文件，此值必须为真。此处提供设置功能，为了性能的原因。&lt;SPAN         lang=EN-US&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;    &lt;TR&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;http://cyberneko.org/html/features/balance-tags/ignore-outside-content         &lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;False&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;是否忽略文档根元素以后的数据。如果为&lt;SPAN         lang=EN-US&gt;false&lt;/SPAN&gt;，&lt;SPAN lang=EN-US&gt;&amp;lt;html&amp;gt;&lt;/SPAN&gt;和&lt;SPAN         lang=EN-US&gt;&amp;lt;bod&amp;gt;&lt;/SPAN&gt;被忽略，所有的内容都被解析。&lt;SPAN         lang=EN-US&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;    &lt;TR&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;http://cyberneko.org/html/features/document-fragment         &lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;False&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;解析&lt;SPAN         lang=EN-US&gt;HTML&lt;/SPAN&gt;片段时是否作标签增补。此功能不要用在&lt;SPAN         lang=EN-US&gt;DOMParser&lt;/SPAN&gt;上，而要用在&lt;SPAN         lang=EN-US&gt;DOMFragmentParser&lt;/SPAN&gt;上。&lt;SPAN         lang=EN-US&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;    &lt;TR&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;http://apache.org/xml/features/scanner/notify-char-refs         &lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;False&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;当遇到字符实体引用（如＆&lt;SPAN         lang=EN-US&gt;#x20;&lt;/SPAN&gt;）是否将&lt;SPAN lang=EN-US&gt;(#x20)&lt;/SPAN&gt;报告给相应地文档处理器。&lt;SPAN         lang=EN-US&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;    &lt;TR&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;http://apache.org/xml/features/scanner/notify-builtin-refs         &lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;False&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;当遇到&lt;SPAN         lang=EN-US&gt;XML&lt;/SPAN&gt;内建的字符实体引用（如＆&lt;SPAN lang=EN-US&gt;amp;&lt;/SPAN&gt;）是否将&lt;SPAN         lang=EN-US&gt;(amp)&lt;/SPAN&gt;报告给相应地文档处理器。&lt;SPAN         lang=EN-US&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;    &lt;TR&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;http://cyberneko.org/html/features/scanner/notify-builtin-refs         &lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;False&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;当遇到&lt;SPAN         lang=EN-US&gt;HTML&lt;/SPAN&gt;内建的字符实体引用（如＆&lt;SPAN lang=EN-US&gt;copy;&lt;/SPAN&gt;）是否将&lt;SPAN         lang=EN-US&gt;(copy)&lt;/SPAN&gt;报告给相应地文档处理器。&lt;SPAN         lang=EN-US&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;    &lt;TR&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;http://cyberneko.org/html/features/scanner/script/strip-comment-delims         &lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;False&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;是否剥掉&lt;SPAN         lang=EN-US&gt;&amp;lt;script&amp;gt;&lt;/SPAN&gt;元素中的&lt;SPAN lang=EN-US&gt;&amp;lt;!--         --&amp;gt;&lt;/SPAN&gt;等注释符。&lt;SPAN lang=EN-US&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;    &lt;TR&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;http://cyberneko.org/html/features/augmentations         &lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;False&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;是否将与&lt;SPAN         lang=EN-US&gt;HTML&lt;/SPAN&gt;事件有关的&lt;SPAN lang=EN-US&gt;infoset&lt;/SPAN&gt;项包括在解析管道中。&lt;SPAN         lang=EN-US&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;    &lt;TR&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;http://cyberneko.org/html/features/report-errors         &lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;False&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;是否报告错误。&lt;SPAN         lang=EN-US&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: center" align=center&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;BR&gt;&lt;STRONG&gt;nekohtml&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;属性列表&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;DIV align=center&gt;  &lt;TABLE class=MsoNormalTable cellPadding=0 border=1&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;属性&lt;SPAN         lang=EN-US&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;默认值&lt;SPAN         lang=EN-US&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;值域&lt;SPAN         lang=EN-US&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;描述&lt;SPAN         lang=EN-US&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;    &lt;TR&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;http://cyberneko.org/html/properties/filters         &lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;null&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;XMLDocumentFilter[]         &lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;在解析管道的最后按数组顺序追加自定义的处理组件（过滤器），必须为数组类型。&lt;SPAN         lang=EN-US&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;    &lt;TR&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;http://cyberneko.org/html/properties/default-encoding         &lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;Windows-1252&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;IANA encoding         names&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;默认的&lt;SPAN         lang=EN-US&gt;HTML&lt;/SPAN&gt;文件编码&lt;SPAN     lang=EN-US&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;    &lt;TR&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;http://cyberneko.org/html/properties/names/elems         &lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;upper&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;upper,lower,match&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;如果整理识别出的元素名称&lt;SPAN         lang=EN-US&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;    &lt;TR&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;http://cyberneko.org/html/properties/names/attrs         &lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;lower&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;upper,lower,no-change&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;      &lt;TD       style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;        &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN         style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;如果整理识别出的属性名称&lt;SPAN         lang=EN-US&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: center" align=center&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;O:P&gt;&amp;nbsp;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;O:P&gt;&amp;nbsp;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;STRONG&gt;&lt;SPAN   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;四、管道过滤器&lt;SPAN   lang=EN-US&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;　　&lt;SPAN lang=EN-US&gt;Xerces Native   Interface   (XNI)&lt;/SPAN&gt;定义了一个解析器配置框架，在那儿一个个解析器以模块化组件的形式组成一个管道。这样一来，通过重新安排已有组件和&lt;SPAN   lang=EN-US&gt;/&lt;/SPAN&gt;或新定制开发的组件，就可完成一个新的解析器配置工作。由于&lt;SPAN   lang=EN-US&gt;nekohtml&lt;/SPAN&gt;是采用这个配置框架开发的，所以对解析器新增功能就很简单通过在默认的&lt;SPAN   lang=EN-US&gt;nekohtml&lt;/SPAN&gt;解析管道的末端增加文档过滤器来实现。&lt;SPAN   lang=EN-US&gt;&lt;BR&gt;&lt;/SPAN&gt;　　要新开发一个过滤器，很简单地实现&lt;SPAN lang=EN-US&gt;xerces2&lt;/SPAN&gt;的&lt;SPAN   lang=EN-US&gt;org.apache.xerces.xni.parser&lt;/SPAN&gt;包中的&lt;SPAN   lang=EN-US&gt;XMLDocumentFilter&lt;/SPAN&gt;接口即可。这个接口，一方面使组件成为管道中上一级的事件处理器，另一方面又成为下级的信息源。针对&lt;SPAN   lang=EN-US&gt;nekohtml&lt;/SPAN&gt;的过滤器开发，只需简单地扩展&lt;SPAN   lang=EN-US&gt;org.cyberneko.html.filters&lt;/SPAN&gt;包中的&lt;SPAN   lang=EN-US&gt;DefaultFilter&lt;/SPAN&gt;类即可。&lt;SPAN   lang=EN-US&gt;&lt;BR&gt;&lt;/SPAN&gt;　　将自行开发的过滤器加入管道，可参考以下两种办法：&lt;SPAN lang=EN-US&gt;   &lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;XMLDocumentFilter noop = new   DefaultFilter();&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;XMLDocumentFilter[] filters = { noop   };&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;O:P&gt;&amp;nbsp;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;O:P&gt;&amp;nbsp;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;XMLParserConfiguration parser = new   HTMLConfiguration();&lt;BR&gt;&amp;lt;!--[if   !supportLineBreakNewLine]--&amp;gt;&lt;BR&gt;&amp;lt;!--[endif]--&amp;gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;parser.setProperty("http://cyberneko.org/html/properties/filters",   filters);&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;　　&lt;SPAN   lang=EN-US&gt;nekohtml&lt;/SPAN&gt;的&lt;SPAN lang=EN-US&gt;org.cyberneko.html.filters   &lt;/SPAN&gt;包中有&lt;SPAN lang=EN-US&gt;DefaultFilter&lt;/SPAN&gt;、&lt;SPAN   lang=EN-US&gt;&lt;BR&gt;ElementRemover&lt;/SPAN&gt;、&lt;SPAN lang=EN-US&gt;Identity&lt;/SPAN&gt;、&lt;SPAN   lang=EN-US&gt;Writer&lt;/SPAN&gt;，能实现动态插入内容、删除元素、序列化&lt;SPAN   lang=EN-US&gt;HTML&lt;/SPAN&gt;文档等，不详细述。&lt;SPAN lang=EN-US&gt; &lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;请参考：&lt;SPAN   lang=EN-US&gt;&lt;BR&gt;DOMAPI&lt;/SPAN&gt;学习&lt;SPAN   lang=EN-US&gt;&lt;BR&gt;http://hedong.3322.org/archives/000228.html&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;  &lt;P class=MsoNormal style="TEXT-ALIGN: left" align=left&gt;&lt;SPAN lang=EN-US   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;SAXAPI&lt;/SPAN&gt;&lt;SPAN   style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"&gt;学习笔记（&lt;SPAN lang=EN-US&gt;2&lt;/SPAN&gt;）&lt;SPAN   lang=EN-US&gt;&lt;BR&gt;http://hedong.3322.org/archives/000232.html&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;/FONT&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5906929445033990464-3101987471748832014?l=irlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5906929445033990464&amp;postID=3101987471748832014&amp;isPopup=true' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/3101987471748832014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/3101987471748832014'/><link rel='alternate' type='text/html' href='http://irlab.blogspot.com/2007/11/nekohtml-zhuan.html' title=' NekoHTML学习笔记  (zhuan)'/><author><name>xlqb</name><uri>http://www.blogger.com/profile/07757898792107625243</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5906929445033990464.post-6882941991080215689</id><published>2007-11-13T23:40:00.001+08:00</published><updated>2007-11-13T23:40:51.230+08:00</updated><title type='text'>Inside Lucene/超人气搜索引擎学习 </title><content type='html'>&lt;DIV&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;  &lt;DIV class=postText&gt;&lt;SPAN   class=tpc_content&gt;转：http://www.lucene.org.cn/read.php?tid=65&lt;BR&gt;&amp;lt;搜索引擎的典型周期:   搜集数据-&amp;gt;建立索引-&amp;gt;应答搜索请求&amp;gt;&lt;BR&gt;&lt;BR&gt;无 论有多少精彩的应用, 这个印刷时代就诞生的公式都不会作废, 公式中最关键的成分是   1. 数据, 2.算法. 虽然二者中谁对结果质量更重要依然引起争论, 我的精力并未放在这两者上. 关于spider已有数本出名的专著,   算法原理的本质也早不是秘密, 这是搜索引擎必备的条件, 是基础设备而不是制胜的杀手锏. 面对一个活生生的搜索引擎, 研究这两者就像面对解剖台上的小白鼠,   却放下手术刀去查上课用的内脏图解. 我只注意实现, 实现是商业效率的体现, 这才是真刀真枪狼烟四起的地方.&lt;BR&gt;&lt;BR&gt;抛开数据采集,   上边的周期分成两个相(phase), 1. Indexing(建立索引), 2.Searching(搜索). 还有一个现在看来显得古怪的词-检索,   图书馆系统大多用这个词. 中国人的词汇总是显得睿智, "索"本有求取寻找的意思, "索引"原本就是为搜索创造的.   那些题目是"倒排索引原理"大篇幅对索引和模式匹配进行比较的文章, 因此有些让人哭笑不得.   上述的两个phase正是lucene覆盖的范围(Lucene核心不提供crawler), 这两个phase一个用于生成索引(index),   一个用于从index取出数据, 可以看出Lucene的一切行为都和index有关. 幸好Lucene官方指南 Lucene in Action   在附录中用浅显的语言介绍了index的结构, 这让人了解Lucene怎么把一片片文档塞进去, 就像绞肉机把一片片五花肉里脊肉搅成肉酱. 但是有点遗憾的感觉:   搜索过程怎么把index中支离破碎的数据记录(index的结构用法着实很像数据库)恢复成检索结果?   就像主妇们怎么用屠夫的肉酱作出香喷喷的肉丸?&lt;BR&gt;&lt;BR&gt;我从Query 的构造开始, 详细检验了Lucene处理Query的过程.   这种努力使我了解到index中的记录(就是数据库中的record概念), 如何在检索过程中起作用. 这是深入把握Lucene实现的基础,   若要对Lucene作基础的调整和改动, 自然缺不了这一步(这是我的动机之一). 这种探索也帮助我了解原始文档资料的各种属性如何决定搜索结果,   进一步的研究可以揭示出文档各属性的重要性以及文档对查询条件的敏感性, 从这里出发可以提炼出更普遍的原理, 再结合通用的Search Engine原理,   把"Search Engine是什么, 长什么样"深深地刻在脑海中. 这对我是一次很好的搜索引擎进阶的途径. 接下来的就是所谓SE优化( Search   Engine Optimizing ), 不敢讲这种天怒人怨的话题...&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN   class=tpc_content&gt;Inside   Lucene/超人气搜索引擎学习(1)-查询机制&lt;BR&gt;TAG：framework_lucene&lt;BR&gt;Searching with TermQuery   查询机制&lt;BR&gt;任 何用户, 包括系统开发者, 使用搜索引擎的共同方式只有一个: 查询(query). 整个搜索过程的目的是为了满足查询要求,   搜索过程是由查询贯穿的. 若没有指定查询, 而是从索引(index)的内容出发, "搜索"将是漫无目的且毫无意义的过程.   搜索过程的起点只能是索引.&lt;BR&gt;&lt;BR&gt;以下引用自Lucene in Action 的入门章节, 在其中能看到Query是如何用来启动查询的.&lt;BR&gt;  &lt;DIV style="FONT-SIZE: 9px; MARGIN-LEFT: 5px"&gt;&lt;STRONG&gt;CODE:&lt;/STRONG&gt;&lt;/DIV&gt;  &lt;DIV class=quote id=code1&gt;&lt;BR&gt;public class BasicSearchingTest extends   LiaTestCase {&lt;BR&gt;public void testTerm() throws Exception {&lt;BR&gt;IndexSearcher   searcher = new IndexSearcher(directory);&lt;BR&gt;Term t = new Term("subject",   "ant");&lt;BR&gt;Query query = new TermQuery(t);&lt;BR&gt;Hits hits =   searcher.search(query);&lt;BR&gt;assertEquals("JDwA", 1, hits.length());&lt;BR&gt;&lt;BR&gt;t =   new Term("subject", "junit");&lt;BR&gt;hits = searcher.search(new   TermQuery(t));&lt;BR&gt;assertEquals(2,   hits.length());&lt;BR&gt;&lt;BR&gt;searcher.close();&lt;BR&gt;&lt;BR&gt;}&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;&lt;/DIV&gt;  &lt;DIV style="FONT-SIZE: 11px; MARGIN-LEFT: 5px"&gt;&lt;A   onclick="CopyCode(document.getElementById('code1'));" href="javascript:"&gt;[Copy   to clipboard]&lt;/A&gt;&lt;/DIV&gt;&lt;BR&gt;被 称为面向对象设计经典范例的Lucene, 其架构确实能反映"查询"行为在真实世界模式,   这不愧是OOA/OOD方法带来的成熟设计. 这也让我对Lucene设计者的软件设计能力产生充足的敬佩, 要知道人家可是研究算法的.   通常搞学术和搞工程的人思想极不统一, 我同学在微软工作时曾经为研究院和工程院的代码差异头疼不已. Lucene的设计者们能把算法和代码集合得如此完美,   可以说是牛中之牛了.&lt;BR&gt;&lt;BR&gt;我真正关心的是搜索算法如何依据Query导出查询结果. 上面的代码给我一些启示, 我知道了起点,   从searcher.search(query)开始, 我可以一步步了解Query在搜索过程里的作用机制.&lt;BR&gt;为 了满足真实世界的语义,   Lucene提供了众多Query. 上面代码中的TermQuery是最简单的Query, 日常搜索有许多直接或间就由TermQuery组合而成.   search(termQuery)的构造最基础, 不经过繁琐的转换. 所以我从TermQuery出发,   一步步考察搜索的核心机制.&lt;BR&gt;&lt;BR&gt;进入search 方法前, 我了解了这些限制条件: TermQuery的语义中每一个Term指一个(field,   keyword)对, 其描述的查询条件是: "在指定的字段(标题、作者、内容...)中出现指定的keyword";   高级的search方法可以处理自定义的Filter, Sort, 此处的考察对象是不假这些自定义选项的最简单的search.&lt;BR&gt;&lt;BR&gt;有了以上的限制,   我考察的对象--TermQuery查询过程已经被彻底简化了. 但在他和更复杂的重载方法中, 开发人员应用了相同的思路, 举一反三是我们可以期望做到的.&lt;BR&gt;  &lt;DIV style="FONT-SIZE: 9px; MARGIN-LEFT: 5px"&gt;&lt;STRONG&gt;CODE:&lt;/STRONG&gt;&lt;/DIV&gt;  &lt;DIV class=quote id=code2&gt;&lt;BR&gt;public class IndexSearcher extends Searcher   {&lt;BR&gt;public TopDocs search(Query query, Filter filter, final int   nDocs)&lt;BR&gt;&amp;nbsp; &amp;nbsp; throws IOException {&lt;BR&gt;Scorer scorer =   query.weight(this).scorer(reader);&lt;BR&gt;if (scorer == null)&lt;BR&gt;&amp;nbsp; return new   TopDocs(0, new ScoreDoc[0]);&lt;BR&gt;&lt;BR&gt;final BitSet bits =   filter!=null?filter.bits(reader):null;&lt;BR&gt;final HitQueue hq = new   HitQueue(nDocs);&lt;BR&gt;final int[] totalHits = new int[1];&lt;BR&gt;scorer.score(new   HitCollector() {&lt;BR&gt;&amp;nbsp; public final void collect(int doc, float score)   {&lt;BR&gt;&amp;nbsp; if (score &amp;gt; 0.0f &amp;amp;&amp;amp; &lt;BR&gt;&amp;nbsp; &amp;nbsp; (bits==null ||   bits.get(doc))) { &lt;BR&gt;&amp;nbsp; totalHits[0]++;&lt;BR&gt;&amp;nbsp; hq.insert(new   ScoreDoc(doc, score));&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;});&lt;BR&gt;&lt;BR&gt;ScoreDoc[]   scoreDocs = new ScoreDoc[hq.size()];&lt;BR&gt;for (int i = hq.size()-1; i &amp;gt;= 0;   i--)&lt;BR&gt;&amp;nbsp; scoreDocs[i] = (ScoreDoc)hq.pop();&lt;BR&gt;&lt;BR&gt;return new   TopDocs(totalHits[0], scoreDocs);&lt;BR&gt;}&lt;BR&gt;...&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;&lt;/DIV&gt;  &lt;DIV style="FONT-SIZE: 11px; MARGIN-LEFT: 5px"&gt;&lt;A   onclick="CopyCode(document.getElementById('code2'));" href="javascript:"&gt;[Copy   to clipboard]&lt;/A&gt;&lt;/DIV&gt;&lt;BR&gt;主干流程是:1.获取scorer对象&lt;BR&gt;  &lt;DIV style="FONT-SIZE: 9px; MARGIN-LEFT: 5px"&gt;&lt;STRONG&gt;CODE:&lt;/STRONG&gt;&lt;/DIV&gt;  &lt;DIV class=quote id=code3&gt;&lt;BR&gt;Scorer scorer =   termQuery.weight.scorer(indexReader)&lt;BR&gt;&lt;BR&gt;2.调用这个Scorer对象(此处是TermScorer)的score   (Collector)方法.&lt;BR&gt;scorer.score(new HitCollector() {&lt;BR&gt;...&lt;BR&gt;});&lt;BR&gt;&lt;BR&gt;&lt;/DIV&gt;  &lt;DIV style="FONT-SIZE: 11px; MARGIN-LEFT: 5px"&gt;&lt;A   onclick="CopyCode(document.getElementById('code3'));" href="javascript:"&gt;[Copy   to clipboard]&lt;/A&gt;&lt;/DIV&gt;&lt;BR&gt;这 两步之后, collector就把hq用查询结果填满了, 而用户得到的结果就是从hq中一个一个取出的.   这段代码中, indexReader用于读取index数据, 以供查询使用, Scorer负责用查询结果把Collector填满.   问题是,scorer的'查询结果'从哪里来? 如果IndexReader向Scorer提供数据, 数据内容是如何从索引文件中选取的?&lt;BR&gt;&lt;BR&gt;Scorer   用一个匿名类Collector来收集满足TermQuery的Doc, 但Scorer怎么能够知道哪些文档符合Query?   真实查询并非在score()方法中进行, 从数据提取的角度来说, 现代搜索引擎都是从inverted index中提取的满足Term的文档列表.   是个人都知道inverted index里有什么, 由指定的keyword得到所有对应的文档就是利用inverted index数据结构完成的,   这也是搜索过程的核心--一个延续了数百年的索引方法. 我要考察的是, 在这个新式的OO搜索引擎框架中, 谁(哪个对象/类)负责提取term对应的记录,   他怎样把结果交给Scorer?&lt;BR&gt;&lt;BR&gt;读取inverted index是IndexReader的责任, 这时已经提到过的.   关于这一点的知识来自于Lucene手册中星星点点的暗示和大量的代码阅读, 此处不纠缠这个问题, 现在关心的是Scorer和IndexReader怎样发生联系?   回忆一下上边的代码中TermQuery创建Scorer时用的参数, 正是IndexReader对象,   动动脚趾头也猜得出来TermQuery利用"创建"这种特权对score秘密动了手脚. 现在瞄一眼weight在构造scorer时玩了什么花样.   代码是这样写的&lt;BR&gt;  &lt;DIV style="FONT-SIZE: 9px; MARGIN-LEFT: 5px"&gt;&lt;STRONG&gt;CODE:&lt;/STRONG&gt;&lt;/DIV&gt;  &lt;DIV class=quote id=code4&gt;&lt;BR&gt;public scorer weight#scorer(IndexReader   reader){&lt;BR&gt;TermDocs termDocs = reader.termDocs(term);&lt;BR&gt;&amp;nbsp; &lt;BR&gt;if   (termDocs == null)&lt;BR&gt;&amp;nbsp; return null;&lt;BR&gt;&amp;nbsp; &lt;BR&gt;return new   TermScorer(this, termDocs, getSimilarity(searcher),&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;   &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;   reader.norms(term.field()));&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;class Scorer{&lt;BR&gt;...&lt;BR&gt;public void   score(HitCollector hc) throws IOException {&lt;BR&gt;&amp;nbsp; while (next()) {&lt;BR&gt;&amp;nbsp;   &amp;nbsp; hc.collect(doc(), score());&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;}&lt;BR&gt;...&lt;BR&gt;public boolean   next() throws IOException {&lt;BR&gt;&amp;nbsp; pointer++;&lt;BR&gt;&amp;nbsp; if (pointer &amp;gt;=   pointerMax) {&lt;BR&gt;&amp;nbsp; pointerMax = termDocs.read(docs, freqs); &amp;nbsp; //   refill buffer&lt;BR&gt;&amp;nbsp; if (pointerMax != 0) {&lt;BR&gt;&amp;nbsp; &amp;nbsp; pointer =   0;&lt;BR&gt;&amp;nbsp; } else {&lt;BR&gt;&amp;nbsp; &amp;nbsp; termDocs.close(); &amp;nbsp; // close   stream&lt;BR&gt;&amp;nbsp; &amp;nbsp; doc = Integer.MAX_VALUE; &amp;nbsp; // set to sentinel   value&lt;BR&gt;&amp;nbsp; &amp;nbsp; return false;&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; doc =   docs[pointer];&lt;BR&gt;&amp;nbsp; return true;&lt;BR&gt;}&lt;BR&gt;...&lt;BR&gt;}&lt;BR&gt;&lt;/DIV&gt;  &lt;DIV style="FONT-SIZE: 11px; MARGIN-LEFT: 5px"&gt;&lt;A   onclick="CopyCode(document.getElementById('code4'));" href="javascript:"&gt;[Copy   to clipboard]&lt;/A&gt;&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;可 以看出, 上面的问题唯一可能的答案是:   weight在构造Scorer时已经为Scorer决定了查询内容就在那个termDocs里. Scorer的代码也表明,   它在遍历所有合法文档时,背后的查询动作是在穷举一个数组:doc[], 而这个数组的来源就是TermDocs.   剩下的问题是,TermDoc在整个查询中扮演何种角色--它是怎么读数据的&lt;BR&gt;&lt;BR&gt;看看TermDoc是个虾米东东&lt;BR&gt;reader   创建好TermDoc后调用TermDoc.seek(term). 这个方法在硬盘索引文件中找到term所对应的所有文档记录,   每条记录包含文档id和term在文档中出现的次数tf. 这些文档信息是编制索引时就建好的, 索引文件中每个term对应的文档记录按顺序紧密排列在一起,   seek方法能找到这些记录在索引中的开始位置及满足term的文档总数. 以后,   TermDoc在scorer中的作用就是读入每个符合term的文档及term在该文档中的tf, 由于建好了索引只需在索引文件中遍历即可,   termDoc包含的df将用于此过程的遍历计数.就是说scorer接收到的那个termDoc是调用过seek的,   已经定位到了term对应的数据位置,这便让scorer能遍历termQuery中所有包含那个term的Doc.&lt;BR&gt;&lt;BR&gt;scorer怎样遍历全部doc&lt;BR&gt;读   数据又是另一门学问, 感兴趣的人也许研究过读一个100M文件,与读1000个1K   byte文件有何区别,结果当然是震撼的.只要有可能,尽量读取整块数据而不是零碎地读取小数总不会让人失望，然而同样没有人会在构造一个对象时就去对一   个未知大小(可能真的包含100万个文档)的数据.只要没收到必要请求,任何人都会尽力避免这种冗长的操作.   Lucene的设计者同样只是让在scorer在需要读入数据即第一次调用next()方法时调用termDoc的read方法读数据(代码中黑体部   分).为了避免零碎读取降低硬盘效率,termDoc.read()会一次性读入所有合法文档(当然仅包括文档id和tf,   建立索引的过程中,这两个数据一组组的放在专门的文件中,每个term对应的全部文档在这个文件里连续排列以避免零碎读取),scorer调用next   ()语句,遍历read()返回的文档id数组,整个遍历过程只需把读出来的doc&lt;EM&gt;里的i进行++便万事大吉.&lt;BR&gt;&lt;BR&gt;遍历过程中发生什么   事情大家心里应该很清楚,无非是把这些doc(这就是搜索结果)一个个添加到Collector中. 查询结束后, 我们将得到一个int数组,   里面保存着每个结果文档的id. 要使用这些查询结果,用户还需要从按照每篇文档的id文档库中取出结果,   这些只需调用searcher.doc(id)即可完成的事务性过程不在本"技术"文章讨论范围中.&lt;BR&gt;&lt;BR&gt;所谓搜索原来如此简单...&lt;BR&gt;&lt;BR&gt;&lt;/EM&gt;&lt;/SPAN&gt;&lt;SPAN   class=tpc_content&gt;Inside   Lucene/超人气搜索引擎学习(1.5)-面向对象&lt;BR&gt;TAG：framewok_lucene&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;OO In Lucene Search   面向对象的Lucene&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;Nutch 正式立项以后, Apache 基金会的incubator里现存Lucene相关项目还有一个:   Lucene4C. 顾名思义, 这是一个完完全全用C做成的搜索引擎, 很多对用Java做SE有意见的哥们热烈盼望这个东东快点孵化出来.   不过我担心已经已经用惯Lucene Java的同志们对Lucene4C的热情纯属叶公好龙, 理由很简单, 就像Lucene4C的说明中提到的,   Lucene4C和Lucene Java的兼容是"底层兼容"即算法和索引格式的兼容, Lucene4C只是为那些惯于C代码的程序员而专门设计. 换言之,   虽然我们可以用Lucene4C搜索LuceneJava的索引或反过来用, 但绝对别指望Doug Cutting们会提供一个类似Java的接口API.   即使不提编程风格的差异, 那些只会把继承后的对象扔给API的家伙们怎么能在没有类的世界中生存呢, 没有了对象封装, 没有OCP/SRP, 还要处理种种指针,   光是调用memset/strcpy就够他们抓狂了.&lt;BR&gt;&lt;BR&gt;从top level来讲, 将OOD的作品移植到C, 不仅是个浩大的工程,   还是个没法预期结果的定时炸弹. 不过我还是很盼望看到Lucene4C的成品, 我想抓住它的代码一行一行的读. 两种截然不同的设计理念生出一对双胞胎,   我要瞧瞧它们有什么不同, 相信Apache的天才们能让我在对比中学到很多.&lt;BR&gt;&lt;BR&gt;所以要先搞清楚OO在Lucene中如何体现.&lt;BR&gt;&lt;BR&gt;在   利用TermQuery这个最基本的Query研讨查询机制后, 细心观察就会发现, 本来满以为用来实现查询机制的那个类Searcher,   其实和检索机制几乎毫无瓜葛, 就算有, 也不过是调用各参数的方法, 把这个作为那个的参数, 再把那个传给另外的某某. 诸如此类. Searcher是个指挥家,   负责调度各功能使之协调, 用OO的话说, 就是对象间的协作. 各对象的功能被Searcher的操作过程利用了, 至于这些功能如何实现,   Searcher全然不知.&lt;BR&gt;&lt;BR&gt;OO的一大强项是业务逻辑层面的简洁表达, 清晰的语义甚至可以用优雅来形容. 这可以视为高内聚低耦合设计的副产品.   Searcher.search()方法描述的逻辑是, Query把满足查询条件的文档ID结果放到Scorer中, Scorer把结果塞进Collector.   这里还有个暗示的语义: 无论输入顺序是什么Collector中的结果总是按照score排序的. 从上述语义出发,   很容易分辨出职责的内聚以及类间的耦合关系.&lt;BR&gt;具体 考察一下TermQuery, 才更好理解内聚和耦合度. 在TermQuery的查询中,   对文档是否符合Term条件的判断由TermQuery负责, 而评分则由TermScorer负责. 单一职责原则SRP体现得非常明显, 而正是由于SRP被满足,   Query/Scorer的耦合才得以解开.&lt;BR&gt;&lt;BR&gt;设计的过程中, 职责内聚和抽象往往是同时完成. 所以在了解了Query/Scorer的职责后,   Lucene的类结构显示出另一个十分重要的特性: 这就是开头提到的, Searcher与Query的查询过程无关. Searcher所要面对的查询是无类型的,   它需要处理各种查询. 查询的共同外部特征(在这里就是Searcher能访问的那些成员)抽象成了Query接口, Searcher与Scorer的关系也是这样.   由于使用了面向对象技术中至关重要的多态性, Searcher只面对接口(依赖倒置原则DIP),   这样就把查询的业务逻辑同各查询类型的算法逻辑有效的隔离开(解耦合)了. 这是职责内聚的结果, 同时也是把"查询"概念高度抽象的结果.&lt;BR&gt;&lt;BR&gt;于   是我们看到Searcher实现了针对"查询"的业务逻辑的描述, 对任何种类的查询, 这一业务流程都适用(抽象), 而如何实现查询的算法(结果提取和评分),   则是Query/Searcher各实现类负责(内聚). 这么做的好处不言而喻――OCP, 对扩展来说, Lucene是完全开放的,   而对更改则是封闭因而是安全的.&lt;BR&gt;设想现在需要查询连续出现的Term, 单个TermQuery当然不够用, 检索算法已经变了.   但我们不需要改变现存任何一个类, 只要构建新的Query/Scorer实现类, 比如PhraseQuery/Scorer. 目前Lucene   1.4.3版已经提供这样一个检索类型.&lt;BR&gt;&lt;BR&gt;当然, Lucene是OOD方法的杰作, 不止上述几点, 在各个实现层次上都能找到类似的设计痕迹,   这为整个软件包的扩展和应用提供了强大的架构保证. 相信这也是Lucene得以流行的深层原因.&lt;BR&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN   class=tpc_content&gt;Inside Lucene/超人气搜索引擎学习(2.0)-读取索引&lt;BR&gt;上一节 下一节 &lt;BR&gt;&lt;BR&gt;Index in   Practice 索引: 按图索骥&lt;BR&gt;&lt;BR&gt;TermDoc从哪读取数据,自然是硬盘上已经建好的某个index, 具体说, 是从index中的某个文件读取.   要了解TermDoc读了什么东东,怎么读这些东东,必要时得考察Lucene   index的细部结构.&lt;BR&gt;&lt;BR&gt;TermDoc是个抽象类,这很好,以后可以创建自己的index结构,建立自己的搜索算法.不过这之前先要了解Lucene是怎么干的,而这个抽象类并不包含这个信息,所以,我们首先要找到TermQuery使用哪个TermDoc实现.&lt;BR&gt;&lt;BR&gt;回想一下scorer中的TermDoc从哪里来.&lt;BR&gt;&lt;BR&gt;public   class TermQuery extends Query {&lt;BR&gt;private class TermWeight implements Weight   {&lt;BR&gt;&amp;nbsp; public Scorer scorer(IndexReader reader) throws IOException   {&lt;BR&gt;&amp;nbsp; &amp;nbsp; TermDocs termDocs = reader.termDocs(term);&lt;BR&gt;&amp;nbsp; &amp;nbsp;   &lt;BR&gt;&amp;nbsp; &amp;nbsp; if (termDocs == null)&lt;BR&gt;&amp;nbsp; &amp;nbsp; return null;&lt;BR&gt;&amp;nbsp;   &amp;nbsp; &lt;BR&gt;&amp;nbsp; &amp;nbsp; return new TermScorer(this, termDocs,   getSimilarity(searcher),&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;   &amp;nbsp; &amp;nbsp; reader.norms(term.field()));&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;   ...&lt;BR&gt;}&lt;BR&gt;...&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;从这段代码能找到真正创建TermDocs的那个类: IndexReader&lt;BR&gt;用   哪个TermDocs实现并不是TermQuery说了算,而是IndexReader的权利. TermQuery得到怎样一个TermDocs,   全由我们传递给TermQuery.weight.scorer()的那个IndexReader决定.   将这个TermDocs定位到指定的Term也完全由IndexReader负责。很遗憾,IndexReader也是抽象类.   想知道内幕?先找找IndexReader实现类。&lt;BR&gt;&lt;BR&gt;如果按照用户手册的方法进行搜索,   IndexReader的一个静态方法将被调用,它返回我们需要的一个IndexReader实现:SegmentReader,   这是整个查询中用到的reader。&lt;BR&gt;&lt;BR&gt;顺藤摸瓜,很容易找到SegmentTermDocs这个类,也就是默认查询中SegmentReader使用的TermDocs,大部分查询结果通过这个类的实例来遍历.现在是时候翻它老底了,看看它怎么遍历数据,这些数据又从哪来.&lt;BR&gt;&amp;lt;code&amp;gt;&lt;BR&gt;class   IndexReader{&lt;BR&gt;public TermDocs termDocs(Term term) throws IOException   {&lt;BR&gt;&amp;nbsp; TermDocs termDocs = termDocs();&lt;BR&gt;&amp;nbsp;   termDocs.seek(term);&lt;BR&gt;&amp;nbsp; return termDocs;&lt;BR&gt;}&lt;BR&gt;...&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;class   SegmentReader extends IndexReader{&lt;BR&gt;public final TermDocs termDocs() throws   IOException {&lt;BR&gt;&amp;nbsp; return new   SegmentTermDocs(this);&lt;BR&gt;}&lt;BR&gt;...&lt;BR&gt;}&lt;BR&gt;&amp;lt;/code&amp;gt;&lt;BR&gt;&lt;BR&gt;从已经列出的代码中,   能清晰地看到SegmentTermDocs从创建到传递给scorer前进行的一系列动作:&lt;BR&gt;&lt;BR&gt;1. SegmentTermDocs构造:   根据parent设定自己的属性&lt;BR&gt;2. IndexReader调用TermDocs.seek(term);   实现类中这一步具体化为SegmentReader调用SegmentTermDocs.seek(term)&lt;BR&gt;&lt;BR&gt;第二步中,   SegmentTermDocs进行了实际对index文件的读取. 而为了进行这些IO操作, 像前边说的, 必须依靠IndexReader才能完成,   这就是SegmentTermDocs构造是需要参数SegmentReader的原因.&lt;BR&gt;&lt;BR&gt;seek   (term)方法中SegmentTermDocs利用构造函数的唯一参数IndexReader(也就是创建它的那个reader, 称作parent"),   在硬盘索引文件中定位指定的term, 读入相关信息:df(包含term的文档数), 以及满足该term的文档集合在index文件中的位置. 这个位置后面,   是创建索引时就已排好的包含这个term的文档信息. &lt;BR&gt;&lt;BR&gt;seek 完成后, TermDoc已经准备好读取数据了, 只要一声令下,   TermDoc.read方法立刻能把每一篇文档的id和该term在这篇文档中的次数tf. 前面的记载是, scorer对象调用read方法,   尔后遍历其返回的全部文档, 把他们一个个塞到Collector中&lt;BR&gt;&lt;BR&gt;精妙繁复的步骤: seek如何完成?&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;这要涉及索引结构,   现在可以掀开索引文件的一个角, 偷窥下.&lt;BR&gt;&lt;BR&gt;tis文件: Term InformationS&lt;BR&gt;frq文件:   FReQuency&lt;BR&gt;&lt;BR&gt;必 须注意到IO动作一定是在IndexReader的几个成员中作的, 所有其他类中的IO要么用这些成员的Clone来完成,   要么直接代理给IndexReader. SegmentTermDocs.seek(term)动作是通过IndexReader进行的,   SegmentTermDocs把创建他的IndexReader尊为parent, 在seek这种关键时刻利用IndexReader来读取索引数据. 没办法,   索引文件的读取(输入流的建立和定位)全由IndexReader负责. &lt;BR&gt;seek方法中为了实现定位而利用了IndexReader一个负责   Term定位的成员tis, 从他的类名TermInfoReader看就知道有什么用途. 这个tis从.tis文件中找到我们指定的term,   读出一切我们需要的信息: 这个term在多少个文档中出现过(df)/这些文档记录在frq文件的什么位置(起始位置) 等等.&lt;BR&gt;&lt;BR&gt;得到这 些信息后,   TermDoc再自己seek, 这一步很简单, 除了几个加法和赋值, 唯一有特色的是对.frq文件的输入流(FileInputStream)进行seek(),   seek()的数量正好是tis返回的"文档记录在frq文件中的位置". 这个流是IndexReader初始化时创建的, 专门从frq文件读数据.   IndexReader创建TermDoc时, TermDoc把这个输入流Clone()了一下, 赋给自己的成员.   这一seek()把.frq文件的输入指针定位好, 以后真正需要这个流的地方只有从frq文件读文档数据那一阵.   读数据的过程就发生在屡次提到过的termDoc.read()里,   现在我知道这个方法的实现是SegmentTermDocs.read().&lt;BR&gt;&lt;BR&gt;read ()的实现是简单的顺序读取文件流,   具体过程涉及Lucene索引文件的二进制结构, 我不想这时候过多地纠缠. 大致了解termDoc如何定位数据, 心中的疑惑就能解开一半.   关于索引文件结构、各文件的关系、程序如何厘清这些关系, 还值得更多的讨论. &lt;BR&gt;&lt;BR&gt;到这一步, 结合已熟知的scorer调用TermDoc的方式,   查询过程的基本途径已经隐约呈现出来了.&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&lt;/DIV&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;/FONT&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5906929445033990464-6882941991080215689?l=irlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5906929445033990464&amp;postID=6882941991080215689&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/6882941991080215689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/6882941991080215689'/><link rel='alternate' type='text/html' href='http://irlab.blogspot.com/2007/11/inside-lucene_13.html' title='Inside Lucene/超人气搜索引擎学习 '/><author><name>xlqb</name><uri>http://www.blogger.com/profile/07757898792107625243</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5906929445033990464.post-2885783509213019377</id><published>2007-11-13T17:46:00.000+08:00</published><updated>2007-11-13T17:44:32.962+08:00</updated><title type='text'>BlogSpot 限制访问解决方法</title><content type='html'>&lt;DIV&gt;&lt;FONT   face=Verdana&gt;对于BlogSpot的博客，我发现通过修改hosts文件还是可以间接访问的，具体方法是：编辑WINDOWS\system32\drivers\   etc\hosts 文件，然后加入72.14.219.190 xxx.blogspot.com   ，其中xxx是你的用户名，即可访问到你自己的BlogSpot了。&lt;/DIV&gt;  &lt;DIV&gt;&lt;FONT color=#c0c0c0&gt;&lt;FONT   size=2&gt;&lt;/FONT&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;/FONT&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5906929445033990464-2885783509213019377?l=irlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5906929445033990464&amp;postID=2885783509213019377&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/2885783509213019377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/2885783509213019377'/><link rel='alternate' type='text/html' href='http://irlab.blogspot.com/2007/11/blogspot.html' title='BlogSpot 限制访问解决方法'/><author><name>xlqb</name><uri>http://www.blogger.com/profile/07757898792107625243</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5906929445033990464.post-4681775118068418590</id><published>2007-11-10T19:31:00.001+08:00</published><updated>2007-11-10T19:31:21.368+08:00</updated><title type='text'>网络解释-- Yahoo VS Yodao</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Verdana&gt;&lt;FONT color=#c0c0c0&gt;&lt;FONT   size=2&gt;网络词典中的网络解释或网络释义这种功能，想象大家都比较喜欢，今天试着比较了yahoo的网络解释和&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;  &lt;DIV&gt;&lt;FONT face=Verdana&gt;&lt;FONT color=#c0c0c0 size=2&gt;有道的网络释义， 查了很多，结论居然是 yahoo   远远不如有道，真是晕到！&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;  &lt;DIV&gt;&lt;FONT face=Verdana&gt;&lt;FONT color=#c0c0c0 size=2&gt;看看下面的例子：&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;  &lt;DIV&gt;&lt;FONT face=Verdana color=#c0c0c0   size=2&gt;其实看看一些细节，就会明白强大的yahoo为什么中文搜索做不好，用户少，为什么163一直活的挺滋润的。&lt;/FONT&gt;&lt;/DIV&gt;  &lt;DIV&gt;&lt;FONT face=Verdana color=#c0c0c0 size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;  &lt;DIV&gt;&lt;FONT face=Verdana&gt;  &lt;H3&gt;网络解释 (&lt;STRONG&gt;mad cow disease&lt;/STRONG&gt;)&lt;/H3&gt;  &lt;DIV&gt;  &lt;OL&gt;    &lt;LI&gt;&lt;!-- &lt;h3&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt; --&gt;    &lt;H4&gt;疯牛病&lt;/H4&gt;    &lt;P&gt;macroelement 宏量元素&lt;BR&gt;Mad Cow Disease &lt;FONT     style="FONT-WEIGHT: bold; COLOR: rgb(0,0,0)"&gt;疯牛病&lt;/FONT&gt;&lt;BR&gt;magnesium     镁&lt;/P&gt;&lt;EM&gt;&lt;A class=ema     href="http://www.foodmate.net/english/speciality/11177.html"     target=_blank&gt;http://www.foodmate.net/english/speciality/11177.html&lt;/A&gt; - &lt;A     href="http://search.cn.yahoo.com/search?ei=UTF-8&amp;amp;p=%E7%96%AF%E7%89%9B%E7%97%85%2Bmad+cow+disease"     target=_blank&gt;搜索相关网页&lt;/A&gt;&lt;/EM&gt;     &lt;LI&gt;&lt;!-- &lt;h3&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt; --&gt;    &lt;H4&gt;狂牛症&lt;/H4&gt;    &lt;P&gt;德鲁克告诉你组织是什么和为什么,汉迪告诉你面对组织时个人该怎么办。.Unit 2 Deer Dying from Mad Cow Disease     鹿只死于&lt;FONT style="FONT-WEIGHT: bold; COLOR: rgb(0,0,0)"&gt;狂牛症&lt;/FONT&gt; Unit 3     Dolphins Can Recognize Themselves in Mirrors.&lt;/P&gt;&lt;EM&gt;&lt;A class=ema     href="http://www.joyo.com/book/detail.asp?prodid=zjbk355885&amp;amp;-293364547"     target=_blank&gt;http://www.joyo.com/book/detail.asp?prodid=zjbk355885&amp;amp;...&lt;/A&gt;     - &lt;A     href="http://search.cn.yahoo.com/search?ei=UTF-8&amp;amp;p=%E7%8B%82%E7%89%9B%E7%97%87%2Bmad+cow+disease"     target=_blank&gt;搜索相关网页&lt;/A&gt;&lt;/EM&gt;     &lt;LI&gt;&lt;!-- &lt;h3&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt; --&gt;    &lt;H4&gt;一则有关英国狂牛病&lt;/H4&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;/DIV&gt;  &lt;H4&gt;  &lt;TABLE class=engeng cellSpacing=0 cellPadding=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD style="PADDING-LEFT: 10px" width=79 height=22&gt;&lt;IMG         title=互联网的网页中对一些相关词语的翻译 height=22 alt=网络释义         src="http://dict.yodao.com/images/dictcetabb.gif" width=79 border=0&gt;&lt;/TD&gt;      &lt;TD class=tabline&gt;        &lt;TABLE class=wlsytab cellSpacing=0 cellPadding=0&gt;          &lt;TBODY&gt;          &lt;TR&gt;            &lt;TD class=attributem2p align=right height=21&gt;&amp;nbsp;&lt;A class=blue212n               title=展开以下所有词条的网页相关内容 onclick=displayAllDetail();               href="javascript:void(0)"&gt;展开模式&lt;/A&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;A               class=blue212n title=隐藏所有词条的网页相关内容 onclick=hideAllDetail();               href="javascript:void(0)"&gt;折叠模式&lt;/A&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;A               class=blue212n title=设置个人喜爱的默认显示方式，如默认使用展开模式，默认显示全部词条等               href="http://www.yodao.com/pref?gobackurl=http%3A%2F%2Fdict.yodao.com%2Fsearch%3Fq%3Dmad%2Bcow%2Bdisease%26tab%3Dchn&amp;amp;keyfrom=dict.webdict"&gt;偏好设置&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;!-- 网络互译标签结束 --&gt;  &lt;SCRIPT&gt;  function displayAllDetail(pref){      for (i=1;i&lt;=2;i++){          generateOneResult(i, true);      }  }    function hideAllDetail(pref){      for (i=1;i&lt;=2;i++){          generateOneResult(i, false);      }      }    function showOneDetail(){      for (i=1;i&lt;=2;i++){          if (i == 1){              generateOneResult(i, true);          }else{              generateOneResult(i, false);          }      }  }    function generateOneResult(pos, detail){      if (detail){          document.getElementById("resultDiv" + pos).innerHTML =           document.getElementById("resExpModeTit" + pos).innerHTML +              document.getElementById("resDetail" + pos).innerHTML;      }else{          document.getElementById("resultDiv" + pos).innerHTML = document.getElementById("resWrapModeTit" + pos).innerHTML;      }  }    function hideMoreWebMined(){      for (i=1;i&lt;=2;i++){          document.getElementById("resultDiv" + i).style.display = i==1 ? "block" : "none";      }      document.getElementById("showmoreWebMined").style.display = "block";      document.getElementById("hidemoreWebMined").style.display = "none";  }    function showMoreWebMined(){      for (i=1;i&lt;=2;i++){          document.getElementById("resultDiv" + i).style.display = "block";      }      document.getElementById("showmoreWebMined").style.display = "none";      document.getElementById("hidemoreWebMined").style.display = "block";          }  &lt;/SCRIPT&gt;    &lt;DIV id=resultDiv1 style="DISPLAY: block"&gt;&lt;!--webDictEMTitle start--&gt;  &lt;TABLE class=hit&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=dtstar vAlign=top&gt;&lt;A href="javascript:void(0)"&gt;&lt;IMG         id=statusImg1 title=隐藏包含这组词汇的网页的相关内容 onclick="generateOneResult(1, false)"         alt="" src="http://dict.yodao.com/images/hidenew2.gif" border=0&gt;&lt;/A&gt;&lt;/TD&gt;      &lt;TD class=dttitle1 id=titleTd1 vAlign=top align=left colSpan=2&gt;&lt;SPAN         id=keyLink1         onclick="generateOneResult(1, false);closePoptip('keyLink1');"&gt;&lt;B&gt;&lt;A         class=bluebigtt href="javascript:void(0)"&gt;Mad Cow         Disease&lt;/A&gt;&lt;/B&gt;&lt;/SPAN&gt;&lt;B&gt;: &lt;FONT class=p13&gt;&lt;FONT         color=#013694&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/B&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;!--webDictEMTitle end--&gt;&lt;!--webDictDetail start--&gt;  &lt;TABLE class=hit cellSpacing=0 cellPadding=0&gt;    &lt;TBODY&gt;    &lt;TR&gt;      &lt;TD class=morewidth&gt;&amp;nbsp;&lt;/TD&gt;      &lt;TD class=dtnumber&gt;&lt;B&gt;1&lt;/B&gt;.&lt;/TD&gt;      &lt;TD class=dttitle2&gt;&lt;FONT color=#013694&gt;&lt;B&gt;疯牛病&lt;/B&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;    &lt;TR&gt;      &lt;TD class=morewidth&gt;&amp;nbsp;&lt;/TD&gt;      &lt;TD class=dtnumber&gt;&amp;nbsp;&lt;/TD&gt;      &lt;TD class=dtcontent&gt;&lt;SPAN&gt;牛海绵状脑病(BSE),又称&lt;SPAN class=hl&gt;疯牛病&lt;/SPAN&gt;(&lt;SPAN         class=hl&gt;Mad Cow         Disease&lt;/SPAN&gt;),是牛的一种神经性、渐进性、致死性疾病.病牛临床表现为对触、听、视三觉过敏.&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN&gt;&lt;A         class=blueweblink         onclick="javascript:ctlog(this, 'mad+cow+disease', '1.1', 0, 95, 'WM_REF')"         href="http://www.ilib.cn/A-xjxmy200201020.html"         target=_blank&gt;www.ilib.cn/A-xjxmy200201020.html&lt;/A&gt; - &lt;A class=blueweblink         href="http://www.yodao.com/search?q=%22Mad+Cow+Disease%22+%22%E7%96%AF%E7%89%9B%E7%97%85%22&amp;amp;keyfrom=dict.webdict"         target=_blank&gt;搜索相关网页&lt;/A&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;&amp;nbsp;&lt;FONT         class=graynolinktext&gt;基于95个网页&lt;/FONT&gt;&lt;/SPAN&gt; &lt;/TD&gt;&lt;/TR&gt;    &lt;TR&gt;      &lt;TD class=morewidth&gt;&amp;nbsp;&lt;/TD&gt;      &lt;TD class=dtnumber&gt;&lt;B&gt;2&lt;/B&gt;.&lt;/TD&gt;      &lt;TD class=dttitle2&gt;&lt;FONT color=#013694&gt;&lt;B&gt;狂牛病&lt;/B&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;    &lt;TR&gt;      &lt;TD class=morewidth&gt;&amp;nbsp;&lt;/TD&gt;      &lt;TD class=dtnumber&gt;&amp;nbsp;&lt;/TD&gt;      &lt;TD class=dtcontent&gt;&lt;SPAN&gt;生物学词汇英语翻译(M-P)--个人娱乐大全 ...&lt;BR&gt;macular lutea         黄斑&lt;BR&gt;&lt;SPAN class=hl&gt;mad cow disease&lt;/SPAN&gt; &lt;SPAN         class=hl&gt;狂牛病&lt;/SPAN&gt;&lt;BR&gt;madreporic canal 石管 ...&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN&gt;&lt;A         class=blueweblink         onclick="javascript:ctlog(this, 'mad+cow+disease', '1.2', 0, 27, 'WM_REF')"         href="http://pipi302.bioon.cn/go.asp?logid=45440"         target=_blank&gt;pipi302.bioon.cn/go.asp?logid=45440&lt;/A&gt; - &lt;A         class=blueweblink         href="http://www.yodao.com/search?q=%22mad+cow+disease%22+%22%E7%8B%82%E7%89%9B%E7%97%85%22&amp;amp;keyfrom=dict.webdict"         target=_blank&gt;搜索相关网页&lt;/A&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;&amp;nbsp;&lt;FONT         class=graynolinktext&gt;基于27个网页&lt;/FONT&gt;&lt;/SPAN&gt; &lt;/TD&gt;&lt;/TR&gt;    &lt;TR&gt;      &lt;TD class=morewidth&gt;&amp;nbsp;&lt;/TD&gt;      &lt;TD class=dtnumber&gt;&lt;B&gt;3&lt;/B&gt;.&lt;/TD&gt;      &lt;TD class=dttitle2&gt;&lt;FONT color=#013694&gt;&lt;B&gt;疯牛症&lt;/B&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;    &lt;TR&gt;      &lt;TD class=morewidth&gt;&amp;nbsp;&lt;/TD&gt;      &lt;TD class=dtnumber&gt;&amp;nbsp;&lt;/TD&gt;      &lt;TD class=dtcontent&gt;        &lt;DIV&gt;&lt;SPAN&gt;本类热门文章 ...&lt;BR&gt;Japanese Encephalitis ***脑炎&lt;BR&gt;&lt;SPAN class=hl&gt;Mad         Cow Disease&lt;/SPAN&gt; &lt;SPAN class=hl&gt;疯牛症&lt;/SPAN&gt;&lt;BR&gt;Malaria 疟疾         ...&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN&gt;&lt;A class=blueweblink         onclick="javascript:ctlog(this, 'mad+cow+disease', '1.3', 0, 8, 'WM_REF')"         href="http://0352en.cn/hyyy/sort092/sort093/7412.html"         target=_blank&gt;0352en.cn/hyyy/sort092/sort093/7412.html&lt;/A&gt; - &lt;A         class=blueweblink         href="http://www.yodao.com/search?q=%22Mad+Cow+Disease%22+%22%E7%96%AF%E7%89%9B%E7%97%87%22&amp;amp;keyfrom=dict.webdict"         target=_blank&gt;搜索相关网页&lt;/A&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;&amp;nbsp;&lt;FONT         class=graynolinktext&gt;基于8个网页&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/DIV&gt;        &lt;DIV&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/DIV&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;&lt;/H4&gt;&lt;/DIV&gt;&lt;/FONT&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5906929445033990464-4681775118068418590?l=irlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5906929445033990464&amp;postID=4681775118068418590&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/4681775118068418590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/4681775118068418590'/><link rel='alternate' type='text/html' href='http://irlab.blogspot.com/2007/11/yahoo-vs-yodao.html' title='网络解释-- Yahoo VS Yodao'/><author><name>xlqb</name><uri>http://www.blogger.com/profile/07757898792107625243</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5906929445033990464.post-6188357189296249355</id><published>2007-11-09T14:55:00.001+08:00</published><updated>2007-11-09T14:55:10.351+08:00</updated><title type='text'>lucene HitCollector 的作用</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;  &lt;P&gt;HitCollector   的作用很简单，通过collect（）方法控制检索返回的结果，下面是lucene自带的一个例子----使用一个优先队列，返回指定数目的Top n Doc。&lt;/P&gt;  &lt;P&gt;package org.apache.lucene.search;&lt;/P&gt;  &lt;P&gt;/**&lt;BR&gt;&amp;nbsp;* Copyright 2004 The Apache Software   Foundation&lt;BR&gt;&amp;nbsp;*&lt;BR&gt;&amp;nbsp;* Licensed under the Apache License, Version 2.0   (the "License");&lt;BR&gt;&amp;nbsp;* you may not use this file except in compliance with   the License.&lt;BR&gt;&amp;nbsp;* You may obtain a copy of the License   at&lt;BR&gt;&amp;nbsp;*&lt;BR&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;A   href="http://www.apache.org/licenses/LICENSE-2.0"&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/A&gt;&lt;BR&gt;&amp;nbsp;*&lt;BR&gt;&amp;nbsp;*   Unless required by applicable law or agreed to in writing, software&lt;BR&gt;&amp;nbsp;*   distributed under the License is distributed on an "AS IS" BASIS,&lt;BR&gt;&amp;nbsp;*   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express   or&lt;BR&gt;implied.&lt;BR&gt;&amp;nbsp;* See the License for the specific language governing   permissions and&lt;BR&gt;&amp;nbsp;* limitations under the License.&lt;BR&gt;&amp;nbsp;*/&lt;/P&gt;  &lt;P&gt;import java.io.IOException;&lt;BR&gt;import java.util.BitSet;&lt;/P&gt;  &lt;P&gt;import org.apache.lucene.store.Directory;&lt;BR&gt;import   org.apache.lucene.document.Document;&lt;BR&gt;import   org.apache.lucene.index.IndexReader;&lt;BR&gt;import   org.apache.lucene.index.Term;&lt;BR&gt;import   org.apache.lucene.util.PriorityQueue;&lt;/P&gt;  &lt;P&gt;/** A &lt;A href="https://mail.google.com/mail?view=cm&amp;amp;tf=0&amp;amp;to=%7B@link"   target=_blank&gt;{@link&lt;/A&gt; HitCollector} implementation that collects the   top-&lt;BR&gt;scoring&lt;BR&gt;&amp;nbsp;* documents, returning them as a &lt;A   href="https://mail.google.com/mail?view=cm&amp;amp;tf=0&amp;amp;to=%7B@link"   target=_blank&gt;{@link&lt;/A&gt; TopDocs}.&amp;nbsp; This is used by&lt;BR&gt;&lt;A   href="https://mail.google.com/mail?view=cm&amp;amp;tf=0&amp;amp;to=%7B@link"   target=_blank&gt;{@link&lt;/A&gt;&lt;BR&gt;&amp;nbsp;* IndexSearcher} to implement &lt;A   href="https://mail.google.com/mail?view=cm&amp;amp;tf=0&amp;amp;to=%7B@link"   target=_blank&gt;{@link&lt;/A&gt; TopDocs}-based search.&lt;BR&gt;&amp;nbsp;*&lt;BR&gt;&amp;nbsp;*   &amp;lt;p&amp;gt;This may be extended, overriding the collect method to,   e.g.,&lt;BR&gt;&amp;nbsp;* conditionally invoke &amp;lt;code&amp;gt;super()&amp;lt;/code&amp;gt; in order   to filter which&lt;BR&gt;&amp;nbsp;* documents are collected.&lt;BR&gt;&amp;nbsp;**/&lt;BR&gt;public class   TopDocCollector extends HitCollector {&lt;BR&gt;&amp;nbsp; private int numHits;&lt;BR&gt;&amp;nbsp;   private float minScore = 0.0f;&lt;/P&gt;  &lt;P&gt;&amp;nbsp; int totalHits;&lt;BR&gt;&amp;nbsp; PriorityQueue hq;&lt;/P&gt;  &lt;P&gt;&amp;nbsp; /** Construct to collect a given number of hits.&lt;BR&gt;&amp;nbsp;&amp;nbsp; *   @param numHits the maximum number of hits to collect&lt;BR&gt;&amp;nbsp;&amp;nbsp;   */&lt;BR&gt;&amp;nbsp; public TopDocCollector(int numHits) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   this(numHits, new HitQueue(numHits));&lt;BR&gt;&amp;nbsp; }&lt;/P&gt;  &lt;P&gt;&amp;nbsp; TopDocCollector(int numHits, PriorityQueue hq) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   this.numHits = numHits;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.hq = hq;&lt;BR&gt;&amp;nbsp; }&lt;/P&gt;  &lt;P&gt;&amp;nbsp; // javadoc inherited&lt;BR&gt;&amp;nbsp; public void collect(int doc, float   score) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (score &amp;gt; 0.0f)   {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   totalHits++;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (hq.size() &amp;lt; numHits ||   score &amp;gt;= minScore) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   hq.insert(new ScoreDoc(doc,   score));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; minScore =   ((ScoreDoc)hq.top()).score; // maintain   minScore&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;   }&lt;/P&gt;  &lt;P&gt;&amp;nbsp; /** The total number of documents that matched this query.   */&lt;BR&gt;&amp;nbsp; public int getTotalHits() { return totalHits; }&lt;/P&gt;  &lt;P&gt;&amp;nbsp; /** The top-scoring hits. */&lt;BR&gt;&amp;nbsp; public TopDocs topDocs()   {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ScoreDoc[] scoreDocs = new   ScoreDoc[hq.size()];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = hq.size()-1; i &amp;gt;= 0;   i--)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // put docs in   array&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; scoreDocs[i] = (ScoreDoc)hq.pop();&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float maxScore =   (totalHits==0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ?   Float.NEGATIVE_INFINITY&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :   scoreDocs[0].score;&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return new TopDocs(totalHits, scoreDocs,   maxScore);&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;}&amp;nbsp;&lt;/P&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;/FONT&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5906929445033990464-6188357189296249355?l=irlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5906929445033990464&amp;postID=6188357189296249355&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/6188357189296249355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/6188357189296249355'/><link rel='alternate' type='text/html' href='http://irlab.blogspot.com/2007/11/lucene-hitcollector.html' title='lucene HitCollector 的作用'/><author><name>xlqb</name><uri>http://www.blogger.com/profile/07757898792107625243</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5906929445033990464.post-8841059375580557936</id><published>2007-11-09T14:00:00.000+08:00</published><updated>2007-11-09T15:00:46.970+08:00</updated><title type='text'>yahoo web seacher api 参数说明</title><content type='html'>&lt;div&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span style="font-size:85%;"&gt;yahoo搜索引擎api，用起来还是挺不错的，虽然在国内没有google api 当然搜索词数有限制，只能5000/per_ip /perday……,api功能非常全面，搜索结果的语言，国家，格式等都可以非常容易的设置。个人现在用yahoo api 就行 网页去重，   已经还有基于搜索引擎的网络挖掘等方面的研究工作！下面是一些参数，作为备忘之用！&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;  &lt;div&gt; &lt;/div&gt;  &lt;div&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://developer.yahoo.com/search/web/V1/webSearch.html"&gt;http://developer.yahoo.com/search/web/V1/webSearch.html&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;  &lt;div&gt;&lt;span style="font-family:Verdana;"&gt;&lt;a href="http://developer.yahoo.com/search/languages.html"&gt;http://developer.yahoo.com/search/languages.html&lt;/a&gt;    支持语言说明&lt;/span&gt;&lt;/div&gt;  &lt;div&gt;&lt;span style="font-family:Verdana;"&gt;  &lt;h1&gt;Supported Languages&lt;/h1&gt;  &lt;p&gt;The following language codes are supported in language parameter requests:   &lt;/p&gt;  &lt;table id="langtable" border="0" width="100%"&gt;    &lt;tbody&gt;    &lt;tr&gt;      &lt;th&gt;Language &lt;/th&gt;      &lt;th&gt;Code &lt;/th&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;arabic &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;ar &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;bulgarian &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;bg &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;catalan &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;ca &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;chinese-simplified &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;szh &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;chinese-traditional &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;tzh &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;croatian &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;hr &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;czech &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;cs &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;danish &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;da &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;dutch &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;nl &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;english &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;en &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;estonian &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;et &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;finnish &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;fi &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;french &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;fr &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;german &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;de &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;greek &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;el &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;hebrew &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;he &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;hungarian &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;hu &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;icelandic &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;is &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;indonesian &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;id &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;italian &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;it &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;japanese &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;ja &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;korean &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;ko &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;latvian &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;lv &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;lithuanian &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;lt &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;norwegian &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;no &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;persian &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;fa &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;polish &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;pl &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;portuguese &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;pt &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;romanian &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;ro &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;russian &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;ru &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;slovak &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;sk &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;serbian &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;sr &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;slovenian &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;sl &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;spanish &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;es &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;swedish &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;sv &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;thai &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;th &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;turkish &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;tr&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;/div&gt;  &lt;div&gt;&lt;span style="font-family:Verdana;"&gt;&lt;/span&gt; &lt;/div&gt;  &lt;div&gt;&lt;span style="font-family:Verdana;"&gt;  &lt;/span&gt;&lt;h2&gt;&lt;span style="font-family:Verdana;"&gt;Request parameters&lt;/span&gt;&lt;/h2&gt;&lt;span style="font-family:Verdana;"&gt;  &lt;/span&gt;&lt;p&gt;&lt;span style="font-family:Verdana;"&gt;See information on &lt;a href="http://developer.yahoo.com/search/rest.html"&gt;constructing REST   queries&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family:Verdana;"&gt;  &lt;table id="requesttable" border="0" width="100%"&gt;    &lt;tbody&gt;    &lt;tr&gt;      &lt;th width="13%"&gt;Parameter &lt;/th&gt;      &lt;th width="19%"&gt;Value &lt;/th&gt;      &lt;th width="68%"&gt;Description &lt;/th&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;appid &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;string (required) &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;The application ID. See &lt;a href="http://developer.yahoo.com/faq/index.html#appid"&gt;Application IDs&lt;/a&gt;         for more information. &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;query &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;string (required) &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;The query to search for         (UTF-8 encoded). This query supports the full search language of Yahoo!         Search, including meta keywords. Total size of he query must be less than         1KB. For details on constructing queries, see &lt;a href="http://help.yahoo.com/help/us/ysearch/tips/tips-04.html"&gt;Search         Tips&lt;/a&gt;. &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;region &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;string: default &lt;em&gt;us&lt;/em&gt;       &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;The regional search engine         on which the service performs the search. For example, region=uk will give         you the search engine at uk.search.yahoo.com. &lt;a href="http://developer.yahoo.com/search/regions.html"&gt;Supported         Regions&lt;/a&gt;. &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;type &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;&lt;em&gt;all&lt;/em&gt; (default),         &lt;em&gt;any&lt;/em&gt;, or &lt;em&gt;phrase&lt;/em&gt; &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;        &lt;p&gt;The kind of search to submit: &lt;/p&gt;        &lt;ul&gt;          &lt;li&gt;&lt;em&gt;all&lt;/em&gt; returns results with all query terms. &lt;/li&gt;          &lt;li&gt;&lt;em&gt;any&lt;/em&gt; returns results with one or more of the query terms.           &lt;/li&gt;          &lt;li&gt;&lt;em&gt;phrase&lt;/em&gt; returns results containing the query terms as a           phrase. &lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;results &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;integer: default         &lt;em&gt;10&lt;/em&gt;, max &lt;em&gt;100&lt;/em&gt; &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;The number of results to         return. &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;start &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;integer: default &lt;em&gt;1&lt;/em&gt;       &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;The starting result         position to return (1-based). The finishing position (start + results - 1)         cannot exceed 1000. &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;format &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;&lt;em&gt;any&lt;/em&gt; (default),         &lt;em&gt;html&lt;/em&gt;, &lt;em&gt;msword&lt;/em&gt;, &lt;em&gt;pdf&lt;/em&gt;, &lt;em&gt;ppt&lt;/em&gt;, &lt;em&gt;rss&lt;/em&gt;,         &lt;em&gt;txt&lt;/em&gt;, &lt;em&gt;xls&lt;/em&gt; &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;Specifies the kind of file         to search for. &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;adult_ok &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;&lt;em&gt;no value&lt;/em&gt;         (default), or &lt;em&gt;1&lt;/em&gt; &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;Specifies whether to allow         results with adult content. Enter a &lt;em&gt;1&lt;/em&gt; to allow adult content.     &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;similar_ok &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;&lt;em&gt;no value&lt;/em&gt;         (default), or &lt;em&gt;1&lt;/em&gt; &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;Specifies whether to allow         multiple results with similar content. Enter a &lt;em&gt;1&lt;/em&gt; to allow similar         content. &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;language &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;string: default &lt;em&gt;no         value&lt;/em&gt; (all languages) &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;The language the results         are written in. &lt;a href="http://developer.yahoo.com/search/languages.html"&gt;Supported         Languages&lt;/a&gt;. &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;country &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;string: default &lt;em&gt;no         value&lt;/em&gt; &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;The country in which to         restrict your search results. Only results on web sites within this         country are returned. &lt;a href="http://developer.yahoo.com/search/countries.html"&gt;Supported Country         Codes&lt;/a&gt;. &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;site &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;string: default &lt;em&gt;no         value&lt;/em&gt; &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;A domain to restrict your         searches to (e.g. www.yahoo.com). You may submit up to 30 values         (site=www.yahoo.com&amp;amp;site=www.cnn.com). &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;subscription &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;string: default &lt;em&gt;no         value&lt;/em&gt; &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;Any &lt;a href="http://search.yahoo.com/subscription/learnmore"&gt;subscriptions&lt;/a&gt; to         premium content that should also be searched. You may submit multiple         values. &lt;a href="http://developer.yahoo.com/search/subscriptions.html"&gt;Supported         Subscription Codes&lt;/a&gt;. &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;license &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;&lt;em&gt;any&lt;/em&gt; (default),         &lt;em&gt;cc_any&lt;/em&gt;, &lt;em&gt;cc_commercial&lt;/em&gt;, &lt;em&gt;cc_modifiable&lt;/em&gt; &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;The &lt;a href="http://www.creativecommons.org/"&gt;Creative Commons license&lt;/a&gt; that         the contents are licensed under. You may submit multiple values (e.g.         license=cc_commercial&amp;amp;license=cc_modifiable). &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;output &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;string: &lt;em&gt;xml&lt;/em&gt;         (default), &lt;em&gt;json, php &lt;/em&gt;&lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;The format for the output.         If &lt;em&gt;json&lt;/em&gt; is requested, the results will be returned in &lt;a href="http://developer.yahoo.com/common/json.html"&gt;JSON&lt;/a&gt; format. If         &lt;em&gt;php&lt;/em&gt; is requested, the results will be returned in &lt;a href="http://developer.yahoo.com/common/phpserial.html"&gt;Serialized PHP&lt;/a&gt;         format. &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;callback &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;string &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;The name of the callback         function to wrap around the JSON data. The following characters are         allowed: A-Z a-z 0-9 . [] and _. If output=json has not been requested,         this parameter has no effect. More information on the callback can be         found in the &lt;a href="http://developer.yahoo.com/common/json.html#callbackparam"&gt;Yahoo!         Developer Network JSON Documentation&lt;/a&gt;. &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;  &lt;script&gt;stripe('requesttable');&lt;/script&gt;    &lt;/span&gt;&lt;p&gt;&lt;span style="font-family:Verdana;"&gt;Sample Request Url: &lt;a href="http://search.yahooapis.com/WebSearchService/V1/webSearch?appid=YahooDemo&amp;amp;query=madonna&amp;amp;results=2"&gt;http://search.yahooapis.com/WebSearchService/V1/webSearch?appid=YahooDemo&amp;amp;query=madonna&amp;amp;results=2&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family:Verdana;"&gt;  &lt;/span&gt;&lt;h2&gt;&lt;span style="font-family:Verdana;"&gt;Response fields&lt;/span&gt;&lt;/h2&gt;&lt;span style="font-family:Verdana;"&gt;  &lt;/span&gt;&lt;p&gt;&lt;span style="font-family:Verdana;"&gt;The schema document for this service response is located at &lt;a href="http://search.yahooapis.com/WebSearchService/V1/WebSearchResponse.xsd"&gt;http://search.yahooapis.com/WebSearchService/V1/WebSearchResponse.xsd&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family:Verdana;"&gt;  &lt;/span&gt;&lt;p&gt;&lt;span style="font-family:Verdana;"&gt;  &lt;table id="responsetable" border="0" width="100%"&gt;    &lt;tbody&gt;    &lt;tr&gt;      &lt;th width="13%"&gt;Field &lt;/th&gt;      &lt;th width="68%"&gt;Description &lt;/th&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;ResultSet &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;Contains all of the query         responses. Has attributes:         &lt;p&gt;&lt;/p&gt;        &lt;ul&gt;          &lt;li&gt;&lt;b&gt;totalResultsAvailable&lt;/b&gt;: The number of query matches in the           database.&lt;/li&gt;          &lt;li&gt;&lt;b&gt;totalResultsReturned&lt;/b&gt;: The number of query matches returned.           This may be lower than the number of results requested if there were           fewer total results available.&lt;/li&gt;          &lt;li&gt;&lt;b&gt;firstResultPosition&lt;/b&gt;: The position of the first result in the           overall search.&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;Result &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;Contains each individual         response. &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;Title &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;The title of the web page.       &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;Summary &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;Summary text associated         with the web page. &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;Url &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;The URL for the web page.       &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;ClickUrl &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;The URL for linking to the         page. See &lt;a href="http://developer.yahoo.com/faq/index.html#clickurl"&gt;URL         linking&lt;/a&gt; for more information. &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;MimeType &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;The MIME type of the page       &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;ModificationDate &lt;/td&gt;      &lt;td style="background-color: rgb(236, 245, 250);"&gt;The date the page was last         modified, in &lt;a href="http://en.wikipedia.org/wiki/Unix_time"&gt;unix         timestamp&lt;/a&gt; format. &lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;Cache &lt;/td&gt;      &lt;td style="background-color: rgb(255, 255, 255);"&gt;        &lt;div&gt;The URL of the cached result, and its size in bytes.&lt;/div&gt;        &lt;div&gt; &lt;/div&gt;        &lt;div&gt;        &lt;h2&gt;Rate Limit&lt;/h2&gt;        &lt;p&gt;The Web Search service is limited to 5,000 queries per IP address per         day. See information on &lt;a href="http://developer.yahoo.com/search/rate.html"&gt;rate limiting&lt;/a&gt; and         our &lt;a href="http://developer.yahoo.com/usagePolicy/"&gt;Usage Policy&lt;/a&gt; to         learn about acceptable uses and how to request additional queries.&lt;/p&gt;        &lt;h2&gt;Errors&lt;/h2&gt;        &lt;p&gt;The Web Search service returns the &lt;a href="http://developer.yahoo.com/search/errors.html"&gt;standard errors&lt;/a&gt;.         There are no service-specific   errors.&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span style="color:#c0c0c0;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span style="color:#c0c0c0;"&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5906929445033990464-8841059375580557936?l=irlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5906929445033990464&amp;postID=8841059375580557936&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/8841059375580557936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/8841059375580557936'/><link rel='alternate' type='text/html' href='http://irlab.blogspot.com/2007/11/yahoo-web-seacher-api.html' title='yahoo web seacher api 参数说明'/><author><name>xlqb</name><uri>http://www.blogger.com/profile/07757898792107625243</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5906929445033990464.post-6783819937368337569</id><published>2007-11-09T13:26:00.001+08:00</published><updated>2007-11-09T13:26:11.482+08:00</updated><title type='text'>哈工大分词接口稍微修改点</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Verdana&gt;&amp;nbsp;package IRdll;&lt;BR&gt;&lt;BR&gt;import   java.io.File;&lt;BR&gt;import java.io.Reader;&lt;BR&gt;import   java.io.FileInputStream;&lt;BR&gt;import java.io.*;&lt;BR&gt;import   java.util.Date;&lt;BR&gt;import java.util.HashSet;&lt;BR&gt;&lt;BR&gt;/**&lt;BR&gt;&amp;nbsp;*   &amp;lt;p&amp;gt;Title: Java中文分词接口&amp;lt;/p&amp;gt;&lt;BR&gt;&amp;nbsp;* &amp;lt;p&amp;gt;Description:   本组件以哈工大分词系统为基础，在其基础之上开发&lt;BR&gt;&amp;nbsp;*   本组件仅供学习和研究用途，任何商业用途将自行承担法律后果，与组件编写人无关。&amp;lt;/p&amp;gt;&lt;BR&gt;&amp;nbsp;* &amp;lt;p&amp;gt;Copyright:   Copyright (c) 2006&amp;lt;/p&amp;gt;&lt;BR&gt;&amp;nbsp;* &amp;lt;p&amp;gt;Company: dalian univercity of   techology&amp;lt;/p&amp;gt;&lt;BR&gt;&amp;nbsp;* @author ：yezheng&lt;BR&gt;&amp;nbsp;* @version   1.0&lt;BR&gt;&amp;nbsp;*/&lt;BR&gt;&lt;BR&gt;public class IRSplit {&lt;BR&gt;&lt;BR&gt;&amp;nbsp; private static   IRSplit instance = null; //instance时类中一成员，所以可以访问其中被private修饰的变量或方法&lt;BR&gt;&amp;nbsp;   private static StringBuffer stringb = new StringBuffer(102400);&lt;BR&gt;&amp;nbsp;   private static StringBuffer longSentence = new   StringBuffer(10240);&lt;BR&gt;&lt;BR&gt;&amp;nbsp; //私有构造方法&lt;BR&gt;&amp;nbsp; private IRSplit()   {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println("正在加载词典……");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   this.LoadSegRes();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println("加载结束");&lt;BR&gt;&amp;nbsp;   }&lt;BR&gt;&lt;BR&gt;&amp;nbsp; //获得一个实例&lt;BR&gt;&amp;nbsp; public static IRSplit getInstance()   {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (instance == null)   {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; instance = new   IRSplit();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return   instance;&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;//本地方法&lt;BR&gt;&amp;nbsp; private native void   LoadSegRes();&lt;BR&gt;&lt;BR&gt;&amp;nbsp; private native void ReleaseSegger();&lt;BR&gt;&lt;BR&gt;&amp;nbsp;   private native String split(String sentence);&lt;BR&gt;&lt;BR&gt;//对一句话分词&lt;BR&gt;&amp;nbsp; public   String splitSentence(String sentence) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if   (sentence.length() &amp;lt; 1 || sentence == null)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   return "";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return   split(sentence);&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp; public String   splitLongSentence(String sentence) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (sentence.length()   &amp;lt; 1 || sentence == null)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return   "";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   this.longSentence.setLength(0);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int start = 0   ; int&amp;nbsp; end = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 0; i &amp;lt;   sentence.length(); i++)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; char c =   sentence.charAt(i);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch   (Character.getType(c))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case   24:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   end++;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   //System.out.println(sentence.substring(start,   end));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   this.longSentence.append(split(sentence.substring(start,   end)));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   start =   end;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   default:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   end++;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(start   &amp;lt; end)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   longSentence.append(split(sentence.substring(start,   end)));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   return longSentence.toString();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;   }&lt;BR&gt;&lt;BR&gt;&amp;nbsp; public void ReleaseSeggers() {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; instance =   null;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReleaseSegger();&lt;BR&gt;&amp;nbsp;   }&lt;BR&gt;&lt;BR&gt;//对一个文件分词&lt;BR&gt;&amp;nbsp; public void splitFile(File file, File outfile)   {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FileInputStream   fis = new FileInputStream(file);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   BufferedReader br = new BufferedReader(new   InputStreamReader(fis));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   this.stringb.setLength(0);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String   ts;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while ( (ts = br.readLine()) != null)   {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ts.length() != 0)   {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   stringb.append(splitLongSentence(ts) + '\r' + '\n');   //进行分词&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else   {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   stringb.append('\r');&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   stringb.append('\n');&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   br.close();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   fis.close();&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FileWriter writer = new   FileWriter(outfile);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   writer.write(stringb.toString());&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   writer.close();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch   (FileNotFoundException ex) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   System.out.println(file.toString() + "File not Found");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (IOException ex1)   {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(file.toString() + "IO   errors");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp; public void   splitFile(String source, String destination) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; File file =   new File(source);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; File outfile = new   File(destination);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (file.isFile())   {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; splitFile(file,   outfile);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp; public Reader   splitFile(Reader reader) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BufferedReader br = new   BufferedReader(reader);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; StringBuffer stringb = new   StringBuffer();&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; try   {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String ts;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   while ( (ts = br.readLine()) != null)   {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ts.length() != 0)   {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   stringb.append(splitSentence(ts) + '\r' + '\n');   //进行分词&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else   {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   stringb.append('\r');&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   stringb.append('\n');&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reader =   new StringReader(stringb.toString());&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (IOException ex) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return reader;&lt;BR&gt;&amp;nbsp;   }&lt;BR&gt;&lt;BR&gt;//处理一个目录下的所有文件&lt;BR&gt;&amp;nbsp; public void splitFiles(String sourceDir,   String destinationDir) { //参数：源文件目录和目标文件目录&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; File directory   = new File(sourceDir);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; File dirdes = new   File(destinationDir);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //FilenameFilter txtFilter = new   myFilter("txt");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; File files[] =   directory.listFiles();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 0; i &amp;lt;   files.length; i++) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (files[i].isFile())   {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; File outfile = new   File(destinationDir + "/"   +&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   files[i].getName());&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   //System.out.println(directory.getName() + ":" +   dirdes.getName());&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   splitFile(files[i], outfile);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (files[i].isDirectory())   {&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; File tempdir = new   File(destinationDir + "/" +   files[i].getName());&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if   (!tempdir.exists() || !tempdir.isDirectory())   {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   tempdir.mkdir();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; splitFiles(sourceDir + "/" +   files[i].getName(),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   tempdir.getAbsolutePath());&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp; static   {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.loadLibrary("IRdll");&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;   public static void main(String[] args) {&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IRSplit split   = IRSplit.getInstance(); //其它类使用&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; long start =   System.currentTimeMillis();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Date startdate = new   Date();&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //split.splitFiles("clean",   "out");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   split.splitLongSentence(ss);&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Date enddate = new   Date();&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   System.out.println(startdate);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   System.out.println(enddate);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   System.out.println(enddate.getTime()- startdate.getTime());&lt;BR&gt;&amp;nbsp;   }&lt;BR&gt;&lt;BR&gt;}&lt;/DIV&gt;&lt;/FONT&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5906929445033990464-6783819937368337569?l=irlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5906929445033990464&amp;postID=6783819937368337569&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/6783819937368337569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/6783819937368337569'/><link rel='alternate' type='text/html' href='http://irlab.blogspot.com/2007/11/blog-post_6088.html' title='哈工大分词接口稍微修改点'/><author><name>xlqb</name><uri>http://www.blogger.com/profile/07757898792107625243</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5906929445033990464.post-2570144061863773495</id><published>2007-11-09T13:24:00.001+08:00</published><updated>2007-11-09T13:24:48.093+08:00</updated><title type='text'>求职应聘:百度网上笔试题 </title><content type='html'>&lt;DIV&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;1 编程： &lt;/DIV&gt;  &lt;DIV&gt;  &lt;P&gt;　　用C语言实现一个revert函数，它的功能是将输入的字符串在原串上倒序后返回。&lt;/P&gt;  &lt;P&gt;　　2 编程：&lt;/P&gt;  &lt;P&gt;　　用C语言实现函数void * memmove(void *dest,const void *src,size_t n)。memmove&lt;/P&gt;  &lt;P&gt;　　函数的功能是拷贝src所指的内存内容前n个字节&lt;/P&gt;  &lt;P&gt;　　到dest所指的地址上。&lt;/P&gt;  &lt;P&gt;　　3 英文拼写纠错：&lt;/P&gt;  &lt;P&gt;　　在用户输入英文单词时，经常发生错误，我们需要对其进行纠错。假设已经有一个包&lt;/P&gt;  &lt;P&gt;　　含了正确英文单词的词典，请你设计一个拼写纠错的程序。&lt;/P&gt;  &lt;P&gt;　　(1)请描述你解决这个问题的思路；&lt;/P&gt;  &lt;P&gt;　　(2)请给出主要的处理流程，算法，以及算法的复杂度；&lt;/P&gt;  &lt;P&gt;　　(3)请描述可能的改进(改进的方向如效果，性能等等，这是一个开放问题)。&lt;/P&gt;  &lt;P&gt;　　4 寻找热门查询：&lt;/P&gt;  &lt;P&gt;　　搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来，每个查询串&lt;/P&gt;  &lt;P&gt;　　的长度为1-255字节。假设目前有一千万个记录，&lt;/P&gt;  &lt;P&gt;　　这些查询串的重复度比较高，虽然总数是1千万，但如果除去重复后，不超过3百万个&lt;/P&gt;  &lt;P&gt;　　。一个查询串的重复度越高，说明查询它的用户越多，&lt;/P&gt;  &lt;P&gt;　　也就是越热门。请你统计最热门的10个查询串，要求使用的内存不能超过1G。&lt;/P&gt;  &lt;P&gt;　　(1)请描述你解决这个问题的思路；&lt;/P&gt;  &lt;P&gt;　　(2)请给出主要的处理流程，算法，以及算法的复杂度。&lt;/P&gt;  &lt;P&gt;　　5 集合合并：&lt;/P&gt;  &lt;P&gt;　　给定一个字符串的集合，格式如：&lt;/P&gt;  &lt;P&gt;　　{aaa bbb ccc}， {bbb ddd}，{eee fff}，{ggg}，{ddd hhh}&lt;/P&gt;  &lt;P&gt;　　要求将其中交集不为空的集合合并，要求合并完成后的集合之间无交集，例如上例应&lt;/P&gt;  &lt;P&gt;　　输出&lt;/P&gt;  &lt;P&gt;　　{aaa bbb ccc ddd hhh}，{eee fff}， {ggg}&lt;/P&gt;  &lt;P&gt;　　(1)请描述你解决这个问题的思路；&lt;/P&gt;  &lt;P&gt;　　(2)请给出主要的处理流程，算法，以及算法的复杂度&lt;/P&gt;  &lt;P&gt;　　(3)请描述可能的改进(改进的方向如效果，性能等等，这是一个开放问题)。&lt;/P&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;/FONT&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5906929445033990464-2570144061863773495?l=irlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5906929445033990464&amp;postID=2570144061863773495&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/2570144061863773495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/2570144061863773495'/><link rel='alternate' type='text/html' href='http://irlab.blogspot.com/2007/11/blog-post_4.html' title='求职应聘:百度网上笔试题 '/><author><name>xlqb</name><uri>http://www.blogger.com/profile/07757898792107625243</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5906929445033990464.post-4263895131813198550</id><published>2007-11-09T13:22:00.001+08:00</published><updated>2007-11-09T13:22:58.496+08:00</updated><title type='text'> 搜索引擎学习资源收集 </title><content type='html'>&lt;DIV&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;  &lt;DIV class=postTitle&gt;&lt;/DIV&gt;  &lt;DIV class=postText&gt;&lt;A class=contentlink   href="http://www.zhihere.com/bbs/dispbbs.asp?boardid=8&amp;amp;id=630"   target=_blank&gt;http://www.zhihere.com/bbs/dispbbs.asp?boardid=8&amp;amp;id=630&lt;/A&gt;  &lt;P&gt;&lt;BR&gt;&lt;STRONG&gt;一、搜索引擎技术/动态资源&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;&amp;lt;一&amp;gt;、综合类&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;1、&lt;A class=contentlink href="http://www.wespoke.com/"   target=_blank&gt;卢亮的搜索引擎研究&lt;/A&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[URL=http://www.wespoke.com/][/URL]&lt;A   class=contentlink href="http://www.wespoke.com/"   target=_blank&gt;http://www.wespoke.com/&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;卢亮属于搜索引擎开发上的专家，以前开发过一个搜索引擎"博索"([URL=http://booso.com/][/URL]&lt;A   class=contentlink href="http://booso.com/"   target=_blank&gt;http://booso.com/&lt;/A&gt;),好像现在已经停止开发了，目前他服务于博客网。在他的这个blog上可以了解许多搜索引擎开发的技术和经验，值得持续关注。&lt;/P&gt;  &lt;P&gt;2、&lt;A class=contentlink   href="http://spaces.msn.com/members/laolu/PersonalSpace.aspx?_c="   target=_blank&gt;laolu\'blog&lt;/A&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;  &lt;P&gt;有不少来自国外的关于搜索引擎方面的资料，偏重于资料和数字&lt;/P&gt;  &lt;P&gt;3、&lt;A class=contentlink href="http://www.loverty.org/"   target=_blank&gt;哈斯日志&lt;/A&gt;&amp;nbsp;[URL=http://www.loverty.org/][/URL]&lt;A   class=contentlink href="http://www.loverty.org/"   target=_blank&gt;http://www.loverty.org/&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;在这里可以看到国内外几大搜索引擎的最新动态，值得关注搜索发展形势的人多看看&lt;/P&gt;  &lt;P&gt;4、&lt;A class=contentlink href="http://www.21cnbj.com/"   target=_blank&gt;北京奕天锐新科技有限公司&lt;/A&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;[URL=http://www.21cnbj.com/][/URL]&lt;A   class=contentlink href="http://www.21cnbj.com/"   target=_blank&gt;http://www.21cnbj.com/&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;搜索引擎、SEO、SEM等行业新闻动态&lt;/P&gt;  &lt;P&gt;5、&lt;STRONG&gt;&lt;A class=contentlink href="http://www.sowang.com/"   target=_blank&gt;中文搜索引擎指南网&lt;/A&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/STRONG&gt;[URL=http://www.sowang.com/][/URL]&lt;A   class=contentlink href="http://www.sowang.com/"   target=_blank&gt;http://www.sowang.com/&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;搜索引擎最新动态，各种搜索技巧、方法&lt;/P&gt;  &lt;P&gt;6、&lt;A class=contentlink href="http://www.zhihere.com/bbs/target="   target=_blank&gt;中文全文检索网&lt;/A&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[URL=http://www.fullsearcher.com/][/URL]&lt;A   class=contentlink href="http://www.fullsearcher.com/"   target=_blank&gt;http://www.fullsearcher.com/&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;FullSearcher.Com是有两个对搜索爱好的年轻人创办，我们的目标是让中文互联网全面进入搜索时代，让搜索无处不在。通过搜索改变人们的生活。&lt;BR&gt;&amp;nbsp;&amp;nbsp;FullSearcher提供全文检索的相关知识、垂直搜索引擎知识、搜索的相关新闻等搜索相关内容。&lt;/P&gt;  &lt;P&gt;&lt;BR&gt;&lt;STRONG&gt;&amp;lt;二&amp;gt;、Google动态&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;Google官方博客&lt;/STRONG&gt;：Google&amp;nbsp;黑板报&amp;nbsp;&amp;nbsp;&amp;nbsp;[URL=http://googlechinablog.com/][/URL]&lt;A   class=contentlink href="http://googlechinablog.com/"   target=_blank&gt;http://googlechinablog.com/&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;STRONG&gt;Google&amp;nbsp;中国的博客网志，走近我们的产品、技术和文化&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;&lt;A class=contentlink onfocus=this.blur()   href="http://googlechinablog.com/google_bb.gif" target=_blank&gt;&lt;IMG   alt=按此在新窗口浏览图片 src="http://googlechinablog.com/google_bb.gif"   onload="javascript:if(this.width&gt;screen.width-333)this.width=screen.width-333"   border=0&gt;&lt;/A&gt;&amp;nbsp;&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;1、Gfans&lt;/STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;[URL=http://gfans.org/][/URL]&lt;A   class=contentlink href="http://gfans.org/"   target=_blank&gt;http://gfans.org/&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;一群Google的粉丝&lt;/P&gt;  &lt;P&gt;这里没有&amp;nbsp;PageRank，没有&amp;nbsp;HillTop，没有&amp;nbsp;SEO。如果&amp;nbsp;Google&amp;nbsp;是龙井，我希望这里便是虎跑，去化开那馥郁如兰之香。观于沧海者难为水，搜于&amp;nbsp;Google&amp;nbsp;者难为言，Google&amp;nbsp;已不只是文化，他是我的信仰。&lt;/P&gt;  &lt;P&gt;本站文章约法三章：&amp;nbsp;&lt;/P&gt;  &lt;P&gt;&lt;BR&gt;不讨论&amp;nbsp;SEO&amp;nbsp;及相关；&amp;nbsp;&lt;/P&gt;  &lt;P&gt;不得无聊转载；&amp;nbsp;&lt;/P&gt;  &lt;P&gt;严禁侮辱百度。&lt;BR&gt;&lt;STRONG&gt;2、幻灭的麦克风&lt;/STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;[URL=http://www.kenwong.cn/][/URL]&lt;A   class=contentlink href="http://www.kenwong.cn/" target="_blank&lt;a"   contentlink=""&gt;www.kenwong.cn&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;Google天地&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;3、google&amp;nbsp;观察&lt;/STRONG&gt;&amp;nbsp;[URL=http://blog.donews.com/googleview/][/URL]&lt;A   class=contentlink href="http://blog.donews.com/googleview/"   target=_blank&gt;http://blog.donews.com/googleview/&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;&amp;lt;二&amp;gt;、其他搜索引擎动态&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;1、雅虎搜索日志&lt;/STRONG&gt;&amp;nbsp;&amp;nbsp;[URL=http://ysearchblog.cn/][/URL]&lt;A   class=contentlink href="http://ysearchblog.cn/"   target=_blank&gt;http://ysearchblog.cn/&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;记录雅虎搜索引擎的动态、产品、技术等&lt;/P&gt;  &lt;P&gt;&lt;A class=contentlink onfocus=this.blur()   href="http://ysearchblog.cn/images/lg_s4.gif" target=_blank&gt;&lt;IMG alt=按此在新窗口浏览图片   src="http://ysearchblog.cn/images/lg_s4.gif"   onload="javascript:if(this.width&gt;screen.width-333)this.width=screen.width-333"   border=0&gt;&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;&lt;BR&gt;&lt;STRONG&gt;二、搜索引擎代码资源&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;&lt;BR&gt;&lt;STRONG&gt;一&amp;gt;、搜索引擎/网络蜘蛛程序代码&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;国外开发的相关程序&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;1、Nutch&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;&lt;A class=contentlink onfocus=this.blur()   href="http://lucene.apache.org/nutch/images/nutch-logo.gif" target=_blank&gt;&lt;IMG   alt=按此在新窗口浏览图片 src="http://lucene.apache.org/nutch/images/nutch-logo.gif"   onload="javascript:if(this.width&gt;screen.width-333)this.width=screen.width-333"   border=0&gt;&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;官方网站&amp;nbsp;[URL=http://www.nutch.org/][/URL]&lt;A class=contentlink   href="http://www.nutch.org/"   target=_blank&gt;http://www.nutch.org/&lt;/A&gt;&lt;BR&gt;中文站点&amp;nbsp;[URL=http://www.nutchchina.com/][/URL]&lt;A   class=contentlink href="http://www.nutchchina.com/"   target=_blank&gt;http://www.nutchchina.com/&lt;/A&gt;&lt;BR&gt;最新版本：Nutch&amp;nbsp;0.7.2&amp;nbsp;Released&lt;/P&gt;  &lt;P&gt;Nutch&amp;nbsp;是一个开源Java&amp;nbsp;实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的全部工具，可以建立自己内部网的搜索引擎，也可以针对整个网络建立搜索引擎。自由(Free)而免费(Free)。&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;2、Lucene&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;[B][/B]&amp;nbsp;&lt;BR&gt;&lt;A class=contentlink onfocus=this.blur()   href="http://lucene.apache.org/images/lucene_green_300.gif" target=_blank&gt;&lt;IMG   alt=按此在新窗口浏览图片 src="http://lucene.apache.org/images/lucene_green_300.gif"   onload="javascript:if(this.width&gt;screen.width-333)this.width=screen.width-333"   border=0&gt;&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;官方网站&amp;nbsp;&amp;nbsp;[URL=http://lucene.apache.org/][/URL]&lt;A class=contentlink   href="http://lucene.apache.org/"   target=_blank&gt;http://lucene.apache.org&lt;/A&gt;&lt;BR&gt;中文站点&amp;nbsp;&amp;nbsp;[URL=http://www.lucene.com.cn/][/URL]&lt;A   class=contentlink href="http://www.lucene.com.cn/"   target=_blank&gt;http://www.lucene.com.cn/&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;Lucene&amp;nbsp;是apache软件基金会&amp;nbsp;jakarta项目组的一个子项目，是一个开放源代码的全文检索引擎工具包[用Java写的]，即它不是一个完整的全文检索引擎，而是一个全文检索引擎的架构，提供了完整的查询引擎和索引引擎，部分文本分析引擎（英文与德文两种西方语言）。Lucene的目的是为软件开发人员提供一个简单易用的工具包，以方便的在目标系统中实现全文检索的功能，或者是以此为基础建立起完整的全文检索引擎。&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;3、Larbin&lt;/STRONG&gt;:&amp;nbsp;[URL=http://larbin.sourceforge.net/index-eng.html][/URL]&lt;A   class=contentlink href="http://larbin.sourceforge.net/index-eng.html"   target=_blank&gt;http://larbin.sourceforge.net/index-eng.html&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;larbin是一种开源的网络爬虫/网络蜘蛛，由法国的年轻人&amp;nbsp;Sébastien&amp;nbsp;Ailleret独立开发。larbin目的是能够跟踪页面的url进行扩展的抓取，最后为搜索引擎提供广泛的数据来源。&lt;/P&gt;  &lt;P&gt;国内开发的相关程序&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;1、SQLET&amp;nbsp;-&amp;nbsp;开放源码的中文搜索引擎&lt;/STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/P&gt;  &lt;P&gt;官方网站&amp;nbsp;[URL=http://www.sqlet.com/][/URL]&lt;A class=contentlink   href="http://www.sqlet.com/" target=_blank&gt;http://www.sqlet.com/&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;SQLET，是Search&amp;nbsp;&amp;amp;&amp;nbsp;Query&amp;nbsp;&amp;amp;Link,&amp;nbsp;加后缀&amp;nbsp;let，表示小的，小型的意思.打算建立一个能搜上亿张网页的基于主题功能的中文搜索引擎.支持3种索引方式：MySql_table_Index，&amp;nbsp;Lucene_Index，SQLET_Index.网页抓取可以保存在文件系统及数据库里。自带WebServer.&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;2、菲度垂直搜索引擎代码&lt;/STRONG&gt;&amp;nbsp;&lt;/P&gt;  &lt;P&gt;菲度[URL=http://www.faydu.net/][/URL]&lt;A class=contentlink   href="http://www.faydu.net/"   target=_blank&gt;http://www.faydu.net&lt;/A&gt;&amp;nbsp;为一个垂直在线搜索的演示版，主要对国内一些购物站点进行搜索整理，&lt;/P&gt;  &lt;P&gt;现在开源测试版本的代码，供大家讨论。下载说明：&lt;/P&gt;  &lt;P&gt;1》因为本程序是在服务器上运行，是在多个处理器下运行的，个人电脑上请控制线程数量&lt;/P&gt;  &lt;P&gt;2》包含一个data&amp;nbsp;的数据库&amp;nbsp;还原到sql&amp;nbsp;server&amp;nbsp;&lt;/P&gt;  &lt;P&gt;3》收集完毕默认在bin目录有licene生成的反排的索引文件&amp;nbsp;&lt;/P&gt;  &lt;P&gt;4》下载地址：[URL=http://www.faydu.net/download/code.rar][/URL]&lt;A class=contentlink   href="http://www.faydu.net/download/code.rar"   target=_blank&gt;http://www.faydu.net/download/code.rar&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;开放日期：2006-4-18&amp;nbsp;&amp;nbsp;&amp;nbsp;来源:&lt;A class=contentlink   href="http://blog.csdn.net/faydu/archive/2006/04/18/667997.aspx"   target=_blank&gt;http://blog.csdn.net/faydu/archive/2006/04/18/667997.aspx&lt;/A&gt;&lt;BR&gt;语言：VB.net(c#)&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;二&amp;gt;、中文分词程序代码&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;1、计算所汉语词法分析系统&amp;nbsp;ICTCLAS&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;中国科学院计算技术研究所在多年研究基础上，耗时一年研制出了基于多层隐马模型的汉语词法分析系统&amp;nbsp;ICTCLAS   (Institute&amp;nbsp;of&amp;nbsp;Computing&amp;nbsp;Technology,&amp;nbsp;Chinese&amp;nbsp;Lexical&amp;nbsp;Analysis&amp;nbsp;System)，该系统的功能有：中文分词；词性标注；未登录词识别。分词正确率高达97.58%(最近的973专家组评测结果)，基于角色标注的未登录词识别能取得高于90%   召回率，其中中国人名的识别召回率接近98%，分词和词性标注处理速度为31.5KB/s。ICTCLAS&amp;nbsp;和计算所其他14项免费发布的成果被中外媒体广泛地报道，国内很多免费的中文分词模块都或多或少的参考过ICTCLAS的代码。&lt;/P&gt;  &lt;P&gt;下载页面：[URL=http://www.nlp.org.cn/project/project.php?proj_id=6][/URL]&lt;A   class=contentlink href="http://www.nlp.org.cn/project/project.php?proj_id=6"   target=_blank&gt;http://www.nlp.org.cn/project/project.php?proj_id=6&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;由于&amp;nbsp;ICTCLAS&amp;nbsp;是由&amp;nbsp;C&amp;nbsp;语言写成的，现在主流的开发工具用起来不太方便，于是有一些热心的程序员把&amp;nbsp;ICTCLAS&amp;nbsp;改为&amp;nbsp;Java&amp;nbsp;和&amp;nbsp;C#&amp;nbsp;等其他语言。&lt;/P&gt;  &lt;P&gt;（1）fenci，Java&amp;nbsp;的&amp;nbsp;ICTCLAS，下载页面：[URL=http://www.xml.org.cn/printpage.asp?BoardID=2&amp;amp;id=11502][/URL]&lt;A   class=contentlink   href="http://www.xml.org.cn/printpage.asp?BoardID=2&amp;amp;id=11502"   target=_blank&gt;http://www.xml.org.cn/printpage.asp?BoardID=2&amp;amp;id=11502&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;（2）AutoSplit，另一个&amp;nbsp;Java&amp;nbsp;的&amp;nbsp;ICTCLAS，已经找不到下载页面，点击本地下载&lt;/P&gt;  &lt;P&gt;（3）小叮咚中文分词，曾经有下载页面，现在找不到了。据作者介绍，从&amp;nbsp;ICTCLAS&amp;nbsp;中改进，有&amp;nbsp;Java，C#&amp;nbsp;和&amp;nbsp;C++&amp;nbsp;三个版本，介绍页面：[URL=http://www.donews.net/accesine][/URL]&lt;A   class=contentlink href="http://www.donews.net/accesine"   target=_blank&gt;http://www.donews.net/accesine&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;2、海量智能分词研究版&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;海量智能计算技术研究中心为了使中文信息处理领域的研究者们能够共同分享海量智能中心的研究成果，共同提高中文信息处理水平，特此发布《海量智能分词研究版》，供专家、学者和爱好者进行研究。&lt;/P&gt;  &lt;P&gt;下载页面：[URL=http://www.hylanda.com/cgi-bin/download/download.asp?id=8][/URL]&lt;A   class=contentlink   href="http://www.hylanda.com/cgi-bin/download/download.asp?id=8"   target=_blank&gt;http://www.hylanda.com/cgi-bin/download/download.asp?id=8&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;&lt;BR&gt;&lt;STRONG&gt;3、其他&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;（1）CSW中文智能分词组件&lt;/P&gt;  &lt;P&gt;运行环境：Windows&amp;nbsp;NT、2000、XP&amp;nbsp;或更高，可以在&amp;nbsp;ASP，VB&amp;nbsp;等微软的开发语言中调用。&lt;/P&gt;  &lt;P&gt;简介:&amp;nbsp;CSW中文智能分词DLL组件，可将一段文本自动的按常规汉语词组进行拆分,并以指定方式进行分隔，且可对其拆分后的词组进行语义、词频标注。其广范应用于各行各业的信息资料检索、分析。&lt;/P&gt;  &lt;P&gt;下载页面：[URL=http://www.vgoogle.net/][/URL]&lt;A class=contentlink   href="http://www.vgoogle.net/" target=_blank&gt;http://www.vgoogle.net/&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;（2）&amp;nbsp;C#&amp;nbsp;写的中文分词组件&lt;/P&gt;  &lt;P&gt;据作者介绍，一个&amp;nbsp;DLL&amp;nbsp;文件，可以做中英文分词组件。完全C#托管代码编写，独立开发。&lt;/P&gt;  &lt;P&gt;下载页面：[URL=http://www.rainsts.net/article.asp?id=48][/URL]&lt;A class=contentlink   href="http://www.rainsts.net/article.asp?id=48"   target=_blank&gt;http://www.rainsts.net/article.asp?id=48&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;三&amp;gt;、开源spider一览&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;spider是搜索引擎的必须模块.spider数据的结果直接影响到搜索引擎的评价指标.&lt;/P&gt;  &lt;P&gt;第一个spider程序由MIT的&lt;A class=contentlink   href="http://stuff.mit.edu/~mkgray/net/web-growth-summary.html"   target=_blank&gt;Matthew&amp;nbsp;K&amp;nbsp;Gray&lt;/A&gt;操刀该程序的目的是为了统计互联网中主机的数目&lt;/P&gt;  &lt;P&gt;Spier定义(关于Spider的定义,有广义和狭义两种).&lt;/P&gt;  &lt;P&gt;狭义:利用标准的http协议根据超链和web文档检索的方法遍历万维网信息空间的软件程序.&amp;nbsp;&lt;BR&gt;广义:所有能利用http协议检索web文档的软件都称之为spider.&amp;nbsp;&lt;BR&gt;其中Protocol&amp;nbsp;Gives&amp;nbsp;Sites&amp;nbsp;Way&amp;nbsp;To&amp;nbsp;Keep&amp;nbsp;Out&amp;nbsp;The&amp;nbsp;\'Bots&amp;nbsp;Jeremy&amp;nbsp;Carl,&amp;nbsp;Web&amp;nbsp;Week,   &amp;nbsp;Volume&amp;nbsp;1,&amp;nbsp;Issue&amp;nbsp;7,&amp;nbsp;November&amp;nbsp;1995&amp;nbsp;是和spider息息相关的协议,大家有兴趣参考&lt;A   class=contentlink href="http://www.robotstxt.org/wc/robots.html"   target=_blank&gt;robotstxt.org&lt;/A&gt;.&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;Heritrix&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;Heritrix&amp;nbsp;is&amp;nbsp;the&amp;nbsp;Internet&amp;nbsp;Archive\'s&amp;nbsp;open-source,&amp;nbsp;extensible,&amp;nbsp;web-scale,&amp;nbsp;archival-quality&amp;nbsp;web&amp;nbsp;crawler&amp;nbsp;project.&lt;/P&gt;  &lt;P&gt;Heritrix&amp;nbsp;(sometimes&amp;nbsp;spelled&amp;nbsp;heretrix,&amp;nbsp;or&amp;nbsp;misspelled&amp;nbsp;or&amp;nbsp;missaid&amp;nbsp;as&amp;nbsp;heratrix/heritix/&amp;nbsp;heretix/heratix)&amp;nbsp;is&amp;nbsp;an&amp;nbsp;archaic&amp;nbsp;word&amp;nbsp;for&amp;nbsp;heiress&amp;nbsp;(woman&amp;nbsp;who&amp;nbsp;inherits).&amp;nbsp;Since&amp;nbsp;our&amp;nbsp;crawler&amp;nbsp;seeks&amp;nbsp;to&amp;nbsp;collect&amp;nbsp;and&amp;nbsp;preserve&amp;nbsp;the&amp;nbsp;digital&amp;nbsp;artifacts&amp;nbsp;of&amp;nbsp;our&amp;nbsp;culture&amp;nbsp;for&amp;nbsp;the&amp;nbsp;benefit&amp;nbsp;of&amp;nbsp;future&amp;nbsp;researchers&amp;nbsp;and&amp;nbsp;generations,&amp;nbsp;this&amp;nbsp;name&amp;nbsp;seemed&amp;nbsp;apt.&lt;/P&gt;  &lt;P&gt;语言:JAVA,&amp;nbsp;(&lt;A class=contentlink   href="http://sourceforge.net/project/showfiles.php?group_id=73833&amp;amp;package_id=73980"   target=_blank&gt;下载地址&lt;/A&gt;)&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;WebLech&amp;nbsp;URL&amp;nbsp;Spider&amp;nbsp;&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;&lt;BR&gt;WebLech&amp;nbsp;is&amp;nbsp;a&amp;nbsp;fully&amp;nbsp;featured&amp;nbsp;web&amp;nbsp;site&amp;nbsp;download/mirror&amp;nbsp;tool&amp;nbsp;in&amp;nbsp;Java,&amp;nbsp;which&amp;nbsp;supports&amp;nbsp;many&amp;nbsp;features&amp;nbsp;required&amp;nbsp;to&amp;nbsp;download&amp;nbsp;websites&amp;nbsp;and&amp;nbsp;emulate&amp;nbsp;standard&amp;nbsp;web-browser&amp;nbsp;behaviour&amp;nbsp;as&amp;nbsp;much&amp;nbsp;as&amp;nbsp;possible.&amp;nbsp;WebLech&amp;nbsp;is&amp;nbsp;multithreaded&amp;nbsp;and&amp;nbsp;comes&amp;nbsp;with&amp;nbsp;a&amp;nbsp;GUI&amp;nbsp;console.&amp;nbsp;&lt;/P&gt;  &lt;P&gt;语言:JAVA,&amp;nbsp;(&lt;A class=contentlink   href="http://sourceforge.net/project/showfiles.php?group_id=38170"   target=_blank&gt;下载地址&lt;/A&gt;)&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;JSpider&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;A&amp;nbsp;Java&amp;nbsp;implementation&amp;nbsp;of&amp;nbsp;a&amp;nbsp;flexible&amp;nbsp;and&amp;nbsp;extensible&amp;nbsp;web&amp;nbsp;spider&amp;nbsp;engine.&amp;nbsp;Optional&amp;nbsp;modules&amp;nbsp;allow&amp;nbsp;functionality&amp;nbsp;to&amp;nbsp;be&amp;nbsp;added&amp;nbsp;(searching&amp;nbsp;dead&amp;nbsp;links,&amp;nbsp;testing&amp;nbsp;the&amp;nbsp;performance&amp;nbsp;and&amp;nbsp;scalability&amp;nbsp;of&amp;nbsp;a&amp;nbsp;site,&amp;nbsp;creating&amp;nbsp;a&amp;nbsp;sitemap,&amp;nbsp;etc&amp;nbsp;..&amp;nbsp;&lt;/P&gt;  &lt;P&gt;&lt;BR&gt;语言:JAVA,&amp;nbsp;(&lt;A class=contentlink   href="http://sourceforge.net/project/showfiles.php?group_id=65617"   target=_blank&gt;下载地址&lt;/A&gt;)&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;WebSPHINX&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;WebSPHINX&amp;nbsp;is&amp;nbsp;a&amp;nbsp;web&amp;nbsp;crawler&amp;nbsp;(robot,&amp;nbsp;spider)&amp;nbsp;Java&amp;nbsp;class&amp;nbsp;library,&amp;nbsp;originally&amp;nbsp;developed&amp;nbsp;by&amp;nbsp;Robert&amp;nbsp;Miller&amp;nbsp;of&amp;nbsp;Carnegie&amp;nbsp;Mellon&amp;nbsp;University.&amp;nbsp;Multithreaded,&amp;nbsp;tollerant&amp;nbsp;HTML&amp;nbsp;parsing,&amp;nbsp;URL&amp;nbsp;filtering&amp;nbsp;and&amp;nbsp;page&amp;nbsp;classification,&amp;nbsp;pattern&amp;nbsp;matching,&amp;nbsp;mirroring,&amp;nbsp;and&amp;nbsp;more.&amp;nbsp;&lt;/P&gt;  &lt;P&gt;&lt;BR&gt;语言:JAVA,&amp;nbsp;(&lt;A class=contentlink   href="http://sourceforge.net/project/showfiles.php?group_id=48810"   target=_blank&gt;下载地址&lt;/A&gt;)&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;PySolitaire&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;PySolitaire&amp;nbsp;is&amp;nbsp;a&amp;nbsp;fork&amp;nbsp;of&amp;nbsp;PySol&amp;nbsp;Solitaire&amp;nbsp;that&amp;nbsp;runs&amp;nbsp;correctly&amp;nbsp;on&amp;nbsp;Windows&amp;nbsp;and&amp;nbsp;has&amp;nbsp;a&amp;nbsp;nice&amp;nbsp;clean&amp;nbsp;installer.&amp;nbsp;PySolitaire&amp;nbsp;(Python&amp;nbsp;Solitaire)&amp;nbsp;is&amp;nbsp;a&amp;nbsp;collection&amp;nbsp;of&amp;nbsp;more&amp;nbsp;than&amp;nbsp;300&amp;nbsp;solitaire&amp;nbsp;and&amp;nbsp;Mahjongg&amp;nbsp;games&amp;nbsp;like&amp;nbsp;Klondike&amp;nbsp;and&amp;nbsp;Spider.&amp;nbsp;&lt;/P&gt;  &lt;P&gt;&lt;BR&gt;语言:Python&amp;nbsp;,&amp;nbsp;(&lt;A class=contentlink   href="http://sourceforge.net/project/showfiles.php?group_id=86107"   target=_blank&gt;下载地址&lt;/A&gt;)&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;The&amp;nbsp;Spider&amp;nbsp;Web&amp;nbsp;Network&amp;nbsp;Xoops&amp;nbsp;Mod&amp;nbsp;Team&lt;/STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/P&gt;  &lt;P&gt;The&amp;nbsp;Spider&amp;nbsp;Web&amp;nbsp;Network&amp;nbsp;Xoops&amp;nbsp;Module&amp;nbsp;Team&amp;nbsp;provides&amp;nbsp;modules&amp;nbsp;for&amp;nbsp;the&amp;nbsp;Xoops&amp;nbsp;community&amp;nbsp;written&amp;nbsp;in&amp;nbsp;the&amp;nbsp;PHP&amp;nbsp;coding&amp;nbsp;language.&amp;nbsp;We&amp;nbsp;develop&amp;nbsp;mods&amp;nbsp;and&amp;nbsp;or&amp;nbsp;take&amp;nbsp;existing&amp;nbsp;php&amp;nbsp;script&amp;nbsp;and&amp;nbsp;port&amp;nbsp;it&amp;nbsp;into&amp;nbsp;the&amp;nbsp;Xoops&amp;nbsp;format.&amp;nbsp;High&amp;nbsp;quality&amp;nbsp;mods&amp;nbsp;is&amp;nbsp;our&amp;nbsp;goal.&amp;nbsp;&lt;/P&gt;  &lt;P&gt;&lt;BR&gt;语言:php&amp;nbsp;,&amp;nbsp;(&lt;A class=contentlink   href="http://sourceforge.net/projects/tswnmoddev" target=_blank&gt;下载地址&lt;/A&gt;)&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;Fetchgals&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;A&amp;nbsp;multi-threaded&amp;nbsp;web&amp;nbsp;spider&amp;nbsp;that&amp;nbsp;finds&amp;nbsp;free&amp;nbsp;porn&amp;nbsp;thumbnail&amp;nbsp;galleries&amp;nbsp;by&amp;nbsp;visiting&amp;nbsp;a&amp;nbsp;list&amp;nbsp;of&amp;nbsp;known&amp;nbsp;TGPs&amp;nbsp;(Thumbnail&amp;nbsp;Gallery&amp;nbsp;Posts).&amp;nbsp;It&amp;nbsp;optionally&amp;nbsp;downloads&amp;nbsp;the&amp;nbsp;located&amp;nbsp;pictures&amp;nbsp;and&amp;nbsp;movies.&amp;nbsp;TGP&amp;nbsp;list&amp;nbsp;is&amp;nbsp;included.&amp;nbsp;Public&amp;nbsp;domain&amp;nbsp;perl&amp;nbsp;script&amp;nbsp;running&amp;nbsp;on&amp;nbsp;Linux.&amp;nbsp;&lt;/P&gt;  &lt;P&gt;&lt;/P&gt;  &lt;P&gt;语言:perl&amp;nbsp;,&amp;nbsp;(&lt;A class=contentlink   href="http://sourceforge.net/project/showfiles.php?group_id=110338"   target=_blank&gt;下载地址&lt;/A&gt;)&lt;/P&gt;  &lt;P&gt;&lt;BR&gt;&lt;STRONG&gt;Where&amp;nbsp;Spider&lt;/STRONG&gt;&amp;nbsp;&lt;/P&gt;  &lt;P&gt;&lt;/P&gt;  &lt;P&gt;The&amp;nbsp;purpose&amp;nbsp;of&amp;nbsp;the&amp;nbsp;Where&amp;nbsp;Spider&amp;nbsp;software&amp;nbsp;is&amp;nbsp;to&amp;nbsp;provide&amp;nbsp;a&amp;nbsp;database&amp;nbsp;system&amp;nbsp;for&amp;nbsp;storing&amp;nbsp;URL&amp;nbsp;addresses.&amp;nbsp;The&amp;nbsp;software&amp;nbsp;is&amp;nbsp;used&amp;nbsp;for&amp;nbsp;both&amp;nbsp;ripping&amp;nbsp;links&amp;nbsp;and&amp;nbsp;browsing&amp;nbsp;them&amp;nbsp;offline.&amp;nbsp;The&amp;nbsp;software&amp;nbsp;uses&amp;nbsp;a&amp;nbsp;pure&amp;nbsp;XML&amp;nbsp;database&amp;nbsp;which&amp;nbsp;is&amp;nbsp;easy&amp;nbsp;to&amp;nbsp;export&amp;nbsp;and&amp;nbsp;import.&amp;nbsp;&lt;/P&gt;  &lt;P&gt;语言:XML&amp;nbsp;,&amp;nbsp;(&lt;A class=contentlink   href="http://sourceforge.net/project/showfiles.php?group_id=115931"   target=_blank&gt;下载地址&lt;/A&gt;)&lt;/P&gt;  &lt;P&gt;&lt;BR&gt;[B][/B]&lt;STRONG&gt;Sperowider&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;Sperowider&amp;nbsp;Website&amp;nbsp;Archiving&amp;nbsp;Suite&amp;nbsp;is&amp;nbsp;a&amp;nbsp;set&amp;nbsp;of&amp;nbsp;Java&amp;nbsp;applications,&amp;nbsp;the&amp;nbsp;primary&amp;nbsp;purpose&amp;nbsp;of&amp;nbsp;which&amp;nbsp;is&amp;nbsp;to&amp;nbsp;spider&amp;nbsp;dynamic&amp;nbsp;websites,&amp;nbsp;and&amp;nbsp;to&amp;nbsp;create&amp;nbsp;static&amp;nbsp;distributable&amp;nbsp;archives&amp;nbsp;with&amp;nbsp;a&amp;nbsp;full&amp;nbsp;text&amp;nbsp;search&amp;nbsp;index&amp;nbsp;usable&amp;nbsp;by&amp;nbsp;an&amp;nbsp;associated&amp;nbsp;Java&amp;nbsp;applet.&amp;nbsp;&lt;/P&gt;  &lt;P&gt;语言:Java&amp;nbsp;,&amp;nbsp;(&lt;A class=contentlink   href="http://sourceforge.net/project/showfiles.php?group_id=90254"   target=_blank&gt;下载地址&lt;/A&gt;)&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;SpiderPy&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;SpiderPy&amp;nbsp;is&amp;nbsp;a&amp;nbsp;web&amp;nbsp;crawling&amp;nbsp;spider&amp;nbsp;program&amp;nbsp;written&amp;nbsp;in&amp;nbsp;Python&amp;nbsp;that&amp;nbsp;allows&amp;nbsp;users&amp;nbsp;to&amp;nbsp;collect&amp;nbsp;files&amp;nbsp;and&amp;nbsp;search&amp;nbsp;web&amp;nbsp;sites&amp;nbsp;through&amp;nbsp;a&amp;nbsp;configurable&amp;nbsp;interface.&amp;nbsp;&lt;/P&gt;  &lt;P&gt;语言:Python&amp;nbsp;,&amp;nbsp;(&lt;A class=contentlink   href="http://sourceforge.net/project/showfiles.php?group_id=55531"   target=_blank&gt;下载地址&lt;/A&gt;)&lt;/P&gt;  &lt;P&gt;&lt;BR&gt;[B][/B]&lt;STRONG&gt;Spidered&amp;nbsp;Data&amp;nbsp;Retrieval&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;Spider&amp;nbsp;is&amp;nbsp;a&amp;nbsp;complete&amp;nbsp;standalone&amp;nbsp;Java&amp;nbsp;application&amp;nbsp;designed&amp;nbsp;to&amp;nbsp;easily&amp;nbsp;integrate&amp;nbsp;varied&amp;nbsp;datasources.&amp;nbsp;*&amp;nbsp;XML&amp;nbsp;driven&amp;nbsp;framework&amp;nbsp;*&amp;nbsp;Scheduled&amp;nbsp;pulling&amp;nbsp;*&amp;nbsp;Highly&amp;nbsp;extensible&amp;nbsp;*&amp;nbsp;Provides&amp;nbsp;hooks&amp;nbsp;for&amp;nbsp;custom&amp;nbsp;post-processing&amp;nbsp;and&amp;nbsp;configuration&amp;nbsp;&lt;/P&gt;  &lt;P&gt;语言:Java&amp;nbsp;,&amp;nbsp;(&lt;A class=contentlink   href="http://sourceforge.net/project/showfiles.php?group_id=90769"   target=_blank&gt;下载地址&lt;/A&gt;)&lt;/P&gt;  &lt;P&gt;&lt;BR&gt;[B][/B]&lt;STRONG&gt;webloupe&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;WebLoupe&amp;nbsp;is&amp;nbsp;a&amp;nbsp;java-based&amp;nbsp;tool&amp;nbsp;for&amp;nbsp;analysis,&amp;nbsp;interactive&amp;nbsp;visualization&amp;nbsp;(sitemap),&amp;nbsp;and&amp;nbsp;exploration&amp;nbsp;of&amp;nbsp;the&amp;nbsp;information&amp;nbsp;architecture&amp;nbsp;and&amp;nbsp;specific&amp;nbsp;properties&amp;nbsp;of&amp;nbsp;local&amp;nbsp;or&amp;nbsp;publicly&amp;nbsp;accessible&amp;nbsp;websites.&amp;nbsp;Based&amp;nbsp;on&amp;nbsp;web&amp;nbsp;spider&amp;nbsp;(or&amp;nbsp;web&amp;nbsp;crawler)&amp;nbsp;technology.&amp;nbsp;&lt;/P&gt;  &lt;P&gt;语言:java&amp;nbsp;,&amp;nbsp;(&lt;A class=contentlink   href="http://sourceforge.net/project/showfiles.php?group_id=121963"   target=_blank&gt;下载地址&lt;/A&gt;)&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;ASpider&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;Robust&amp;nbsp;featureful&amp;nbsp;multi-threaded&amp;nbsp;CLI&amp;nbsp;web&amp;nbsp;spider&amp;nbsp;using&amp;nbsp;apache&amp;nbsp;commons&amp;nbsp;httpclient&amp;nbsp;v3.0&amp;nbsp;written&amp;nbsp;in&amp;nbsp;java.&amp;nbsp;ASpider&amp;nbsp;downloads&amp;nbsp;any&amp;nbsp;files&amp;nbsp;matching&amp;nbsp;your&amp;nbsp;given&amp;nbsp;mime-types&amp;nbsp;from&amp;nbsp;a&amp;nbsp;website.&amp;nbsp;Tries&amp;nbsp;to&amp;nbsp;reg.exp.&amp;nbsp;match&amp;nbsp;emails&amp;nbsp;by&amp;nbsp;default,&amp;nbsp;logging&amp;nbsp;all&amp;nbsp;results&amp;nbsp;using&amp;nbsp;log4j.&amp;nbsp;&lt;/P&gt;  &lt;P&gt;语言:java&amp;nbsp;,&amp;nbsp;(&lt;A class=contentlink   href="http://sourceforge.net/project/showfiles.php?group_id=126578"   target=_blank&gt;下载地址&lt;/A&gt;)&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;larbin&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;Larbin&amp;nbsp;is&amp;nbsp;an&amp;nbsp;HTTP&amp;nbsp;Web&amp;nbsp;crawler&amp;nbsp;with&amp;nbsp;an&amp;nbsp;easy&amp;nbsp;interface&amp;nbsp;that&amp;nbsp;runs&amp;nbsp;under&amp;nbsp;Linux.&amp;nbsp;It&amp;nbsp;can&amp;nbsp;fetch&amp;nbsp;more&amp;nbsp;than&amp;nbsp;5&amp;nbsp;million&amp;nbsp;pages&amp;nbsp;a&amp;nbsp;day&amp;nbsp;on&amp;nbsp;a&amp;nbsp;standard&amp;nbsp;PC&amp;nbsp;(with&amp;nbsp;a&amp;nbsp;good&amp;nbsp;network).&amp;nbsp;&lt;/P&gt;  &lt;P&gt;语言:C++,&amp;nbsp;(&lt;A class=contentlink   href="http://sourceforge.net/project/showfiles.php?group_id=42562"   target=_blank&gt;下载地址&lt;/A&gt;)&lt;/P&gt;  &lt;P&gt;&lt;BR&gt;&lt;STRONG&gt;三、SEO相关资源&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;STRONG&gt;1、域名信息查询&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;　&amp;nbsp;&amp;nbsp;&amp;nbsp;★&amp;nbsp;查询国际顶级域名的信息(.aero,&amp;nbsp;.arpa,&amp;nbsp;.biz,&amp;nbsp;.com,&amp;nbsp;.coop,&amp;nbsp;.edu,&amp;nbsp;.info,&amp;nbsp;.int,   &amp;nbsp;.museum,&amp;nbsp;.net,&amp;nbsp;.org)，可以通过ICANN授权的域名注册商来查询，也可以直接到INTERNIC网站查询，网址是&lt;/P&gt;  &lt;P&gt;　　[URL=http://www.internic.com/whois.html][/URL]&lt;A class=contentlink   href="http://www.internic.com/whois.html"   target=_blank&gt;http://www.internic.com/whois.html&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[URL=http://www.iwhois.com/][/URL]&lt;A   class=contentlink href="http://www.iwhois.com/"   target=_blank&gt;http://www.iwhois.com/&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;　　★&amp;nbsp;查询全球各个地理顶级域名是否已经被注册可以到下列网址查询（其中也包括国内域名.cn）：&lt;/P&gt;  &lt;P&gt;　　[URL=http://www.uwhois.com/cgi/domains.cgi?User=NoAds][/URL]&lt;A   class=contentlink href="http://www.uwhois.com/cgi/domains.cgi?User=NoAds"   target=_blank&gt;http://www.uwhois.com/cgi/domains.cgi?User=NoAds&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;　　★&amp;nbsp;查询国内域名的注册情况，&lt;/P&gt;  &lt;P&gt;　　[URL=http://ewhois.cnnic.net.cn/index.jsp][/URL]&lt;A class=contentlink   href="http://ewhois.cnnic.net.cn/index.jsp"   target=_blank&gt;http://ewhois.cnnic.net.cn/index.jsp&lt;/A&gt;&amp;nbsp;&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;★&amp;nbsp;万网的域名注册信息查询&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[URL=http://www.net.cn/][/URL]&lt;A   class=contentlink href="http://www.net.cn/"   target=_blank&gt;http://www.net.cn/&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;★&amp;nbsp;IP地址查询、域名注册信息Whois查询&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[URL=http://ip.zahuopu.com/][/URL]&lt;A   class=contentlink href="http://ip.zahuopu.com/"   target=_blank&gt;http://ip.zahuopu.com/&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;&lt;BR&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;2、alexa相关与搜索排行榜&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;★&amp;nbsp;中文排名500强&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[URL=http://www.alexa.com/site/ds/top_sites?ts_mode=lang&amp;amp;lang=zh_gb2312][/URL]&lt;A   class=contentlink   href="http://www.alexa.com/site/ds/top_sites?ts_mode=lang&amp;amp;lang=zh_gb2312"   target=_blank&gt;http://www.alexa.com/site/ds/top_sites?ts_mode=lang&amp;amp;lang=zh_gb2312&lt;/A&gt;&amp;nbsp;&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;★&amp;nbsp;Google&amp;nbsp;Zeitgeist--Google搜索排行榜&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[URL=http://www.google.com/press/intl-zeitgeist.html#cn][/URL]&lt;A   class=contentlink href="http://www.google.com/press/intl-zeitgeist.html#cn"   target=_blank&gt;http://www.google.com/press/intl-zeitgeist.html#cn&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;★&amp;nbsp;百度中文搜索风云榜&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[URL=http://top.baidu.com/][/URL]&lt;A   class=contentlink href="http://top.baidu.com/"   target=_blank&gt;http://top.baidu.com/&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;★&amp;nbsp;雅虎搜索排行榜&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[URL=http://misc.yahoo.com.cn/top_index.html][/URL]&lt;A   class=contentlink href="http://misc.yahoo.com.cn/top_index.html"   target=_blank&gt;http://misc.yahoo.com.cn/top_index.html&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;★&amp;nbsp;搜狗搜索指数&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;[URL=http://www.sogou.com/top/][/URL]&lt;A class=contentlink   href="http://www.sogou.com/top/" target=_blank&gt;http://www.sogou.com/top/&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;3、搜索关键词查询&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;★&amp;nbsp;&amp;nbsp;google关键字查询&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;A   class=contentlink href="https://adwords.google.com/select/KeywordSandbox"   target=_blank&gt;https://adwords.google.com/select/KeywordSandbox&lt;/A&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;★&amp;nbsp;百度关键字查询&amp;nbsp;&amp;nbsp;&amp;nbsp;[URL=http://www2.baidu.com/inquire/dsquery.php][/URL]&lt;A   class=contentlink href="http://www2.baidu.com/inquire/dsquery.php"   target=_blank&gt;http://www2.baidu.com/inquire/dsquery.php&lt;/A&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;★&amp;nbsp;搜狐关键词&amp;nbsp;&amp;nbsp;&amp;nbsp;[URL=http://db.sohu.com/regurl/pv_price/query_consumer.asp][/URL]&lt;A   class=contentlink href="http://db.sohu.com/regurl/pv_price/query_consumer.asp"   target=_blank&gt;http://db.sohu.com/regurl/pv_price/query_consumer.asp&lt;/A&gt;&amp;nbsp;&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;4、seo项目/工具&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;★网页质量&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[URL=http://category.booso.com/cgi-bin/category/category.cgi][/URL]&lt;A   class=contentlink href="http://category.booso.com/cgi-bin/category/category.cgi"   target=_blank&gt;http://category.booso.com/cgi-bin/category/category.cgi&lt;/A&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;★关键词密度&amp;nbsp;&amp;nbsp;&amp;nbsp;[URL=http://www.21ql.com/seo/keyword.asp][/URL]&lt;A   class=contentlink href="http://www.21ql.com/seo/keyword.asp"   target=_blank&gt;http://www.21ql.com/seo/keyword.asp&lt;/A&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;★搜索引擎蜘蛛模拟器&amp;nbsp;&amp;nbsp;[URL=http://www.webconfs.com/search-engine-spider-simulator.php][/URL]&lt;A   class=contentlink   href="http://www.webconfs.com/search-engine-spider-simulator.php"   target=_blank&gt;http://www.webconfs.com/search-engine-spider-simulator.php&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;★Google&amp;nbsp;Dance查询工具：[URL=http://www.google-dance-tool.com/][/URL]&lt;A   class=contentlink href="http://www.google-dance-tool.com/"   target=_blank&gt;http://www.google-dance-tool.com/&lt;/A&gt;&amp;nbsp;&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;5、seo网站&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;STRONG&gt;英文网站&lt;/STRONG&gt;：&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;搜索观察&amp;nbsp;&amp;nbsp;[URL=http://www.searchenginewatch.com/][/URL]&lt;A   class=contentlink href="http://www.searchenginewatch.com/"   target=_blank&gt;http://www.searchenginewatch.com/&lt;/A&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;seochat&amp;nbsp;&amp;nbsp;&amp;nbsp;[URL=http://www.seochat.com/][/URL]&lt;A   class=contentlink href="http://www.seochat.com/"   target=_blank&gt;http://www.seochat.com&lt;/A&gt;&amp;nbsp;&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;中文网站&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;1&amp;gt;美国尚奇公司&lt;/STRONG&gt;&amp;nbsp;[URL=http://www.zunch.cn/][/URL]&lt;A   class=contentlink href="http://www.zunch.cn/"   target=_blank&gt;http://www.zunch.cn&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;全球领先的网站设计和搜索引擎优化服务公司&amp;nbsp;,目前中国区负责人为--&lt;A class=contentlink   href="http://blog.zunch.cn/category/robinliu/" target=_blank&gt;柳焕斌&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;尚奇博客社区&amp;nbsp;&amp;nbsp;&lt;A class=contentlink href="http://blog.zunch.cn%20target=/"   target=_blank&gt;blog.zunch.cn&amp;nbsp;&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;&lt;A class=contentlink onfocus=this.blur()   href="http://blog.zunch.cn/z-images/zunch_logo_cn.gif" target=_blank&gt;&lt;IMG   alt=按此在新窗口浏览图片 src="http://blog.zunch.cn/z-images/zunch_logo_cn.gif"   onload="javascript:if(this.width&gt;screen.width-333)this.width=screen.width-333"   border=0&gt;&lt;/A&gt;&lt;BR&gt;在这里可以获取最新的SEO行业信息&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;2&amp;gt;搜索引擎优化交流中心&lt;/STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[URL=http://www.seoonline.cn/][/URL]&lt;A   class=contentlink href="http://www.seoonline.cn/"   target=_blank&gt;http://www.seoonline.cn&lt;/A&gt;&amp;nbsp;&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;SEO从业者网站&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;1&amp;gt;&lt;/STRONG&gt;尚奇中国区负责人为--&lt;A class=contentlink   href="http://blog.zunch.cn/category/robinliu/"   target=_blank&gt;柳焕斌&lt;/A&gt;&amp;nbsp;&amp;nbsp;[URL=http://blog.zunch.cn/category/robinliu/][/URL]&lt;A   class=contentlink href="http://blog.zunch.cn/category/robinliu/"   target=_blank&gt;http://blog.zunch.cn/category/robinliu/&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;2&amp;gt;&lt;/STRONG&gt;seo专业人士--bianyue&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[URL=http://www.bianyue.com/][/URL]&lt;A   class=contentlink href="http://www.bianyue.com/"   target=_blank&gt;http://www.bianyue.com/&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;四、各大搜索引擎公司相关资料&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;1、联系方式&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;Google&lt;/STRONG&gt;&amp;nbsp;&lt;/P&gt;  &lt;P&gt;[URL=http://www.google.com/intl/zh-CN/contact.html][/URL]&lt;A class=contentlink   href="http://www.google.com/intl/zh-CN/contact.html"   target=_blank&gt;http://www.google.com/intl/zh-CN/contact.html&lt;/A&gt;&amp;nbsp;&lt;BR&gt;公司总部&lt;BR&gt;1600&amp;nbsp;Amphitheatre&amp;nbsp;Parkway&lt;BR&gt;Mountain&amp;nbsp;View,&amp;nbsp;CA&lt;BR&gt;94043&amp;nbsp;USA&lt;BR&gt;phone:&amp;nbsp;(650)&amp;nbsp;253-0000&lt;BR&gt;fax:&amp;nbsp;(650)&amp;nbsp;253-0001&lt;BR&gt;电子邮件：&lt;A   class=contentlink href="http://www.zhihere.com/bbs/mailtchinese_s@google.com"   target=_blank&gt;chinese_s@google.com&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;STRONG&gt;百度&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;[URL=http://d.baidu.com/contact/index.html][/URL]&lt;A class=contentlink   href="http://d.baidu.com/contact/index.html"   target=_blank&gt;http://d.baidu.com/contact/index.html&lt;/A&gt;&amp;nbsp;&lt;BR&gt;电话&amp;nbsp;（010）82621188&amp;nbsp;&lt;BR&gt;传真&amp;nbsp;（010）82607007&amp;nbsp;82607008&amp;nbsp;&lt;BR&gt;E-mail&amp;nbsp;&lt;A   class=contentlink href="http://www.zhihere.com/bbs/mailtwebmaster@baidu.com"   target=_blank&gt;webmaster@baidu.com&lt;/A&gt;&amp;nbsp;&lt;BR&gt;地址&amp;nbsp;北京市北四环西路58号理想国际大厦12层&amp;nbsp;&lt;BR&gt;邮编&amp;nbsp;100080&amp;nbsp;&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;STRONG&gt;雅虎/一搜&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;[URL=http://cn.yahoo.com/docs/sales/040203_contact.htm][/URL]&lt;A   class=contentlink href="http://cn.yahoo.com/docs/sales/040203_contact.htm"   target=_blank&gt;http://cn.yahoo.com/docs/sales/040203_contact.htm&lt;/A&gt;&amp;nbsp;&lt;BR&gt;总机：010-65811221&lt;BR&gt;地址：北京市朝阳区光华东路和乔大厦B座5层雅虎中国搜索事业部&amp;nbsp;&lt;BR&gt;邮编：100026&lt;BR&gt;传真：010-65812440&lt;BR&gt;在线问题提交：[URL=http://www.yisou.com/search_feedback.html][/URL]&lt;A   class=contentlink href="http://www.yisou.com/search_feedback.html"   target=_blank&gt;http://www.yisou.com/search_feedback.html&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;STRONG&gt;中国搜索&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;[URL=http://www.zhongsou.com/kefu/kfzs.htm][/URL]&lt;A class=contentlink   href="http://www.zhongsou.com/kefu/kfzs.htm"   target=_blank&gt;http://www.zhongsou.com/kefu/kfzs.htm&lt;/A&gt;&amp;nbsp;&lt;BR&gt;地址：北京市西直门北大街42号华星大厦a座15.16层&lt;BR&gt;邮编：100088&lt;BR&gt;总机:010-62266296&lt;BR&gt;传真:&amp;nbsp;010-82211302&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;STRONG&gt;搜狐搜索&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;[URL=http://www.sohu.com/about/lianxi.htm][/URL]&lt;A class=contentlink   href="http://www.sohu.com/about/lianxi.htm"   target=_blank&gt;http://www.sohu.com/about/lianxi.htm&lt;/A&gt;&lt;BR&gt;地址：北京市海淀区中关村东路1号清华科技园9号威新国际大厦10层&amp;nbsp;&lt;BR&gt;邮编:&amp;nbsp;100084&amp;nbsp;&lt;BR&gt;电话：&amp;nbsp;86-10-62726666&lt;BR&gt;传真：&amp;nbsp;86-10-62728300&amp;nbsp;&lt;/P&gt;  &lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;新浪搜索&lt;/STRONG&gt;&lt;/P&gt;  &lt;P&gt;[URL=http://ads.sina.com.cn/contact.html][/URL]&lt;A class=contentlink   href="http://ads.sina.com.cn/contact.html"   target=_blank&gt;http://ads.sina.com.cn/contact.html&lt;/A&gt;&amp;nbsp;&lt;BR&gt;北京市北四环西路58号理想国际大厦20层&lt;BR&gt;邮编：100080&lt;BR&gt;Tel：(86-10)82628888&lt;BR&gt;Fax：(86-10)82607166&lt;BR&gt;搜索引擎咨询电话:010-82628888转6688&lt;BR&gt;搜索引擎联系信箱&amp;nbsp;&lt;A   class=contentlink   href="http://www.zhihere.com/bbs/mailtsearchcn@staff.sina.com.cn"   target=_blank&gt;searchcn@staff.sina.com.cn&lt;/A&gt;&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;STRONG&gt;网易搜索&lt;/STRONG&gt;&lt;/P&gt;[URL=http://so.163.com/contactus.shtml][/URL]&lt;A   class=contentlink href="http://so.163.com/contactus.shtml"   target=_blank&gt;http://so.163.com/contactus.shtml&lt;/A&gt;&amp;nbsp;&lt;BR&gt;北京市东城区东长安街1号东方广场东方经贸城东三办公楼1901室&lt;BR&gt;邮编/Zip：100738&lt;BR&gt;网易搜索引擎客服热线：&lt;BR&gt;电话：010-82110163-8350、8121、8136&lt;BR&gt;E-mail：&lt;A   class=contentlink   href="http://www.zhihere.com/bbs/mailtadp_complaint@service.netease.com"   target=_blank&gt;adp_complaint@service.netease.com&lt;/A&gt;&lt;/DIV&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;/FONT&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5906929445033990464-4263895131813198550?l=irlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5906929445033990464&amp;postID=4263895131813198550&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/4263895131813198550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/4263895131813198550'/><link rel='alternate' type='text/html' href='http://irlab.blogspot.com/2007/11/blog-post_1629.html' title=' 搜索引擎学习资源收集 '/><author><name>xlqb</name><uri>http://www.blogger.com/profile/07757898792107625243</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5906929445033990464.post-8588442964704272102</id><published>2007-11-09T01:01:00.001+08:00</published><updated>2007-11-09T01:01:36.378+08:00</updated><title type='text'>计算机类中文核心期刊 </title><content type='html'>&lt;DIV&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;&lt;FONT   size=3&gt;&amp;nbsp;计算机类中文核心期刊&lt;BR&gt;&lt;BR&gt;计算机类中文核心期刊简介在实际工作中，常有些读者在职称评审、投稿、申报项目时，需要查找计算机类中文权威、核心期刊目录或编辑部地址、联系方式等，为给计算机系的师生们提供方便，现汇编、整理了这份"计算机类中文核心期刊简介"，供有需求的师生参考。&lt;/FONT&gt;  &lt;P&gt;计算机类中文核心期刊目录如下： &lt;/P&gt;  &lt;P&gt;1.《软件学报》 （月刊） EI、ISTIC收录 &lt;BR&gt;主办单位：中国计算机学会 中国科学院软件研究所 &lt;BR&gt;地址：北京8718信箱   北京海淀区中关村《软件学报》编辑委员会 &lt;BR&gt;邮编：100080 &lt;BR&gt;邮发代号：82－367 &lt;BR&gt;E-mail:jos@iscas.ac.cn   &lt;BR&gt;&lt;A href="http://www.jos.org.cn/" target=_blank&gt;http://www.jos.org.cn&lt;/A&gt;   http://www.jos.org.cn &lt;/P&gt;  &lt;P&gt;2.《计算机学报》 （月刊） EI、ISTIC收录 &lt;BR&gt;主办单位：中国计算机学会 中国科学院计算技术研究所 &lt;BR&gt;地址：北京2704信箱   中国科学院计算技术研究所 《计算机学报》编辑部 &lt;BR&gt;邮编：100080 &lt;BR&gt;邮发代号：2－833 &lt;BR&gt;E-mail: cjc@ict.ac.cn   &lt;BR&gt;&lt;A href="http://www.ict.ac.cn/cjc/cjc.html"   target=_blank&gt;http://www.ict.ac.cn/cjc/cjc.html&lt;/A&gt; cjc@ict.ac.cn &lt;A   href="http://www.ict.ac.cn/cjc/cjc.html"   target=_blank&gt;http://www.ict.ac.cn/cjc/cjc.html&lt;/A&gt; &lt;/P&gt;  &lt;P&gt;3.《计算机研究与发展》 （月刊） ISTIC收录 &lt;BR&gt;主办单位：中国科学院计算技术研究所 中国计算机学会 &lt;BR&gt;地址：北京2704信箱   中国科学院计算技术研究所 《计算机研究与发展》 编辑委员会 &lt;BR&gt;邮编：100080 &lt;BR&gt;邮发代号：2－654 E-mail:crad@ict.ac.cn   &lt;BR&gt;http:// crad.ict.ac.cn &lt;/P&gt;  &lt;P&gt;4.《计算机工程 （半月刊）》 ISTIC收录 &lt;BR&gt;主办单位：华东计算技术研究所 上海市计算机学会 &lt;BR&gt;地址：上海市漕河泾桂林路418号   《计算机工程》编辑部 &lt;BR&gt;邮编：200233 &lt;BR&gt;邮发代号：4－310 &lt;BR&gt;E-mail:hdsce@china.com &lt;BR&gt;&lt;A   href="http://www.jsjc.chinajournal.net.cn/"   target=_blank&gt;http://www.jsjc.chinajournal.net.cn&lt;/A&gt;   http://www.jsjc.chinajournal.net.cn &lt;/P&gt;  &lt;P&gt;5.《自动化学报》 （双月刊） EI、ISTIC收录 &lt;BR&gt;主办单位：中国自动化学会 中国科学院自动化研究所   &lt;BR&gt;地址：北京中关村中国科学院自动化所《自动化学报》编辑部 &lt;BR&gt;邮编：100080 &lt;BR&gt;邮发代号：2-180   &lt;BR&gt;E-mail:aas@iamail.ia.ac.cn &lt;A   href="http://www.chinainfo.gov.cn/periodical/zdhxb"   target=_blank&gt;http://www.chinainfo.gov.cn/periodical/zdhxb&lt;/A&gt;   http://www.chinainfo.gov.cn/periodical/zdhxb &lt;/P&gt;  &lt;P&gt;6 .《模试识别与人工智能》 （季刊） ISTIC收录 &lt;BR&gt;主办单位：中国自动化学会 国家智能计算机研究开发中心 &lt;BR&gt;地址：合肥1130信箱   中国科学院合肥智能机械研究所 《模式识别与人工智能》编辑部 &lt;BR&gt;邮编230031 &lt;BR&gt;邮发代号：26-69   &lt;BR&gt;E-mail:bjb@mail.iim.ac.cn &lt;/P&gt;  &lt;P&gt;7.《小型微型计算机系统》 （月刊） ISTIC收录 &lt;BR&gt;主办单位：中科院沈阳计算技术研究所 地址：沈阳市和平区三好街100号   中科院沈阳计算技术研究所 《小型微型计算机系统》编辑部 &lt;BR&gt;邮编：110004 &lt;BR&gt;邮发代号：8－108   &lt;BR&gt;E-mail:xwjxt@sict.ac.cn &lt;BR&gt;&lt;A href="http://www./"   target=_blank&gt;http://www.&lt;/A&gt; sict.ac.cn &lt;/P&gt;  &lt;P&gt;8.《计算机科学》 （月刊） ISTIC收录 &lt;BR&gt;主办单位：国家科技部西南信息中心 &lt;BR&gt;地址：重庆市渝中区胜利路132号 《计算机科学》杂志社   &lt;BR&gt;邮编：400013 &lt;BR&gt;邮发代号：78－68 &lt;BR&gt;E-mail:jsjkx@swic.ac.cn &lt;/P&gt;  &lt;P&gt;9.《计算机应用与软件》（月刊） &lt;BR&gt;主办单位：上海市计算技术研究所 上海计算机软件技术开发中心 &lt;BR&gt;地址：上海市愚园路546号   《计算机应用与软件》编辑部 &lt;BR&gt;邮编：200040 &lt;BR&gt;邮发代号：4－379 &lt;/P&gt;  &lt;P&gt;10.《数值计算与计算机应用》 （季刊） ISTIC收录 &lt;BR&gt;主办单位：中国科学院计算数学与科学工程计算研究所 &lt;BR&gt;地址：北京市2719信箱   《数值计算与计算机应用》编辑部 &lt;BR&gt;邮编：100080 &lt;BR&gt;邮发代号：2-413 &lt;BR&gt;E-mail:SZJS@chinajournal.net.cn   &lt;A href="http://www.chinainfo.gov.cn/periodical"   target=_blank&gt;http://www.chinainfo.gov.cn/periodical&lt;/A&gt;   http://www.chinainfo.gov.cn/periodical &lt;/P&gt;  &lt;P&gt;11.《计算机工程与应用》 （旬刊） ISTIC收录 &lt;BR&gt;主办单位：华北计算技术研究所 &lt;BR&gt;地址：北京市北四环中路211号   北京619信箱26分箱《计算机工程与应用》杂志社 &lt;BR&gt;邮编：100083 &lt;BR&gt;邮发代号：82－605 &lt;BR&gt;投稿信箱：   tjit@public2.bat.net.cn &lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;   &amp;nbsp; &lt;A href="mailto:cea@163bj.com"&gt;cea@163bj.com&lt;/A&gt; &lt;BR&gt;&lt;A   href="http://www.chinainfo.gov.cn/periodical/"   target=_blank&gt;http://www.chinainfo.gov.cn/periodical/&lt;/A&gt;   tjit@public2.bat.net.cn &lt;A href="mailto:cea@163bj.com"&gt;cea@163bj.com&lt;/A&gt; &lt;BR&gt;&lt;A   href="http://www.chinainfo.gov.cn/periodical/"   target=_blank&gt;http://www.chinainfo.gov.cn/periodical/&lt;/A&gt; &lt;/P&gt;  &lt;P&gt;12.《计算机应用研究》 （月刊） ISTIC收录 &lt;BR&gt;主办单位：四川省电子计算机应用研究中心 &lt;BR&gt;地址：成都市人民南路4段11号附1号   《计算机应用研究》杂志社 &lt;BR&gt;邮编：610041 &lt;BR&gt;邮发代号：62－68   &lt;BR&gt;E-mail：SRCCA@SICHUAN.NET.CNSRCCA@SICHUAN.NET.CN &lt;/P&gt;  &lt;P&gt;13.《计算机工程与科学》 （双月刊） ISTIC收录 &lt;BR&gt;主办单位：国防科技大学计算机学院 &lt;BR&gt;地址：湖南长沙砚瓦池正街47号   《计算机工程与科学》编辑部 &lt;BR&gt;邮编：410073 &lt;BR&gt;邮发代号：42－153 &lt;BR&gt;E-mail：cchunxi@163.net   &lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;A   href="mailto:cchunxi@163.net"&gt;cchunxi@163.net&lt;/A&gt; &lt;/P&gt;  &lt;P&gt;14.《中文信息学报》 （双月刊） ISTIC收录 &lt;BR&gt;主办单位：中国科学院软件研究所 中国中文信息学会 &lt;BR&gt;地址：北京8718信箱   《中文信息学报》编辑部 &lt;BR&gt;邮编：100080 &lt;BR&gt;E-mail:cips@admin.iscas.ac.cn &lt;/P&gt;  &lt;P&gt;15.《计算机应用》 （月刊） ISTIC收录 &lt;BR&gt;主办单位：中科院成都计算机应用研究所 四川省计算机学会 &lt;BR&gt;地址：成都市人民南路四段九号   成都237信箱《计算机应用》编辑部 &lt;BR&gt;邮编：610041 &lt;BR&gt;邮发代号：62－110   &lt;BR&gt;E-mail:bjb@computerapplications.com.cn &amp;nbsp; &lt;A   href="http://www.computerapplications.com.cn/"   target=_blank&gt;http://www.computerapplications.com.cn&lt;/A&gt; &lt;/P&gt;  &lt;P&gt;16.《计算机辅助设计与图形学学报》 （月刊） ISTIC收录 &lt;BR&gt;主办单位：中国计算机学会 &lt;BR&gt;地址：北京2704信箱 中国科学院计算技术研究所   &lt;BR&gt;邮编：100080 &lt;BR&gt;邮发代号：82－456 &lt;BR&gt;E-mail:jcad@ict.ac.cn &lt;BR&gt;&lt;A   href="http://jcad.ict.ac.cn/" target=_blank&gt;http://jcad.ict.ac.cn&lt;/A&gt; &lt;BR&gt;&lt;A   href="http://jcad.ict.ac.cn/" target=_blank&gt;http://jcad.ict.ac.cn&lt;/A&gt; &lt;/P&gt;  &lt;P&gt;17.《计算机科学与技术》（英文版） （双月刊） SCIE、EI收录 &lt;BR&gt;主办单位：中国科学院计算技术研究所 &lt;BR&gt;地址：北京2704信箱   &lt;BR&gt;邮编：100080 &lt;BR&gt;邮发代号：2－578 &lt;BR&gt;E-mail:jcst@ict.ac.cn &lt;BR&gt;&lt;A   href="http://jcst.ict.ac.cn/" target=_blank&gt;http://jcst.ict.ac.cn&lt;/A&gt; &lt;BR&gt;&lt;A   href="http://jcst.ict.ac.cn/" target=_blank&gt;http://jcst.ict.ac.cn&lt;/A&gt; &lt;/P&gt;  &lt;P&gt;18.《计算机工程与设计》 （月刊） &lt;BR&gt;主办单位：中国航天科工集团二院706所 &lt;BR&gt;地址：北京142信箱406分箱 《计算机工程与设计》编辑部   &lt;BR&gt;邮编：100854 &lt;BR&gt;邮发代号：82－425 &lt;BR&gt;E-mail:ced@httx.com.cn &lt;BR&gt;&amp;nbsp; &amp;nbsp;   &amp;nbsp; &amp;nbsp; &amp;nbsp; ced@httx.com.cn &lt;/P&gt;  &lt;P&gt;19.《 微电子学与计算机》 （月刊） &lt;BR&gt;主办单位：中国航天科技集团公司西安微电子技术研究所 &lt;BR&gt;地址：西安市81号信箱 《   微电子学与计算机》编辑部 &lt;BR&gt;邮编：710054 &lt;BR&gt;邮发代号：52－16   &lt;BR&gt;说明：检索系统摘引情况选定三个系统，即SCI(科学引文索引)、EI(工程索引)和 ISTIC   (中国科技期刊引证报告统计源期刊)，未注明者为非统计源期刊, 参照1999年度的数据。   &lt;/P&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;/FONT&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5906929445033990464-8588442964704272102?l=irlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5906929445033990464&amp;postID=8588442964704272102&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/8588442964704272102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5906929445033990464/posts/default/8588442964704272102'/><link rel='alternate' type='text/html' href='http://irlab.blogspot.com/2007/11/blog-post_8317.html' title='计算机类中文核心期刊 '/><author><name>xlqb</name><uri>http://www.blogger.com/profile/07757898792107625243</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5906929445033990464.post-6854433224130472272</id><published>2007-11-09T01:00:00.001+08:00</published><updated>2007-11-09T01:00:15.208+08:00</updated><title type='text'>汉字编码问题(转） </title><content type='html'>&lt;DIV&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;  &lt;P&gt;汉字编码问题&lt;BR&gt;由于常常要和汉字处理打交道，因此，我常常受到汉字编码问题的困扰。在不断的打击与坚持中，也积累了一点汉字编码方面的经验，想和大家一起分享。&lt;BR&gt;一、汉字编码的种类&lt;BR&gt;汉字编码中现在主要用到的有三类，包括GBK，GB2312和Big5。&lt;BR&gt;1、   GB2312又称国标码，由国家标准总局发布，1981年5月1日实施，通行于大陆。新加坡等地也使用此编码。它是一个简化字的编码规范，当然也包括其他的符号、字母、日文假名等，共7445个图形字符，其中汉字占6763个。我们平时说6768个汉字，实际上里边有5个编码为空白，所以总共有6763个汉字。&lt;BR&gt;&amp;nbsp;GB2312规定"对任意一个图形字符都采用两个字节表示，每个字节均采用七位编码表示"，习惯上称第一个字节为"高字节"，第二个字节为"低字节"。GB2312中汉字的编码范围为，第一字节0xB0-0xF7(对应十进制为176-247)，第二个字节0xA0-0xFE（对应十进制为160-254）。&lt;BR&gt;GB2312将代码表分为94个区，对应第一字节（0xa1-0xfe）；每个区94个位（0xa1-0xfe），对应第二字节，两个字节的值分别为区号值和位号值加32（2OH），因此也称为区位码。01-09区为符号、数字区，16-87区为汉字区（0xb0-   0xf7），10-15区、88-94区是有待进一步标准化的空白区。&lt;BR&gt;2、Big5又称大五码，主要为香港与台湾使用，即是一个繁体字编码。每个汉字由两个字节构成，第一个字节的范围从0X81－0XFE（即129-255），共126种。第二个字节的范围不连续，分别为0X40－0X7E（即   64-126），0XA1－0XFE（即161-254），共157种。&lt;/P&gt;  &lt;P&gt;3、GBK是GB2312的扩展，是向上兼容的，因此GB2312   中的汉字的编码与GBK中汉字的相同。另外，GBK中还包含繁体字的编码，它与Big5编码之间的关系我还没有弄明白，好像是不一致的。GBK中每个汉字仍然包含两个字节，第一个字节的范围是0x81-0xFE（即129-254），第二个字节的范围是0x40-0xFE（即64-254）。GBK中有码位23940个，包含汉字21003个。&lt;/P&gt;  &lt;P&gt;表1 汉字编码范围&lt;/P&gt;  &lt;P&gt;名称&amp;nbsp;&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   第一字节&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   第二字节&lt;BR&gt;--------|-------------------------|------------------------&lt;BR&gt;GB2312&amp;nbsp;   |&amp;nbsp;&amp;nbsp; 0xB0-0xF7(176-247)&amp;nbsp;&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp;   0xA0-0xFE（160-254）&lt;BR&gt;--------|-------------------------|-------------------------&lt;BR&gt;GBK0&amp;nbsp;&amp;nbsp;&amp;nbsp;   |&amp;nbsp; x81-0xFE（129-254）&amp;nbsp;&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;   0x40-0xFE（64-254）&lt;BR&gt;--------|-------------------------|-------------------------&lt;BR&gt;Big5&amp;nbsp;&amp;nbsp;&amp;nbsp;   |&amp;nbsp;&amp;nbsp; 0x81-0xFE（129-255）&amp;nbsp; |&amp;nbsp;&amp;nbsp;   0x40-0x7E（64-126），&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   |&amp;nbsp;&amp;nbsp;&amp;nbsp;   0xA1－0xFE（161-254）&lt;BR&gt;--------|-------------------------|------------------------&lt;/P&gt;  &lt;P&gt;&lt;BR&gt;二、对汉字进行hash&lt;BR&gt;为了处理汉字的方便，在查找汉字的时候，我们通常会用到hash的方法，那怎么来确定一个汉字位置呢？这就和每种编码的排列有关了，这里主要给出一种hash函数的策略。&lt;BR&gt;对于GB2312编码，设输入的汉字为GBword，我们可以采用公式(C1-176)*94   + (C2-161)确定GBindex。其中，C1表示第一字节，C2表示第二字节。具体如下：&lt;BR&gt;&amp;nbsp;&amp;nbsp; GBindex =   ((unsigned char)GBword.at(0)-176)*94 + (unsigned char)GBword.at(1) -   161;&lt;BR&gt;&amp;nbsp;&amp;nbsp; 之所以用unsigned char类型，是因为char是一个字节，如果用unsigend   int，因为int是4个字节的，所以会造成扩展，导致错误。&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   对于GBK编码，设输入的汉字为GBKword，则可以采用公式&amp;nbsp;&amp;nbsp;   index=(ch1-0x81)*190+(ch2-0x40)-(ch2/128)，其中ch1是第一字节，ch2是第二字节。&lt;BR&gt;具体的，&lt;BR&gt;&amp;nbsp;&amp;nbsp;   GBKindex = ((unsigned char)GBKword[0]-129)*190   +&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((unsigned char)GBKword[1]-64) - (unsigned   char)GBKword[1]/128;&lt;/P&gt;  &lt;P&gt;三、怎样判断一个汉字的是什么编码&lt;BR&gt;直接根据汉字的编码范围判断，对于GB2312和GBK可用下面两个程序实现。&lt;BR&gt;1、判断是否是GB2312&lt;BR&gt;bool   isGBCode(const string&amp;amp; strIn)&lt;BR&gt;{&lt;BR&gt;unsigned char ch1;&lt;BR&gt;unsigned char   ch2;&lt;/P&gt;  &lt;P&gt;if (strIn.size() &amp;gt;= 2)&lt;BR&gt;{&lt;BR&gt;ch1 = (unsigned char)strIn.at(0);&lt;BR&gt;ch2 =   (unsigned char)strIn.at(1);&lt;BR&gt;if (ch1&amp;gt;=176 &amp;amp;&amp;amp; ch1&amp;lt;=247   &amp;amp;&amp;amp;ch2&amp;gt;=160 &amp;amp;&amp;amp; ch2&amp;lt;=254)&lt;BR&gt;return true;&lt;BR&gt;else return   false;&lt;BR&gt;}&lt;BR&gt;else return false;&lt;BR&gt;}&lt;BR&gt;2、判断是否是GBK编码&lt;BR&gt;bool isGBKCode(const   string&amp;amp; strIn)&lt;BR&gt;{&lt;BR&gt;unsigned char ch1;&lt;BR&gt;unsigned char ch2;&lt;/P&gt;  &lt;P&gt;if (strIn.size() &amp;gt;= 2)&lt;BR&gt;{&lt;BR&gt;ch1 = (unsigned char)strIn.at(0);&lt;BR&gt;ch2 =   (unsigned char)strIn.at(1);&lt;BR&gt;if (ch1&amp;gt;=129 &amp;amp;&amp;amp; ch1&amp;lt;=254   &amp;amp;&amp;amp;ch2&amp;gt;=64 &amp;amp;&amp;amp; ch2&amp;lt;=254)&lt;BR&gt;return true;&lt;BR&gt;else return   false;&lt;BR&gt;}&lt;BR&gt;else return false;&lt;BR&gt;}&lt;/P&gt;  &lt;P&gt;3、对于Big5&lt;BR&gt;它的范围为：高字节从0xA0到0xFE，低字节从0x40到0x7E，和0xA1到0xFE两部分。判断一个汉字是否是BIG5编码，可以如上对字符的编码范围判断即可。如何定位呢？那么也想象所有编码排列为一个二维坐标，纵坐标是高字节，横坐标是低字节。这样一行上的汉字个数：(0x7E-0x40+   1)+(0xFE-0xA1+1)＝157。那么定位算法分两块，为: &lt;/P&gt;  &lt;P&gt;if 0x40&amp;lt;=ch2&amp;lt;=0x7E: #is big5 char   &lt;BR&gt;index=((ch1-0xA1)*157+(ch2-0x40))*2 &lt;BR&gt;elif 0xA1&amp;lt;=ch2&amp;lt;=0xFE: #is big5   char &lt;BR&gt;index=((ch1-0xA1)*157+(ch2-0xA1+63))*2 &lt;/P&gt;  &lt;P&gt;对于第二块，计算偏移量时因为有两块数值，所以在计算后面一段值时，不要忘了前面还有一段值。0x7E-0x40+1=63。&lt;/P&gt;  &lt;P&gt;四、如果判断一个字符是西文字符还是中文字符&lt;BR&gt;大家知道西文字符主要是指ASCII码，它用一个字节表示。且这个字符转换成数字之后，该数字是大于0的，而汉字是两个字节的，第一个字节的转化为数字之后应该是小于0的，因此可以根据每个字节转化为数字之后是否小于0，判断它是否是汉字。&lt;BR&gt;例如，设输入字为strin，则，&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   If (strin.at(0) &amp;lt; 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; "是汉字"   &amp;lt;&amp;lt; endl;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else cout &amp;lt;&amp;lt; "不是汉字" &amp;lt;&amp;lt;   endl;&lt;BR&gt;五、下载GBK编码表（见附件）&lt;BR&gt;&amp;nbsp;&amp;nbsp; 下载GB2312编码表见下面的回帖&lt;/P&gt;  &lt;P&gt;--------------------------------------------------------------------------------&lt;BR&gt;&amp;nbsp;   另一些与编码相关的文章：&lt;BR&gt;1、GB码和BIG5码的互换技术&lt;BR&gt;-------------------------------------------------------------------------&lt;BR&gt;中文与英文用ASCII码一个字节表示不同，它使用两个字节来表示。事实上，在文本文件中保存的就是每个汉字对应的两个字节编码，而显示问题由中文操作系统自动解决。&lt;BR&gt;&amp;nbsp;&amp;nbsp;   汉字编码并不统一，我们使用的是GB码，而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码，GB码文件中保存的是汉字相应的GB编码。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。&lt;BR&gt;&amp;nbsp;&amp;nbsp;   GB码编码规则是这样的：每个汉字由两个字节构成，第一个字节的范围从0XA1－0XFE，共96种。第二个字节的范围分别为0XA1－0XFE，共96种。利用这两个字节共可定义出   96 * 96＝8836种汉字。实际共有6763个汉字。&lt;BR&gt;&amp;nbsp;&amp;nbsp;   BIG5码编码规则是这样的：每个汉字由两个字节构成，第一个字节的范围从0X81－0XFE，共126种。第二个字节的范围分别为0X40－0X7E，   0XA1－0XFE，共157种。也就是说，利用这两个字节共可定义出 126 *   157＝19782种汉字。这些汉字的一部分是我们常用到的，如一、丁，这些字我们称为常用字，其BIG5码的范围为0XA440－0XC671，共   5401个。较不常用的字，如滥、调，我们称为次常用字，范围为 0XC940－0XF9FE，共7652个，剩下的便是一些特殊字符。&lt;BR&gt;&amp;nbsp;&amp;nbsp;   制作码表文件的原理是这样的：首先将所有的GB编码写入一个文件，然后，使用具有GB码到BIG5码转换功能的软件，如UCDOS下的CONVERT.EXE，将文件转换为BIG5码文件，即得到码表文件。&lt;BR&gt;&amp;nbsp;&amp;nbsp;   下面的程序可将全部国标码写入文件gb.txt(以下全部程序用foxpro书写，可很容易的转换成其他语言)&lt;BR&gt;&amp;nbsp;&amp;nbsp; fp =   fopen("gb.txt",2)&lt;BR&gt;&amp;nbsp;&amp;nbsp; for i=161 to 247&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   for j=161 to 254&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   =fwrite(fp,chr(i)+chr(j))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   next&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; =fwrite(fp,chr(13)+chr(10))&lt;BR&gt;&amp;nbsp;&amp;nbsp;   next&lt;BR&gt;&amp;nbsp;&amp;nbsp; =fwrite(fp,chr(26))&lt;BR&gt;&amp;nbsp;&amp;nbsp; =fclose(fp)&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp;   文件的组织形式：行对应编码的第一字节，列对应编码的第二字节。使用时请注意编码的偏移量，如汉字"啊"GB编码0xb1a1第一字节0xb1(177)   第二字节0xa1(161)所以他应该在文件的第(177-161=16)行第((161-161)*2=0)列。&lt;BR&gt;&amp;nbsp;&amp;nbsp;   运行CONVERT.EXE将gb.txt转换成BIG5码的文件，这样就可得到按GB码组织的BIG5码表文件big5.txt。反之亦可得到按BIG5码组织的GB码表文件。&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp; 转换的思路是这样的：(用foxpro书写)&lt;BR&gt;&amp;nbsp;&amp;nbsp;   首先将码表文件装入数组&lt;BR&gt;&amp;nbsp;&amp;nbsp; fp = fopen("big5.txt")&lt;BR&gt;&amp;nbsp;&amp;nbsp; i =   0&lt;BR&gt;&amp;nbsp;&amp;nbsp; do while feof(fp)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i =   i+1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dime dict&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dict =   fgets(fp)&lt;BR&gt;&amp;nbsp;&amp;nbsp; enddo&lt;BR&gt;&amp;nbsp;&amp;nbsp; =fclose(fp)&lt;BR&gt;&amp;nbsp;&amp;nbsp;   其次将待转换的文本装入变量&lt;BR&gt;&amp;nbsp;&amp;nbsp; create cursor temp (mm m)&lt;BR&gt;&amp;nbsp;&amp;nbsp; append   blank&lt;BR&gt;&amp;nbsp;&amp;nbsp; append memo mm from textfilename&lt;BR&gt;&amp;nbsp;&amp;nbsp; text =   mm&lt;BR&gt;&amp;nbsp;&amp;nbsp; 然后扫描文本，替换所有的GB编码&lt;BR&gt;&amp;nbsp;&amp;nbsp; temp = ""&lt;BR&gt;&amp;nbsp;&amp;nbsp; i   = 1&lt;BR&gt;&amp;nbsp;&amp;nbsp; do while i &amp;lt; len(text)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ch =   substr(text,i,1)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if isascii(ch)&amp;nbsp;&amp;nbsp;   &amp;amp;&amp;amp; 若是ASCII码&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp =   temp+ch&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i =   i+1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ch1   = substr(text,i+1,1)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; big5 =   substr(dict[asc(ch)-161+1],(asc(ch1)-161)*2+1,2)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   temp = temp+big5&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i =   i+2&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; endif&lt;BR&gt;&amp;nbsp;&amp;nbsp; enddo&lt;BR&gt;&amp;nbsp;&amp;nbsp;   最后将在temp中得到转换后的文本&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&amp;nbsp; 需要注意的是，在foxpro中数组指针是以1开始，substr函数的起始位&amp;gt;=1。&lt;/P&gt;  &lt;P&gt;&amp;nbsp;&lt;/P&gt;  &lt;P&gt;&lt;/P&gt;  &lt;P&gt;&lt;/P&gt;  &lt;P&gt;今天的目标是超越昨天的自己！ &lt;/P&gt;  &lt;P&gt; &lt;BR&gt;&amp;nbsp;&lt;/P&gt;  &lt;P&gt;--------------------------------------------------------------------------------&lt;BR&gt;　　2005/12/06   03:02pm　IP: 已设置保密&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;   taozi&amp;nbsp;&amp;nbsp; 　　 &lt;BR&gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&lt;BR&gt;信息:&amp;nbsp; &lt;BR&gt;威望:   0 &lt;BR&gt;魅力:&amp;nbsp; &lt;BR&gt;经验:&amp;nbsp; &lt;BR&gt;现金: 96 IR 元 &lt;BR&gt;存款: 2112977 IR 元 &lt;BR&gt;贷款: 没贷款   &lt;BR&gt;来自: 保密　 &lt;BR&gt;在线: 108 时 55 分 18 秒 &lt;BR&gt;总发贴数: 431 篇 &lt;BR&gt;注册日期:   2003/09/03&lt;BR&gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp;消息　查看　搜索　好友　邮件　复制　引用　回复　&lt;/P&gt;  &lt;P&gt;--------------------------------------------------------------------------------&lt;BR&gt;&amp;nbsp;   一、GB2312-80介绍&lt;BR&gt;GB2312码是中华人民共和国国家汉字信息交换用编码，全称《信息交换用汉字编码字符集--基本集》，由国家标准总局发布，1981年5月1日实施，通行于大陆。新加坡等地也使用此编码。&lt;BR&gt;GB2312   收录简化汉字及符号、字母、日文假名等共7445个图形字符，其中汉字占6763个。GB2312规定"对任意一个图形字符都采用两个字节表示，每个字节均采用七位编码表示"，习惯上称第一个字节为"高字节"，第二个字节为"低字节"。GB2312-80包含了大部分常用的一、二级汉字，和9区的符号。该字符集是几乎所有的中文系统和国际化的软件都支持的中文字符集，这也是最基本的中文字符集。其编码范围是高位0xa1－0xfe，低位也是0xa1-   0xfe；汉字从0xb0a1开始，结束于0xf7fe。&lt;BR&gt;GB2312将代码表分为94个区，对应第一字节（0xa1-0xfe）；每个区94个位（0xa1-0xfe），对应第二字节，两个字节的值分别为区号值和位号值加32（2OH），因此也称为区位码。01-09区为符号、数字区，16-   87区为汉字区（0xb0-0xf7），10-15区、88-94区是有待进一步标准化的空白区。GB2312将收录的汉字分成两级：第一级是常用汉字计   3755个，置于16-55区，按汉语拼音字母/笔形顺序排列；第二级汉字是次常用汉字计3008个，置于56-87区，按部首/笔画顺序排列。故而   GB2312最多能表示6763个汉字。&lt;BR&gt;GB2312的编码范围为2121H-777EH，与ASCII有重叠，通行方法是将GB码两个字节的最高位置1以示区别。&lt;BR&gt;二、GB2312-80的扩展&lt;/P&gt;  &lt;P&gt;GBK是GB2312-80的扩展，是向上兼容的。它包含了20902个汉字，其编码范围是0x8140-0xfefe，剔除高位0x80的字位。其所有字符都可以一对一映射到Unicode2.0。&lt;BR&gt;GB18030-2000(GBK2K)在GBK的基础上进一步扩展了汉字，增加了藏、蒙等少数民族的字形。GBK2K从根本上解决了字位不够，字形不足的问题。它有几个特点：&lt;BR&gt;&amp;#61548;它并没有确定所有的字形，只是规定了编码范围，留待以后扩充。&lt;BR&gt;&amp;#61548;编码是变长的，其二字节部分与GBK兼容；四字节部分是扩充的字形、字位，其编码范围是首字节0x81-0xfe、二字节0x30-0x39、三字节0x81-0xfe、四字节0x30-0x39。&lt;BR&gt;&amp;#61548;它的推广是分阶段的，首先要求实现的是能够完全映射到Unicode3.0标准的所有字形。&lt;BR&gt;&amp;#61548;它是国家标准，是强制性的。&lt;BR&gt;&amp;#61548;现在还没有任何一个操作系统
