??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲伊人久久综合中文成人网,久久99精品久久久久久野外,国产69精品久久久久9999http://www.shnenglu.com/Hero/category/7805.html 一D|q封存的记忆Q随风而去zh-cnWed, 25 Nov 2009 18:39:48 GMTWed, 25 Nov 2009 18:39:48 GMT60E序员常用字?vs2008字体修改Ҏ)http://www.shnenglu.com/Hero/archive/2009/11/25/101900.htmlHeroHeroWed, 25 Nov 2009 04:01:00 GMThttp://www.shnenglu.com/Hero/archive/2009/11/25/101900.htmlhttp://www.shnenglu.com/Hero/comments/101900.htmlhttp://www.shnenglu.com/Hero/archive/2009/11/25/101900.html#Feedback1http://www.shnenglu.com/Hero/comments/commentRss/101900.htmlhttp://www.shnenglu.com/Hero/services/trackbacks/101900.html字体不仅是设计师手中重要的武器,Ҏ们开发h员来_字体的选择也有许多讲究Q一个好的、适合展示代码的字体,应该具备以下要素Q?/p>
  • {宽的字W?
  • z、清晰ƈ且规范的字符形状
  • 支持ASCII码ؓ128以上的扩展字W集
  • 与字W同{宽度的I格
  • 易于分L的小写字母l、大写字母I、数?和符号|
  • 易于分L的大写字母O和数?
  • 易于分L的前引号和后引号Q最好能够前后对U?
  • 易于分L的其他标点符P其是大括号、中括号、小括号和尖括号
  • 良好的中文支持和昄

下图展示了一个极端的反例Q虽然很有个性,但ƈ不适合用来昄代码。它的大写字母大的可怕,写字母却小的可怜;字符不仅不清晎ͼ而且不规范;写字母l、大写字母I、数?和符号| 难以分LQ大写字母O和数?难以分LQ标点符可凑合Q只是下划线Z么是断开的?

image

当然Q这个反例的有些夸张,但其上文所列D的条件是比较苛刻的,我们在选择字体时没有必要非要完全满x有条Ӟ事实上这U字体也是凤毛麟角。下文所分n的一些字体也q没有完全满x有条Ӟ我们发现Q只要满了其中一些关键条Ӟ用来昄代码已l很不错了?/p>

在Visual Studio中,更改~辑器的字体是g单的事情Q选择菜单?strong>工具】?strong>选项】,在弹出的“选项”对话框中依次选择“环境”?#8220;字体和颜?/strong>”Q然后在“昄其设|?/strong>”中选择“文本~辑?/strong>”Q最后在“字体”中选择字体可以了Q如下图所C:

image

在上图中Q我们发现Visual Studio已经等宽字体用_体标识了出来,q样做是Z让我们更Ҏ扑ֈ{宽的字体,q不表示{宽字体׃定适合昄代码Q比如下图所C的“新宋?#8221;是一个反例:

image

在新宋体中,数字0之比大写字母O瘦那么一点点Q小写字母l和数?也十分相像,q怺配色Ҏ能够颜色它们区别开来,否则实在难以分L。这也从另一个角度说明了配色Ҏ与字体是相辅相成的,搭配恰当Ӟ会让代码更加清晰易L?/p>

下面和大家分n一些在~程界声名烜赫的字体Q截图所采用的配色方案ؓHumaneStudioQ展C顺序ؓ字体首字母升序。这些字体可能乍一看都一P但仔l品呻Iq是能够发现不同的味道,希望大家都能扑ֈ适合自己的字体?/p>

Andale MonoQ演C字号ؓ14Q?a >猛击q里下蝲Q?/p>

image

 

Anonymous ProQ演C字号ؓ14Q?a >猛击q里下蝲Q?/p>

image

 

Bitstream Vera Sans MonoQ演C字号ؓ14Q?a >猛击q里下蝲Q?/p>

image

 

ConsolasQ演C字号ؓ14QWindows或Visual Studio已内|:

image

 

Courier NewQ演C字号ؓ14QWindows已内|:

image

 

DejaVu Sans MonoQ演C字号ؓ14Q?a >猛击q里下蝲Q?/p>

image

 

 

Envy Code RQ演C字号ؓ16Q?a >猛击q里下蝲Q?/p>

image

 

InconsolataQ演C字号ؓ16Q?a >猛击q里下蝲Q?/p>

image

 

MonacoQ演C字号ؓ12Q?a >猛击q里下蝲Q?/p>

image

 

MonofurQ演C字号ؓ16Q?a >猛击q里下蝲Q?/p>

image

 

ProgmataQ演C字号ؓ14Q?a >猛击q里下蝲Q?/p>

image

 

Share TechMonoQ演C字号ؓ16Q?a >猛击q里下蝲Q?/p>

注:此字体似乎会连在一Lfl昄Z个点Q不使用Q可惜可惜?/p>

image

注Q?/p>

  • 本文所分n的字体均支持ClearType?
  • 从评论来看,中文的显C的是一个媄响美观的重要因素Q所以生了许多微Y雅黑和一些优U英文字体的؜合版Q但其实q有一U方法可以快速而简单的实现用不同的字体昄中英文(感谢DiryBoy提醒Q,Ҏ如下Q?
    • 用文本编辑器打开%AppData%\Microsoft\VisualStudio\9.0\VsFontLk.datQ?
    • ?804一行修改ؓ需要的中文字体Q格式ؓ“0804|中文字体名称”Q比?#8220;0804|微Y雅黑”Q?


Hero 2009-11-25 12:01 发表评论
]]>
软g目版本L命名规则及格式介l?/title><link>http://www.shnenglu.com/Hero/archive/2009/11/17/101199.html</link><dc:creator>Hero</dc:creator><author>Hero</author><pubDate>Tue, 17 Nov 2009 06:14:00 GMT</pubDate><guid>http://www.shnenglu.com/Hero/archive/2009/11/17/101199.html</guid><wfw:comment>http://www.shnenglu.com/Hero/comments/101199.html</wfw:comment><comments>http://www.shnenglu.com/Hero/archive/2009/11/17/101199.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Hero/comments/commentRss/101199.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Hero/services/trackbacks/101199.html</trackback:ping><description><![CDATA[版本控制比较普遍?3 U命名格?: <br><br>  一、GNU 风格的版本号命名格式 : <br><br>  ȝ本号 . 子版本号 [. 修正版本?[. ~译版本?]] <br><br>  英文对照 : Major_Version_Number.Minor_Version_Number[.Revision_Number[.Build_Number]] <br><br>  CZ : 1.2.1, 2.0, 5.0.0 build-13124 <br><br>  二、Windows 风格的版本号命名格式 : <br><br>  ȝ本号 . 子版本号 [ 修正版本?[. ~译版本?]] <br><br>  英文对照 : Major_Version_Number.Minor_Version_Number[Revision_Number[.Build_Number]] <br><br>  CZ: 1.21, 2.0 <br><br>  三?Net Framework 风格的版本号命名格式: <br><br>  ȝ本号.子版本号[.~译版本号[.修正版本号]] <br><br>  英文对照: Major_Version_Number.Minor_Version_Number[.Build_Number[.Revision_Number]] <br><br>  版本L二至四个部分l成Q主版本受次版本受内部版本号和修订号。主版本号和ơ版本号是必选的Q内部版本号和修订号是可选的Q但是如果定义了修订号部分,则内部版本号是必选的。所有定义的部分都必L大于或等?0 的整数?<br><br>  应根据下面的U定使用q些部分Q?<br><br>  Major Q具有相同名UC不同ȝ本号的程序集不可互换。例如,q适用于对产品的大量重写,q些重写使得无法实现向后兼容性?<br><br>  Minor Q如果两个程序集的名U和ȝ本号相同Q而次版本号不同,q指C显著增强,但照ֈ了向后兼Ҏ。例如,q适用于品的修正版或完全向后兼容的新版本?<br><br>  Build Q内部版本号的不同表C对相同源所作的重新~译。这适合于更改处理器、^台或~译器的情况?<br><br>  Revision Q名U、主版本号和ơ版本号都相同但修订号不同的E序集应是完全可互换的。这适用于修复以前发布的E序集中的安全漏z?<br><br>  E序集的只有内部版本h修订号不同的后箋版本被认为是先前版本的修补程?(Hotfix) 更新?<br><br>  版本L理策?<br><br>  一?GNU 风格的版本号理{略Q?<br><br>  1Q项目初版本?, 版本号可以ؓ 0.1 ?0.1.0, 也可以ؓ 1.0 ?1.0.0, 如果你ؓ人很低调 , 我想你会选择那个ȝ本号?0 的方?; <br><br>  2Q当目在进行了局部修Ҏ bug 修正?, ȝ本号和子版本号都不变 , 修正版本号加 1; <br><br>  3. 当项目在原有的基上增加了部分功能?, ȝ本号不变 , 子版本号?1, 修正版本号复位ؓ 0, 因而可以被忽略?; <br><br>  4Q当目在进行了重大修改或局部修正篏U较?, 而导致项目整体发生全局变化?, ȝ本号?1; <br><br>  5Q另?, ~译版本号一般是~译器在~译q程中自动生成的 , 我们只定义其格式 , q不q行Zؓ控制 . <br><br>  二?Window 下的版本L理策略: <br><br>  1Q目初版?, 版本号ؓ 1.0 ?1.00; <br><br>  2. 当项目在q行了局部修Ҏ bug 修正Ӟȝ本号和子版本号都不变 , 修正版本号加 1; <br><br>  3. 当项目在原有的基上增加了部分功能?, ȝ本号不变 , 子版本号?1, 修正版本号复位ؓ 0, 因而可以被忽略?; <br><br>  4. 当项目在q行了重大修Ҏ局部修正篏U较?, 而导致项目整体发生全局变化?, ȝ本号?1; <br><br>  5. 另外 , ~译版本号一般是~译器在~译q程中自动生成的 , 我们只定义其格式 , q不q行Zؓ控制 . <br><br>  另外 , q可以在版本号后面加?Alpha, Beta, Gamma, Current, RC (Release Candidate), Release, Stable {后~ , 在这后缀后面q可以加?1 位数字的版本?. <br><br>  对于用户来说 , 如果某个软g的主版本可行了升 , 用户q想l箋那个软g , 则发行Y件的公司一般要对用h取升U费?; 而如果子版本h修正版本号发生了升 , 一般来说是免费?. <br> <p>附: alphal 内部试?<br>   beta 外部试?<br>   demo 演示?<br>   Enhance 增强版或者加强版 属于正式?<br>   Free 自由?<br>   Full version 完全?属于正式?<br>   shareware ׃n?<br>   Release 发行?有时间限?<br>   Upgrade 升?<br>   Retail 零售?<br>   Cardware 属共享Y件的一U,只要l作者回复一电邮或明信片即可。(有的作者ƈ由此提供注册码等Q,目前q种形式已不多见?<br>   Plus 属增强版Q不q这U大部分是在E序界面及多媒体功能上增强?<br>   Preview 预览?<br>   Corporation & Enterprise 企业?<br>   Standard 标准?<br>   Mini q你版也叫精版只有最基本的功?<br>   Premium ?贵h?<br>   Professional ?专业?<br>   Express ?特别?<br>   Deluxe ?豪华?<br>   Regged ?已注册版 <br>   CN ?体中文版 <br>   CHT ?J体中文?<br>   EN ?英文?<br>   Multilanguage ?多语a?<br><br>  注释Q?<br><br>  α?<br><br>  此版本表C软g仅仅是一个初步完成品Q通常只在软g开发者内部交,也有很少一部分发布l专业测试h员。一般而言Q该版本软g?bug 较多Q普通用h好不要安装?<br><br>  βQbetaQ版 <br><br>  该版本相对于α版已有了很大的改q,消除了严重的错误Q但q是存在着一些缺P需要经q大规模的发布测试来q一步消除。这一版本通常pY件公司免费发布,用户可从相关的站点下载。通过一些专业爱好者的试Q将l果反馈l开发者,开发者们再进行有针对性的修改。该版本也不适合一般用户安装?<br><br>  γ?<br><br>  该版本已l相当成熟了Q与卛_发行的正式版相差无几Q如果用户实在等不及了,可以装上一试?<br><br>  trialQ试用版Q?<br><br>  试用版Y件在最q的几年里颇为流行,主要是得益于互联|的q速发展。该版本软g通常都有旉限制Q过期之后用户如果希望l用,一般得交纳一定的费用q行注册或购买。有些试用版软gq在功能上做了一定的限制?<br><br>  unregisteredQ未注册版) <br><br>  未注册版与试用版极其cMQ只是未注册版通常没有旉限制Q在功能上相对于正式版做了一定的限制Q例如绝大多数网l电话Y件的注册版和未注册版Q两者之间在通话质量上有很大差距。还有些虽然在用上与正式版毫无二致Q但是动不动׃弹出一个恼人的消息框来提醒你注册,如看图Y?acdsee 、智能陈桥汉字输入Y件等?<br><br>  demo?<br><br>  也称为演C版Q在非正式版软g中,该版本的知名度最大?demo 版仅仅集成了正式版中的几个功能,颇有点像 unregistered 。不同的是, demo 版一般不能通过升或注册的Ҏ变ؓ正式版?<br><br>  以上是Y件正式版本推Z前的几个版本Q?#945;?#946;?#947;可以UCؓ试版,大凡成熟软gM有多个测试版Q如 windows 98 ?#946;版,前前后后近?10 个。这么多的测试版一斚wZ最l品尽可能地满用L需要,另一斚w也尽量减了软g中的 bug 。?trial ?unregistered ?demo 有时l称为演C版Q这一cȝ本的q告色彩较浓Q颇有点先尝后买的味道,对于普通用戯言自然是可以免费尝鲜了?<br><br>  正式版 不同cd的Y件的正式版本通常也有区别?<br><br>  release <br><br>  该版本意?#8220;最l释攄”Q在Z一pd的测试版之后Q终归会有一个正式版本,对于用户而言Q购买该版本的Y件绝对不会错。该版本有时也称为标准版?一般情况下Q?release 不会以单词Ş式出现在软g面上,取而代之的是符?(r) Q如 windows nt(r) 4.0 ?ms-dos(r) 6.22 {?<br><br>  registered <br><br>  很显Ӟ该版本是?unregistered 相对的注册版。注册版?release 和下面所讲的 standard 版一P都是软g的正式版本,只是注册版Y件的前n有很大一部分是从|上下蝲的?<br><br>  standard <br><br>  q是最常见的标准版Q不论是什么YӞ标准版一定存在。标准版中包含了该Y件的基本lg及一些常用功能,可以满一般用L需求。其h相对高一U版本而言q是“qxqh”的?<br><br>  deluxe <br><br>  ֐思义即ؓ“豪华?#8221;。豪华版通常是相对于标准版而言的,主要区别是多了几功能,h当然会高Z大块Q不推荐一般用戯买。此版本通常是ؓ那些q求“完美”的专业用h准备的?<br><br>  reference <br><br>  该版本型号常见于癄全书中,比较有名的是微Y?encarta pd?reference 是最高别,其包含的主题、图像、媄片剪辑等相对?standard ?deluxe 版均有大q增加,定w׃张光盘猛增至三张光盘Qƈ且加入了很强的交互功能,当然h也不菌Ӏ可以这么说Q这一版本的百U全书才能算是真正的癄全书Q也是发烧友们收藏的首选?<br><br>  professionalQ专业版Q?<br><br>  专业版是针对某些特定的开发工兯Y件而言的。专业版中有许多内容是标准版中所没有的,q些内容对于一个专业的软g开发h员来说是极ؓ重要的。如微Y?visual foxpro 标准版ƈ不具备编译成可执行文件的功能Q这对于一个完整的开发项目而言昄是无法忍受的Q若客户Z没有 foxpro 不能用。如果用专业版就没有q个问题了?<br><br>  enterpriseQ企业版Q?<br><br>  企业版是开发类软g中的极品Q相当于癄全书中的 reference 版)。拥有一套这U版本的软g可以毫无障碍地开发Q何别的应用软g。如著名?visual c++ 的企业版相对于专业版来说增加了几个附加的Ҏ,?sql 调试、扩展的存储q程向导、支?as/400 ?ole db 的访问等。而这一版本的hg是普通用h法接受的。如微Y?visual studios 6.0 enterprise 中文版的h?23000 元?<br><br>  其他版本 除了以上介绍的一些版本外Q还有一些专有版本名U?<br><br>  updateQ升U版Q?<br><br>  升版的软g是不能独立用的Q该版本的Y件在安装q程中会搜烦原有的正式版Q如果不存在Q则拒绝执行下一步。如 microsoft office 2000 升版?windows 9x 升版等{?<br><br>  OEM?<br><br>  OEM版通常是捆l在g中而不单独销售的版本。将自己的品交l别的公司去卖,保留自己的著作权Q双方互惠互利,一举两得?<br><br>  单机Q网l)?<br><br>  |络版在功能、结构上q比单机版复杂,如果留心一下Y件的报hQ你׃发现某些软g单机版和|络版的h相差非常大,有些|络版甚臛_一个客L口就要加不少钱?<br><br>  普及?<br><br>  该版本有时也会被UCؓ׃n版,其特Ҏh便宜Q有些甚臛_全免费)、功能单一、针Ҏ强Q当然也有占领市场、打ȝ版等因素Q。与试用版不同的是,该版本的软g一般不会有旉上的限制。当Ӟ如果用户惛_U,最好还是去购买正式版?<br><br>  以上是一些常见Y件版本的要介l,随着软g市场行ؓ的变化,现在也出C一些新的版本命名方式,比如windows xp中的xp是取自于experience中的W二、第三个字母。希望以上内容能够对大家的购买、用和下蝲软g有所帮助?<br><br>  Z商业上考虑Q很多的软g都不是非怸谨的遵@q个规则的。最有名的就是微软了。例如他?NT pd版本。大家比较熟悉的是从 NT 4.0 开始的?99 q推Z windows 2000 Q?2001 q退Z windows xp Q?2003 q推Z windows 2003 Q乍一看版本区别蛮大的Q但是看他们的内部版本号׃发现Q变化其实ƈ不大Q只是界面变化的大了而已。这是Y件公司经常干的事情?Window 2000 的版本号?NT 5.0 Q?windows xp 的版本号?NT 5.1 Q?windows 2003 的版本号?NT 5.2 Q而现在的 longhorn 才是真正?NT 6.0 Q印象中是,不敢认Q。这样就可以持箋的赚q大客户的钱。毕竟h的眼睛看得东西是最直观的,所以给人感觉也是变化最大的?/p> <img src ="http://www.shnenglu.com/Hero/aggbug/101199.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Hero/" target="_blank">Hero</a> 2009-11-17 14:14 <a href="http://www.shnenglu.com/Hero/archive/2009/11/17/101199.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javascript [转蝲]http://www.shnenglu.com/Hero/archive/2009/08/14/93310.htmlHeroHeroFri, 14 Aug 2009 06:35:00 GMThttp://www.shnenglu.com/Hero/archive/2009/08/14/93310.htmlhttp://www.shnenglu.com/Hero/comments/93310.htmlhttp://www.shnenglu.com/Hero/archive/2009/08/14/93310.html#Feedback0http://www.shnenglu.com/Hero/comments/commentRss/93310.htmlhttp://www.shnenglu.com/Hero/services/trackbacks/93310.html阅读全文

Hero 2009-08-14 14:35 发表评论
]]>
python获取文g夹大(1Q?/title><link>http://www.shnenglu.com/Hero/archive/2009/07/28/91470.html</link><dc:creator>Hero</dc:creator><author>Hero</author><pubDate>Tue, 28 Jul 2009 06:07:00 GMT</pubDate><guid>http://www.shnenglu.com/Hero/archive/2009/07/28/91470.html</guid><wfw:comment>http://www.shnenglu.com/Hero/comments/91470.html</wfw:comment><comments>http://www.shnenglu.com/Hero/archive/2009/07/28/91470.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Hero/comments/commentRss/91470.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Hero/services/trackbacks/91470.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%; font-family: courier new;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;"> 1</span> <span style="color: #008000;">#</span><span style="color: #008000;">!/usr/bin/env python</span><span style="color: #008000;"><br></span><span style="color: #008080;"> 2</span> <span style="color: #008000;">#<br></span><span style="color: #008080;"> 3</span> <span style="color: #008000;">#</span><span style="color: #008000;">       getDirSize.py</span><span style="color: #008000;"><br></span><span style="color: #008080;"> 4</span> <span style="color: #008000;">#</span><span style="color: #008000;">       </span><span style="color: #008000;"><br></span><span style="color: #008080;"> 5</span> <span style="color: #008000;">#</span><span style="color: #008000;">       Copyright 2009 Hiro <wangzhaoren@gmail.com></span><span style="color: #008000;"><br></span><span style="color: #008080;"> 6</span> <span style="color: #008000;">#</span><span style="color: #008000;">       </span><span style="color: #008000;"><br></span><span style="color: #008080;"> 7</span> <span style="color: #008000;">#</span><span style="color: #008000;">       This program is free software; you can redistribute it and/or modify</span><span style="color: #008000;"><br></span><span style="color: #008080;"> 8</span> <span style="color: #008000;">#</span><span style="color: #008000;">       it under the terms of the GNU General Public License as published by</span><span style="color: #008000;"><br></span><span style="color: #008080;"> 9</span> <span style="color: #008000;">#</span><span style="color: #008000;">       the Free Software Foundation; either version 2 of the License, or</span><span style="color: #008000;"><br></span><span style="color: #008080;">10</span> <span style="color: #008000;">#</span><span style="color: #008000;">       (at your option) any later version.</span><span style="color: #008000;"><br></span><span style="color: #008080;">11</span> <span style="color: #008000;">#</span><span style="color: #008000;">       </span><span style="color: #008000;"><br></span><span style="color: #008080;">12</span> <span style="color: #008000;">#</span><span style="color: #008000;">       This program is distributed in the hope that it will be useful,</span><span style="color: #008000;"><br></span><span style="color: #008080;">13</span> <span style="color: #008000;">#</span><span style="color: #008000;">       but WITHOUT ANY WARRANTY; without even the implied warranty of</span><span style="color: #008000;"><br></span><span style="color: #008080;">14</span> <span style="color: #008000;">#</span><span style="color: #008000;">       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><span style="color: #008000;"><br></span><span style="color: #008080;">15</span> <span style="color: #008000;">#</span><span style="color: #008000;">       GNU General Public License for more details.</span><span style="color: #008000;"><br></span><span style="color: #008080;">16</span> <span style="color: #008000;">#</span><span style="color: #008000;">       </span><span style="color: #008000;"><br></span><span style="color: #008080;">17</span> <span style="color: #008000;">#</span><span style="color: #008000;">       You should have received a copy of the GNU General Public License</span><span style="color: #008000;"><br></span><span style="color: #008080;">18</span> <span style="color: #008000;">#</span><span style="color: #008000;">       along with this program; if not, write to the Free Software</span><span style="color: #008000;"><br></span><span style="color: #008080;">19</span> <span style="color: #008000;">#</span><span style="color: #008000;">       Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,</span><span style="color: #008000;"><br></span><span style="color: #008080;">20</span> <span style="color: #008000;">#</span><span style="color: #008000;">       MA 02110-1301, USA.</span><span style="color: #008000;"><br></span><span style="color: #008080;">21</span> <span style="color: #008000;"></span><span style="color: #000000;"><br></span><span style="color: #008080;">22</span> <span style="color: #000000;"></span><span style="color: #0000ff;">import</span><span style="color: #000000;"> os<br></span><span style="color: #008080;">23</span> <span style="color: #000000;"></span><span style="color: #0000ff;">from</span><span style="color: #000000;"> os.path </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> join, getsize<br></span><span style="color: #008080;">24</span> <span style="color: #000000;"><br></span><span style="color: #008080;">25</span> <span style="color: #000000;"></span><span style="color: #0000ff;">def</span><span style="color: #000000;"> getDirSize( dir ):<br></span><span style="color: #008080;">26</span> <span style="color: #000000;">    size </span><span style="color: #000000;">=</span><span style="color: #000000;"> 0L<br></span><span style="color: #008080;">27</span> <span style="color: #000000;">    </span><span style="color: #0000ff;">for</span><span style="color: #000000;"> root, dirs, files </span><span style="color: #0000ff;">in</span><span style="color: #000000;"> os.walk(dir):<br></span><span style="color: #008080;">28</span> <span style="color: #000000;">        size </span><span style="color: #000000;">+=</span><span style="color: #000000;"> sum( [getsize(join(root, name)) </span><span style="color: #0000ff;">for</span><span style="color: #000000;"> name </span><span style="color: #0000ff;">in</span><span style="color: #000000;"> files] )<br></span><span style="color: #008080;">29</span> <span style="color: #000000;">    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> size<br></span><span style="color: #008080;">30</span> <span style="color: #000000;"><br></span><span style="color: #008080;">31</span> <span style="color: #000000;"></span><span style="color: #0000ff;">def</span><span style="color: #000000;"> main():<br></span><span style="color: #008080;">32</span> <span style="color: #000000;">    <br></span><span style="color: #008080;">33</span> <span style="color: #000000;">    filesize </span><span style="color: #000000;">=</span><span style="color: #000000;"> getDirSize( </span><span style="color: #800000;">"</span><span style="color: #800000;">/home/wangzr</span><span style="color: #800000;">"</span><span style="color: #000000;"> )<br></span><span style="color: #008080;">34</span> <span style="color: #000000;">    </span><span style="color: #0000ff;">print</span><span style="color: #000000;"> ( </span><span style="color: #800000;">"</span><span style="color: #800000;">there are %0.3f</span><span style="color: #800000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">%</span><span style="color: #000000;">(filesize</span><span style="color: #000000;">/</span><span style="color: #000000;">1024</span><span style="color: #000000;">/</span><span style="color: #000000;">1024</span><span style="color: #000000;">), </span><span style="color: #800000;">"</span><span style="color: #800000;">Mb in /home/wangzr</span><span style="color: #800000;">"</span><span style="color: #000000;"> )<br></span><span style="color: #008080;">35</span> <span style="color: #000000;">        <br></span><span style="color: #008080;">36</span> <span style="color: #000000;">    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> 0<br></span><span style="color: #008080;">37</span> <span style="color: #000000;"><br></span><span style="color: #008080;">38</span> <span style="color: #000000;"></span><span style="color: #0000ff;">if</span><span style="color: #000000;"> </span><span style="color: #800080;">__name__</span><span style="color: #000000;"> </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #800000;">'</span><span style="color: #800000;">__main__</span><span style="color: #800000;">'</span><span style="color: #000000;">: main()<br></span><span style="color: #008080;">39</span> <span style="color: #000000;"></span></div> <br><img src ="http://www.shnenglu.com/Hero/aggbug/91470.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Hero/" target="_blank">Hero</a> 2009-07-28 14:07 <a href="http://www.shnenglu.com/Hero/archive/2009/07/28/91470.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>python获取文g夹大(2Q?/title><link>http://www.shnenglu.com/Hero/archive/2009/07/28/91471.html</link><dc:creator>Hero</dc:creator><author>Hero</author><pubDate>Tue, 28 Jul 2009 06:07:00 GMT</pubDate><guid>http://www.shnenglu.com/Hero/archive/2009/07/28/91471.html</guid><wfw:comment>http://www.shnenglu.com/Hero/comments/91471.html</wfw:comment><comments>http://www.shnenglu.com/Hero/archive/2009/07/28/91471.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Hero/comments/commentRss/91471.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Hero/services/trackbacks/91471.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%; font-family: courier new;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;"> 1</span> <span style="color: #008000;">#</span><span style="color: #008000;">!/usr/bin/env python</span><span style="color: #008000;"><br></span><span style="color: #008080;"> 2</span> <span style="color: #008000;">#<br></span><span style="color: #008080;"> 3</span> <span style="color: #008000;">#</span><span style="color: #008000;">       getDirSize2.py</span><span style="color: #008000;"><br></span><span style="color: #008080;"> 4</span> <span style="color: #008000;">#</span><span style="color: #008000;">       </span><span style="color: #008000;"><br></span><span style="color: #008080;"> 5</span> <span style="color: #008000;">#</span><span style="color: #008000;">       Copyright 2009 Hiro <wangzhaoren@gmail.com></span><span style="color: #008000;"><br></span><span style="color: #008080;"> 6</span> <span style="color: #008000;">#</span><span style="color: #008000;">       </span><span style="color: #008000;"><br></span><span style="color: #008080;"> 7</span> <span style="color: #008000;">#</span><span style="color: #008000;">       This program is free software; you can redistribute it and/or modify</span><span style="color: #008000;"><br></span><span style="color: #008080;"> 8</span> <span style="color: #008000;">#</span><span style="color: #008000;">       it under the terms of the GNU General Public License as published by</span><span style="color: #008000;"><br></span><span style="color: #008080;"> 9</span> <span style="color: #008000;">#</span><span style="color: #008000;">       the Free Software Foundation; either version 2 of the License, or</span><span style="color: #008000;"><br></span><span style="color: #008080;">10</span> <span style="color: #008000;">#</span><span style="color: #008000;">       (at your option) any later version.</span><span style="color: #008000;"><br></span><span style="color: #008080;">11</span> <span style="color: #008000;">#</span><span style="color: #008000;">       </span><span style="color: #008000;"><br></span><span style="color: #008080;">12</span> <span style="color: #008000;">#</span><span style="color: #008000;">       This program is distributed in the hope that it will be useful,</span><span style="color: #008000;"><br></span><span style="color: #008080;">13</span> <span style="color: #008000;">#</span><span style="color: #008000;">       but WITHOUT ANY WARRANTY; without even the implied warranty of</span><span style="color: #008000;"><br></span><span style="color: #008080;">14</span> <span style="color: #008000;">#</span><span style="color: #008000;">       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><span style="color: #008000;"><br></span><span style="color: #008080;">15</span> <span style="color: #008000;">#</span><span style="color: #008000;">       GNU General Public License for more details.</span><span style="color: #008000;"><br></span><span style="color: #008080;">16</span> <span style="color: #008000;">#</span><span style="color: #008000;">       </span><span style="color: #008000;"><br></span><span style="color: #008080;">17</span> <span style="color: #008000;">#</span><span style="color: #008000;">       You should have received a copy of the GNU General Public License</span><span style="color: #008000;"><br></span><span style="color: #008080;">18</span> <span style="color: #008000;">#</span><span style="color: #008000;">       along with this program; if not, write to the Free Software</span><span style="color: #008000;"><br></span><span style="color: #008080;">19</span> <span style="color: #008000;">#</span><span style="color: #008000;">       Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,</span><span style="color: #008000;"><br></span><span style="color: #008080;">20</span> <span style="color: #008000;">#</span><span style="color: #008000;">       MA 02110-1301, USA.</span><span style="color: #008000;"><br></span><span style="color: #008080;">21</span> <span style="color: #008000;"></span><span style="color: #000000;"><br></span><span style="color: #008080;">22</span> <span style="color: #000000;"><br></span><span style="color: #008080;">23</span> <span style="color: #000000;"></span><span style="color: #0000ff;">import</span><span style="color: #000000;"> os<br></span><span style="color: #008080;">24</span> <span style="color: #000000;"></span><span style="color: #008000;">#</span><span style="color: #008000;">from os import listdir</span><span style="color: #008000;"><br></span><span style="color: #008080;">25</span> <span style="color: #008000;"></span><span style="color: #000000;"><br></span><span style="color: #008080;">26</span> <span style="color: #000000;"></span><span style="color: #0000ff;">def</span><span style="color: #000000;"> getDirSize( source ) :<br></span><span style="color: #008080;">27</span> <span style="color: #000000;">    size </span><span style="color: #000000;">=</span><span style="color: #000000;"> 0L<br></span><span style="color: #008080;">28</span> <span style="color: #000000;">    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> os.path.isfile( source ) :<br></span><span style="color: #008080;">29</span> <span style="color: #000000;">        size </span><span style="color: #000000;">+=</span><span style="color: #000000;"> os.stat( source )[</span><span style="color: #000000;">6</span><span style="color: #000000;">]<br></span><span style="color: #008080;">30</span> <span style="color: #000000;">    </span><span style="color: #0000ff;">elif</span><span style="color: #000000;"> os.path.isdir( source ) :<br></span><span style="color: #008080;">31</span> <span style="color: #000000;">        </span><span style="color: #0000ff;">for</span><span style="color: #000000;"> src </span><span style="color: #0000ff;">in</span><span style="color: #000000;"> os.listdir( source ) :<br></span><span style="color: #008080;">32</span> <span style="color: #000000;">            srcpath </span><span style="color: #000000;">=</span><span style="color: #000000;"> os.path.join( source, src )<br></span><span style="color: #008080;">33</span> <span style="color: #000000;">            </span><span style="color: #0000ff;">print</span><span style="color: #000000;"> srcpath<br></span><span style="color: #008080;">34</span> <span style="color: #000000;">            size </span><span style="color: #000000;">+=</span><span style="color: #000000;"> getDirSize( srcpath )<br></span><span style="color: #008080;">35</span> <span style="color: #000000;">    <br></span><span style="color: #008080;">36</span> <span style="color: #000000;">    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> size<br></span><span style="color: #008080;">37</span> <span style="color: #000000;">    <br></span><span style="color: #008080;">38</span> <span style="color: #000000;"></span><span style="color: #0000ff;">def</span><span style="color: #000000;"> main():<br></span><span style="color: #008080;">39</span> <span style="color: #000000;">    <br></span><span style="color: #008080;">40</span> <span style="color: #000000;">    dirname </span><span style="color: #000000;">=</span><span style="color: #000000;"> r</span><span style="color: #800000;">"</span><span style="color: #800000;">/home/wangzr</span><span style="color: #800000;">"</span><span style="color: #000000;"><br></span><span style="color: #008080;">41</span> <span style="color: #000000;">    </span><span style="color: #0000ff;">print</span><span style="color: #000000;"> getDirSize( dirname ) </span><span style="color: #000000;">/</span><span style="color: #000000;"> </span><span style="color: #000000;">1024</span><span style="color: #000000;"> </span><span style="color: #000000;">/</span><span style="color: #000000;">1024</span><span style="color: #000000;"><br></span><span style="color: #008080;">42</span> <span style="color: #000000;">    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> 0<br></span><span style="color: #008080;">43</span> <span style="color: #000000;"><br></span><span style="color: #008080;">44</span> <span style="color: #000000;"></span><span style="color: #0000ff;">if</span><span style="color: #000000;"> </span><span style="color: #800080;">__name__</span><span style="color: #000000;"> </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #800000;">'</span><span style="color: #800000;">__main__</span><span style="color: #800000;">'</span><span style="color: #000000;">: main()<br></span><span style="color: #008080;">45</span> <span style="color: #000000;"></span></div> <br><img src ="http://www.shnenglu.com/Hero/aggbug/91471.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Hero/" target="_blank">Hero</a> 2009-07-28 14:07 <a href="http://www.shnenglu.com/Hero/archive/2009/07/28/91471.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转蝲] python中文~码问题http://www.shnenglu.com/Hero/archive/2009/07/24/91038.htmlHeroHeroFri, 24 Jul 2009 06:30:00 GMThttp://www.shnenglu.com/Hero/archive/2009/07/24/91038.htmlhttp://www.shnenglu.com/Hero/comments/91038.htmlhttp://www.shnenglu.com/Hero/archive/2009/07/24/91038.html#Feedback0http://www.shnenglu.com/Hero/comments/commentRss/91038.htmlhttp://www.shnenglu.com/Hero/services/trackbacks/91038.html 

Unicode 是一个系l,用来表示世界上所有不同语a的字W。当 Python 解析一?XML 文档Ӟ所有的数据都是以unicode的Ş式保存在内存中的?/p>

一会儿你就会了解,但首先,先看一些背景知识?/p>

历史注解. ?unicode 之前Q对于每一U语a都存在独立的字符~码pȝQ每个系l都使用相同的数?0-255)来表CU语a的字W。一些语a (像俄? 对于如何表示相同的字W还有几U有冲突的标准;另一些语a (像日? 拥有太多的字W,需要多个字W集。在pȝ之间q行文档交流是困隄Q因为对于一台计机来说Q没有方法可以识别出文档的作者用了哪种~码模式Q计机?到的只是数字Qƈ且这些数字可以表CZ同的东西。接着考虑到试囑ְq些 (采用不同~码? 文档存放到同一个地?(比如在同一个数据库表中)Q你需要在每段文本的旁边保存字W的~码Qƈ且确保在传递文本的同时编码也q行传递。接着考虑多语a文档Q即在同一文档中 用了不同语言的字W?比较有代表性的是用{义符来进行模式切换;噗,我们处于俄语 koi8-r 模式Q所以字W?241 表示q个Q噗Q现在我们处?Mac 希腊语模式,所以字W?241 表示其它什么。等{? q些是 unicode 被设计出来要解决的问题?/p>

Z解决q些问题Qunicode 用一?2 字节数字表示每个字符Q从 0 ?65535?sup>[8] 每个 2 字节数字表示臛_在一U世界语a中用的一个唯一字符?在多U语a中都使用的字W具有相同的数字码? q样q保每个字W一个数字,q且每个数字一个字W。Unicode 数据永远不会模棱两可?/p>

当然Q仍然还存在着所有那些遗留的~码pȝ的情c例如,7 ?ASCIIQ它可以英文字W存ؓ?0 ?127 的数倹{?65 是大写字?“A”Q?7 是小写字?“a”Q等{? p有着非常单的字母表,所以它可以完全?7 ?ASCII 来表C。像法语、西班牙语和徯之类的西Ƨ语a都用叫?ISO-8859-1 的编码系l?(也叫?#8220;latin-1”)Q它使用 7 ?ASCII 字符表示?0 ?127 的数字,但接着扩展C 128-255 的范围来表示?n 上带有一个L线(241)Q和 u 上带有两个点(252)的字W。Unicode ?0 ?127 上用了?7 ?ASCII 码一L字符表,?128 ?255上同 ISO-8859-1 一P接着使用剩余的数字,256 ?65535Q扩展到表示其它语言的字W?/p>

?处理 unicode 数据Ӟ在某些地方你可能需要将数据转换回这些遗留编码系l之一。例如,Z同其它一些计机pȝ集成Q这些系l期望它的数据用一U特定的单字节编码模 式,或将数据打印输出C个不识别 unicode 的终端或打印机。或数据保存到一个明指定编码模式的 XML 文档中?/p>

在了解这个注解之后,让我们回?Python上来?/p>

?2.0 版开始,Python 整个语言都已l支?unicode?span class=acronym>XML 包?unicode 来保存所有解析了?XML 数据Q而且你可以在M地方使用 unicode?/p>

?9.13. unicode 介绍

>>> s = u'Dive in'            1
>>> s
u'Dive in'
>>> print s 2
Dive in
1 Z创徏一?unicode 字符串而不是通常?ASCII 字符Ԍ要在字符串前面加上字?“u”。注意这个特D的字符串没有Q何非 ASCII 的字W。这样很好;unicode ?ASCII 的一个超?(一个非常大的超?Q所以Q何正常的 ASCII 都可以以 unicode 形式保存h?/td>
2 在打印字W串ӞPython 试图字W串转换Z的默认编码,通常?ASCII ?q会儿有更详l的说明? 因ؓl成q个 unicode 字符串的字符都是 ASCII 字符Q打印结果与打印正常?ASCII 字符串是一LQ{换是无缝的,而且如果你没有注意到 s 是一?unicode 字符串的话,你永q也不会注意C者之间的差别?/td>

?9.14. 存储?ASCII 字符

>>> s = u'La Pe\xf1a'         1
>>> print s 2
Traceback (innermost last):
File "<interactive input>", line 1, in ?
UnicodeError: ASCII encoding error: ordinal not in range(128)

>>> print s.encode('latin-1') 3
La Peña
1 unicode 真正的优势,理所当然的是它保存非 ASCII 字符的能力,例如西班牙语?“ñ”(n 上带有一个L线)。用来表CL线 n ?unicode 字符~码是十六进制的 0xf1 (十进制的241)Q你可以像这栯入:\xf1?/td>
2 q记得我说过 print 函数会尝试将 unicode 字符串{换ؓ ASCII 从而打印它吗?嗯,在这里将不会起作用,因ؓ你的 unicode 字符串包含非 ASCII 字符Q所?Python 会引?UnicodeError 异常?/td>
3 q儿是?unicode 转换为其它编码模式v作用的地斏V?tt class=varname>s 是一?unicode 字符Ԍ?print 只能打印正常的字W串。ؓ了解册个问题,我们调用 encode Ҏ (它可以用于每?unicode 字符? ?unicode 字符串{换ؓ指定~码模式的正常字W串。我们向此函C入一个参数。在本例中,我们使用 latin-1 (也叫 iso-8859-1)Q它包括带L线?n (然而缺省的 ASCII ~码模式不包括,因ؓ它只包含数g 0 ?127 的字W??/td>

q记得我说过Q需要从一?unicode 得到一个正常字W串ӞPython 通常默认?unicode 转换?ASCII 吗?嗯,q个默认~码模式是一个可以定制的选项?/p>

?9.15. sitecustomize.py

# sitecustomize.py                   1
# this file can be anywhere in your Python path,
# but it usually goes in ${pythondir}/lib/site-packages/
import sys
sys.setdefaultencoding('iso-8859-1') 2
1 sitecustomize.py 是一个特D的脚本Q?span class=application>Python 会在启动的时候导入它Q所以在其中的Q何代码都自动运行。就像注解中提到的那P它可以放在Q何地?(只要 import 能够扑ֈ?Q但是通常它位?Python ?tt class=filename>lib 目录?site-packages 目录中?/td>
2 嗯,setdefaultencoding 函数讄默认~码?span class=application>Python 会在M需要将 unicode 字符串自动{换ؓ正规字符串的地方Q用这个编码模式?/td>

?9.16. 讄默认~码的效?/h3>
>>> import sys
>>> sys.getdefaultencoding() 1
'iso-8859-1'
>>> s = u'La Pe\xf1a'
>>> print s 2
La Peña
1 q个例子假设你已l按前一个例子中的改动对 sitecustomize.py 文g做了修改Qƈ且已l重启了 Python。如果你的默认编码还?'ascii'Q可能你没有正设|?sitecustomize.py 文gQ或者是没有重新启动 Python。默认的~码只能?Python 启动的时候改变;之后׃能改变了?׃一些我们现在不会仔l研I的古怪的~程技巧,你甚至不能在 Python 启动之后调用 sys.setdefaultencoding 函数。仔l研I?site.pyQƈ搜烦 “setdefaultencoding” dCؓ什么吧?
2 现在默认的编码模式已l包含了你在字符串中使用的所有字W,Python 对字W串的自动强制{换和打印׃存在问题了?/td>

?9.17. 指定.py文g的编?/h3>

如果你打在你的 Python 代码中保存非 ASCII 字符Ԍ你需要在每个文g的顶端加入编码声明来指定每个 .py 文g的编码。这个声明定义了 .py 文g的编码ؓ UTF-8Q?/p>

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

现在Q想?XML 中的~码应该是怎样的呢Q不错,每一?XML 文档都有指定的编码。重复一下,ISO-8859-1 是西Ƨ语a存放数据的流行编码方式。KOI8-R 是俄语流行的~码方式。编码――如果指定了的话――都?XML 文档的首部?/p>

?9.18. russiansample.xml


<?xml version="1.0" encoding="koi8-r"?>
1
<preface>
<title>Преисxо{ие</title>
2
</preface>
1 q是从一个真实的俄语 XML 文档中提取出来的CZQ它是q本书俄语翻译版的一部分。注意,~码 koi8-r 是在首部指定的?/td>
2 q些是古代斯拉夫语的字符Q就我所知,它们用来拼写俄语单词“Preface”。如果你在一个正常文本编辑器中打开q个文gQ这些字W非常像qQ因为它们用了 koi8-r ~码模式q行~码Q但是却?iso-8859-1 ~码模式q行昄?/td>

?9.19. 解析 russiansample.xml

>>> from xml.dom import minidom
>>> xmldoc = minidom.parse('russiansample.xml') 1
>>> title = xmldoc.getElementsByTagName('title')[0].firstChild.data
>>> title 2
u'\u041f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u0435'
>>> print title 3
Traceback (innermost last):
File "<interactive input>", line 1, in ?
UnicodeError: ASCII encoding error: ordinal not in range(128)

>>> convertedtitle = title.encode('koi8-r') 4
>>> convertedtitle
'\xf0\xd2\xc5\xc4\xc9\xd3\xcc\xcf\xd7\xc9\xc5'
>>> print convertedtitle 5
Преисxо{ие
1 我假讑֜q里你将前一个例子以 russiansample.xml 为名保存在当前目录中。也Z完整性的考虑Q我假设你已l删除了 sitecustomize.py 文gQ将~省~码改回?'ascii'Q或臛_?setdefaultencoding 一行注释v来了?/td>
2 注意 title 标记 (现在?title 变量中,上面那一长串 Python 函数我们暂且跌Q下一节再解释)――在 XML 文档?title 元素中的文本数据是以 unicode 保存的?/td>
3 直接打印 title 是不可能的,因ؓq个 unicode 字符串包含了?ASCII 字符Q所?Python 不能把它转换?ASCIIQ因为它无法理解?/td>
4 但是Q你能够昑ּ地将它{换ؓ koi8-rQ在本例中,我们得到一?(正常Q非 unicode) 单字节字W的字符?(f0, d2, c5Q等{?Q它是初始unicode字符串中字符 koi8-r ~码的版本?/td>
5 打印 koi8-r ~码的字W串有可能会在你的屏q上昄Zؕ码,因ؓ你的 Python IDE 这些字W作?iso-8859-1 的编码进行解析,而不?koi8-r ~码。但是,臛_它们能打印?(q且Q如果你仔细看,当在一个不支持 unicode 的文本编辑器中打开最初的 XML 文档Ӟ会看到相同的q?span class=application>Python 在解?XML 文档Ӟ它?koi8-r 转换CunicodeQ你只不q是它转换回来?

ȝ一下,如果你以前从没有看到q?unicodeQ倒是有些唬hQ但是在 Python 处理 unicode 数据真是非常Ҏ。如果你?XML 文档都是 7 位的 ASCII (像本章中的例?Q你差不多永q都不用考虑 unicode?span class=application>Python 在进行解析时会将 XML 文档中的 ASCII 数据转换?unicodeQ在M需要的时候强制{换回?ASCIIQ你甚至永远都不用注意。但是如果你要处理其它语a的数据,Python 已经准备好了?/p>



Hero 2009-07-24 14:30 发表评论
]]>
Python中文~码问题http://www.shnenglu.com/Hero/archive/2009/07/24/91037.htmlHeroHeroFri, 24 Jul 2009 06:27:00 GMThttp://www.shnenglu.com/Hero/archive/2009/07/24/91037.htmlhttp://www.shnenglu.com/Hero/comments/91037.htmlhttp://www.shnenglu.com/Hero/archive/2009/07/24/91037.html#Feedback0http://www.shnenglu.com/Hero/comments/commentRss/91037.htmlhttp://www.shnenglu.com/Hero/services/trackbacks/91037.html


Python中有两种字符Ԍ分别是一般的字符Ԍ每个字符? bits表示Q和Unicode字符Ԍ每个字符用一个或者多个字节表C)Q它们可以相互{换。关于UnicodeQJoel Spolsky ?The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) 中有生动的说明,Jason Orendorff ?Unicode for programmers 有着更ؓ全面的描qͼ在此我就不再多说什么了。来看下面的代码Q?/p>

x = u"中文你好"
print s

    q行上述代码QPython会给Z面的错误提示

SyntaxError: Non-ASCII character '\xd6' in file G:\workspace\chinese_problem\src\test.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

   说是遇到非ASCII字符了,q让我们参考pep-0263。PEP-0263QPython Enhancement ProposalQ上面说得很清楚了,Python也意识到了国际化问题Qƈ提出了解x案。根据提案上面的要求Q我们有如下代码

 # -*- coding:gb2312 -*- Q必dW一行或者第二行
print "-------------code 1----------------"
a = "中文a我爱?
print a
print a.find("?)
b = a.replace("?, "喜欢")
print b
print "--------------code 2----------------"
x = "中文a我爱?
y = unicode(x, "gb2312")
print y.encode("gb2312")
print y.find(u"?)
z = y.replace(u"?, u"喜欢")
print z.encode("gb2312")
print "---------------code 3----------------"
print y

    E序q行的结果如下:

-------------code 1----------------
中文a我爱?br>5
中文a我喜Ƣ你
--------------code 2----------------
中文a我爱?br>3
中文a我喜Ƣ你
---------------code 3----------------
Traceback (most recent call last):
  File "G:\Downloads\eclipse\workspace\p\src\hello.py", line 16, in <module>
    print y
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

     我们可以看到Q通过引入~码声明Q我们可以正常地在用中文了Q而且在code 1?中,控制C能正的把中文打印出来。但是,很明显,上面的代码也反映Z不少的问题:
    1、code 1 ?2在用print旉用了不同的方式,1是直接printQ?在print之前先进行编?br>    2、code 1 ?2中在同样的字W串查找同一个字W?#8220;?#8221;Q得出的l果不一P分别??Q?br>    3、code 3 中直接打印unicode字符?y时出现错误(q也是ؓ什么code 2中要先进行编码的原因Q?/p>

    Z么?Z么?我们可以先在脑v中模拟一下我们用Python的流E:首先Q我们先用编辑器~写好源代码Q保存成文g。如果源代码中有~码声明而且用的~辑器支持该语法Q那么该文g׃相应的编码方式保存在盘中?strong>注意Q?/strong>~码声明和源文g的编码不一定是一致的Q你完全可以在编码声明中声明~码为UTF-8Q但是用GB2312来保存源文g。当Ӟ我们不可能自ȝ|故意写错Q而且好的IDE也能强制保证两者的一致性,但是Q如果我们用C本或者EditPlus{编辑器来编写代码的话,一不小心就会出现这U问题的?br>    得到一?py文g后,我们可以运行它了,q是Q我们就把代码交lPython解析器来完成解析工作。解析器d文gӞ先解析文件中的编码声明,我们假设文g的编码ؓgb2312Q那么先文件中的内容由gb2312转换成UnicodeQ然后再把这些Unicode转换为UTF-8格式的字节串。完成这一步骤后,解析器把q些UTF-8字节串分D,解析。如果遇C用Unicode字符Ԍ那么׃用相应的UTF-8字节串创建Unicode字符Ԍ如果E序中用的是一般的字符Ԍ那么解析器先UTF-8字节串通过Unicode转换成相应编码(q里是gb2312~码Q的字节Ԍq用其创Z般的字符串对象。也是_Unicode字符串跟一般字W串在内存中的存放格式是不一LQ前者用UTF-8的格式,后者用GB2312格式?br>    好了Q内存中的字W串存放格式我们知道了,下面我们要了解print的工作方式。print其实只是负责把内存中相应的字节串交给操作pȝQ让操作pȝ相应的程序(譬如cmdH口Q进行显C。这里有两种情况Q?br>   1、若字符串是一般的字符Ԍ那么print只需把内存中相应的字节串推送给操作pȝ。如例子中的code 1?br>    2、如果字W串是Unicode字符Ԍ那么print在推送之前先q行相应的encodeQ我们可以显CZ用Unicode的encodeҎ使用合适的~码方式来编码(例子中code 2Q,否则Python使用默认的编码方式进行编码,也就是ASCIIQ例子中的code 3Q。当然ASCII是不可能正确~码中文的,因此Python报错?br>    xQ上面的三个问题我们已经可以解析W一和第三个了。至于第二个问题Q因为Python中有两种字符Ԍ一般字W串和Unicode字符Ԍ两者都有各自的字符处理Ҏ。对于前者,Ҏ是以字节的方式进行的Q而且在GB2312中,每个汉字占用两个字节Q因此得到的l果?Q对于后者,也就是Unicode字符Ԍ所有字W都是统一看待的,因此得到3?br>     虽然上面只提C控制台程序的中文问题Q但是文件读写以及网l传输中出现的中文问题在原理上都是类似的。Unicode的出现可以很大程度上解决软g的国际化问题Q同时Python为Unicode提供了极好的支持Q因此,我徏议大家在~写Python的程序时Q都l一使用Unicode方式。保存文件时使用UTF-8的编码方式。How to Use UTF-8 with Python有详l的描述?br> 



Hero 2009-07-24 14:27 发表评论
]]>
不上升序列的最分?/title><link>http://www.shnenglu.com/Hero/archive/2008/08/20/59466.html</link><dc:creator>Hero</dc:creator><author>Hero</author><pubDate>Wed, 20 Aug 2008 13:31:00 GMT</pubDate><guid>http://www.shnenglu.com/Hero/archive/2008/08/20/59466.html</guid><wfw:comment>http://www.shnenglu.com/Hero/comments/59466.html</wfw:comment><comments>http://www.shnenglu.com/Hero/archive/2008/08/20/59466.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Hero/comments/commentRss/59466.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Hero/services/trackbacks/59466.html</trackback:ping><description><![CDATA[<p> </p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; FONT-FAMILY: courier new; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span> <span style="COLOR: #000000">一个著名的定理是这LQ最长上升序列的长度{于不上升序列的最分划(卛_q面上的点分划成可能少的不怺的不上升序列Q。下面我们就来给个定理的证明Q在证明的过E中Q我们甚臛_以得到求具体分割Ҏ的方法?br></span><span style="COLOR: #008080"> 2</span> <span style="COLOR: #000000">证明Q?br></span><span style="COLOR: #008080"> 3</span> <span style="COLOR: #000000">一个显然的l论是最长上升序列的长度于{于不上升序列的最分划。因Z升序列中L两点都不可能属于同一个不上升序列。也是_最长上升序列中的所有点分属不同的不上升序列。所以,不上升序列的分划数最也不会于最长上升序列的长度?br></span><span style="COLOR: #008080"> 4</span> <span style="COLOR: #000000">关键的是要证明,最长上升序列的长度大于{于不上升序列的最分划。我们来构造一个不上升序列的分划?br></span><span style="COLOR: #008080"> 5</span> <span style="COLOR: #000000">首先在二lEuclidI间中取出所有的满如下性质的点(x, y)Q对于Q意的?x</span><span style="COLOR: #000000">''</span><span style="COLOR: #000000">, y</span><span style="COLOR: #000000">''</span><span style="COLOR: #000000">)QLx</span><span style="COLOR: #000000">''</span><span style="COLOR: #000000">≤x </span><span style="COLOR: #000000">||</span><span style="COLOR: #000000"> y</span><span style="COLOR: #000000">''</span><span style="COLOR: #000000">≤yQ即(xQy)?#8220;右上?#8221;没有别的炏V可以证明,取出的点集{(xQy)}是一条不上升序列。因为点集中L两点(x1, y1)?x2, y2)Lx1≤x2 </span><span style="COLOR: #000000">||</span><span style="COLOR: #000000"> y1≤y2且x2≤x1 </span><span style="COLOR: #000000">||</span><span style="COLOR: #000000"> y2≤y1Q整理一下即?x1≤x2)xor(y1≤y2)Q?/span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">。所以,把这些点按x升序排列后,得到的y相应的成降序?br></span><span style="COLOR: #008080"> 6</span> <span style="COLOR: #000000">上面取出的点从I间中去除后Q重复上q过E,又可以得C条新的不上升序列。如此反?#8230;…可以得到一个不上升序列的分?现在q不能肯定这是最的分划)。由前面的结论知道,q个分划数必定大于等于最长上升序列的长度?br></span><span style="COLOR: #008080"> 7</span> <span style="COLOR: #000000">我们对得到的不上升序列分划进行分U,先取出的{最高,最后取出的{最低。这样就得到k条分属level1Qlevel2Q?#8230;Qlevelk的不上升序列?br></span><span style="COLOR: #008080"> 8</span> <span style="COLOR: #000000">q些链上的点满q样的性质Q对于一个属于leveli(i</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">k)链上的点(x, y)Q必然存在一个属于leveli</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1的点(x</span><span style="COLOR: #000000">''</span><span style="COLOR: #000000">, y</span><span style="COLOR: #000000">''</span><span style="COLOR: #000000">)Q得x</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">x</span><span style="COLOR: #000000">''</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&&</span><span style="COLOR: #000000"> y</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">y</span><span style="COLOR: #000000">''</span><span style="COLOR: #000000">。否?x, y)在取leveli</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">l链时׃被取赎ͼ不应属于leveli?br></span><span style="COLOR: #008080"> 9</span> <span style="COLOR: #000000">从level1上的一点(x1, y1Q开始,取level2的点Qx2, y2Q,x2</span><span style="COLOR: #000000">></span><span style="COLOR: #000000">x1 </span><span style="COLOR: #000000">&&</span><span style="COLOR: #000000"> y2</span><span style="COLOR: #000000">></span><span style="COLOR: #000000">y1Q然后取level3的点Qx3, y3Q?#8230;…最后必然能取到levelk上的点(xk, ykQ。如此得到的序列Qx1, y1Q,Qx2, y2Q,…Q(xk, ykQ,是一条上升序列。所以,我们前面得到的不上升序列的分划数׃可能大于最长上升序列长度?br></span><span style="COLOR: #008080">10</span> <span style="COLOR: #000000">q就证明了最长上升序列的长度大于{于不上升序列的最分划。再加上“最长上升序列的长度于{于不上升序列的最分?#8221;的结论,p明了最长上升序列的长度{于不上升序列的最分划?br></span><span style="COLOR: #008080">11</span> <span style="COLOR: #000000; FONT-FAMILY: courier new">q个证明的优点在于,它是一个构造性的证明Qƈ且揭CZ最长上升序列与不上升序列最分划之间的较ؓ深刻的关pR?br></span><span style="COLOR: #008080">12</span> <span style="COLOR: #000000">Ҏ前面的证明,我们可以很容易得CU解x题的ҎQ?br></span><span style="COLOR: #008080">13</span> <span style="COLOR: #000000">Q?/span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">Q在l出的二元组中求出最长下降序列的长度Q具体实现比较简单,q里׃略了Q;<br></span><span style="COLOR: #008080">14</span> <span style="COLOR: #000000">Q?/span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">Q用cMTopologic排序的方法,构造性的求出不下降序列的最分?详细q程见证??br></span><span style="COLOR: #008080">15</span> <span style="COLOR: #000000">q两U方法的旉复杂度都是O(n2)的。实际上Q本题还能优化到O(nlog2n)U,考虑到题目的规模以及本文的侧重点Q这里就不详l展开了。此外,前面讲的ҎQ?/span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">Q,也是求最长双N题的一个基?/span></div> <img src ="http://www.shnenglu.com/Hero/aggbug/59466.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Hero/" target="_blank">Hero</a> 2008-08-20 21:31 <a href="http://www.shnenglu.com/Hero/archive/2008/08/20/59466.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sprintf——用法小l?/title><link>http://www.shnenglu.com/Hero/archive/2008/08/09/58400.html</link><dc:creator>Hero</dc:creator><author>Hero</author><pubDate>Sat, 09 Aug 2008 11:23:00 GMT</pubDate><guid>http://www.shnenglu.com/Hero/archive/2008/08/09/58400.html</guid><wfw:comment>http://www.shnenglu.com/Hero/comments/58400.html</wfw:comment><comments>http://www.shnenglu.com/Hero/archive/2008/08/09/58400.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Hero/comments/commentRss/58400.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Hero/services/trackbacks/58400.html</trackback:ping><description><![CDATA[<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; FONT-FAMILY: courier new; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">sprintf详解 <br>转摘声明Q选自《CSDN C֌电子杂志——C</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">杂志?br><br><br>在将各种cd的数据构造成字符串时Qsprintf 的强大功能很会让你失望。由于sprintf 跟printf 在用法上几乎一P只是打印的目的地不同而已Q前者打印到字符串中Q后者则直接在命令行上输出。这也导致sprintf 比printf 有用得多?br><br>sprintf 是个变参函数Q定义如下:<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> sprintf( </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">buffer, </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">format [, argument] <img src="http://www.shnenglu.com/Images/dot.gif"> );<br>除了前两个参数类型固定外Q后面可以接L多个参数。而它的精华,昄在W二个参敎ͼ<br>格式化字W串上?br><br><br>printf 和sprintf 都用格式化字符串来指定串的格式Q在格式串内部用一些以“</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">”开头的格式说明W(format specificationsQ来占据一个位|,在后边的变参列表中提供相应的变量Q最l函数就会用相应位置的变量来替代那个说明W,产生一个调用者想要的字符丌Ӏ?br><br><br>格式化数字字W串<br>sprintf 最常见的应用之一莫过于把整数打印到字W串中,所以,spritnf 在大多数场合可以替代<br>itoa?br><br>如:<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">把整?23 打印成一个字W串保存在s 中?/span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">sprintf(s, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">123</span><span style="COLOR: #000000">); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">产生"123"</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">可以指定宽度Q不的左边补空|<br>sprintf(s, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%8d%8d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">123</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">4567</span><span style="COLOR: #000000">); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">产生Q? 123 4567"</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">当然也可以左寚wQ?br>sprintf(s, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%-8d%8d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">123</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">4567</span><span style="COLOR: #000000">); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">产生Q?123 4567"</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">也可以按?6 q制打印Q?br>sprintf(s, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%8x</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">4567</span><span style="COLOR: #000000">); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">写16 q制Q宽度占8 个位|,叛_?/span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">sprintf(s, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%-8X</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">4568</span><span style="COLOR: #000000">); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">大写16 q制Q宽度占8 个位|,左对?/span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>q样Q一个整数的16 q制字符串就很容易得刎ͼ但我们在打印16 q制内容Ӟ通常惌一U左边补0 的等宽格式,那该怎么做呢Q很单,在表C宽度的数字前面加个0 可以了?br>sprintf(s, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%08X</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">4567</span><span style="COLOR: #000000">); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">产生Q?000011D7"</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">上面?#8221;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">d”q行?0 q制打印同样也可以用这U左边补0 的方式?br><br><br>q里要注意一个符h展的问题Q比如,假如我们x印短整数Q?/span><span style="COLOR: #0000ff">short</span><span style="COLOR: #000000">Q?/span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"> 的内?6 q制表示形式Q在Win32 q_上,一个short 型占2 个字节,所以我们自然希望用4 ?6 q制数字来打印它Q?br></span><span style="COLOR: #0000ff">short</span><span style="COLOR: #000000"> si </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>sprintf(s, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%04X</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, si);<br>产生“FFFFFFFF”Q怎么回事Q因为spritnf 是个变参函数Q除了前面两个参C外,后面的参数都不是cd安全的,函数更没有办法仅仅通过一?#8220;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">X”p得知当初函数调用前参数压栈时被压q来的到底是? 字节的整数还是个2 字节的短整数Q所以采取了l一4 字节的处理方式,D参数压栈时做了符h展,扩展成了32 位的整数</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">Q打印时4 个位|不够了Q就?2 位整?/span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"> ? ?6 q制都打印出来了?br><br>如果你想看si 的本来面目,那么应该让~译器做0 扩展而不是符h展(扩展时二q制左边? 而不是补W号位)Q?br>sprintf(s, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%04X</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, (unsigned </span><span style="COLOR: #0000ff">short</span><span style="COLOR: #000000">)si);<br>可以了。或者:<br>unsigned </span><span style="COLOR: #0000ff">short</span><span style="COLOR: #000000"> si </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>sprintf(s, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%04X</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, si);<br><br><br>sprintf 和printf q可以按8 q制打印整数字符Ԍ使用”</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">o”。注? q制?6 q制都不会打<br>印出负数Q都是无W号的,实际上也是变量的内部编码的直接?6 q制? q制表示?br><br><br>控制点数打印格?br>点数的打印和格式控制是sprintf 的又一大常用功能,点C用格式符”</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">f”控制Q默认保<br>留小数点? 位数字,比如Q?br>sprintf(s, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%f</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">3.1415926</span><span style="COLOR: #000000">); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">产生"3.141593"</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">但有时我们希望自己控制打印的宽度和小C敎ͼq时应该用:”</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">m.nf”格式Q其中m ?br>C打印的宽度Qn 表示数点后的位数。比如:<br>sprintf(s, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%10.3f</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">3.1415626</span><span style="COLOR: #000000">); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">产生Q? 3.142"</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">sprintf(s, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%-10.3f</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">3.1415626</span><span style="COLOR: #000000">); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">产生Q?3.142 "</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">sprintf(s, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%.3f</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">3.1415626</span><span style="COLOR: #000000">); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">不指定d度,产生Q?3.142"</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br><br>注意一个问题,你猜<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">;<br>sprintf(s, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%.2f</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, i);<br>会打Z么东东来Q?#8220;</span><span style="COLOR: #000000">100.00</span><span style="COLOR: #000000">”Q对吗?自己试试q道了Q同时也试试下面q个Q?br>sprintf(s, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%.2f</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, (</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">)i);<br>W一个打出来的肯定不是正结果,原因跟前面提到的一P参数压栈时调用者ƈ不知道跟i相对应的格式控制W是?#8221;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">f”。而函数执行时函数本n则ƈ不知道当q被压入栈里的是个整敎ͼ于是可怜的保存整数i 的那4 个字节就被不由分说地作ؓ点数格式来解释了,整个乱套了。不q,如果有h有兴用手工编码一个QҎQ那么倒可以用这U方法来验一下你手工~排的结果是否正?br><br><br>字符</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">Ascii 码对?br>我们知道Q在C</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">语言中,</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> 也是一U普通的scalable cdQ除了字长之外,它与shortQ?br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">Q?/span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000"> q些cd没有本质区别Q只不过被大家习惯用来表C字W和字符串而已。(或许当年该把<br>q个cd叫做“</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">”Q然后现在就可以Ҏ实际情况Q用byte 或short 来把char 通过typedef 定义出来Q这h合适些Q于是,使用”</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">d”或?#8221;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">x”打印一个字W,便能得出它的10 q制?6 q制的ASCII 码;反过来,使用”</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">c”打印一个整敎ͼ便可以看到它所对应的ASCII 字符。以下程序段把所有可见字W的ASCII 码对照表打印到屏q上Q这里采用printfQ注?#8221;#”?#8221;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">X”合用时自动ؓ16 q制数增?#8221;0X”前缀Q:<br></span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">32</span><span style="COLOR: #000000">; i </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">127</span><span style="COLOR: #000000">; i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">) {<br>printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">[ %c ]: %3d 0x%#04X\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, i, i, i);<br>}<br><br><br>q接字符?br>sprintf 的格式控制串中既然可以插入各U东西,q最l把它们“q成一?#8221;Q自然也p够连<br>接字W串Q从而在许多场合可以替代strcatQ但sprintf 能够一ơ连接多个字W串Q自然也可以同时<br>在它们中间插入别的内容,M非常灉|Q。比如:<br></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> who </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">I</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> whom </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">CSDN</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>sprintf(s, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s love %s.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, who, whom); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">产生Q?I love CSDN. "</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">strcat 只能q接字符Ԍ一D以’’l尾的字W数l或叫做字符~冲Q?/span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">terminated</span><span style="COLOR: #000000">-</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">Q,但有时我们有两段字符~冲区,他们q不是以 ’’l尾。比如许多从W三方库函数中返回的字符数组Q从g或者网l传输中读进来的字符,它们未必每一D字W序列后面都有个相应?#8217;’来结。如果直接连接,不管是sprintf q是strcat 肯定会导致非法内存操作,而strncat 也至要求第一个参数是个null</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">terminated</span><span style="COLOR: #000000">-</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">Q那该怎么办呢Q我们自然会惌v前面介绍打印整数和QҎ时可以指定宽度,字符串也一L。比如:<br></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> a1[] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> {</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">A</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">B</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">D</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">E</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">F</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">G</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">};<br></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> a2[] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> {</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">H</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">I</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">J</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">K</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">L</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">M</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">N</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">};<br>如果Q?br>sprintf(s, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s%s</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, a1, a2); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Don't do that!</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">十有八九要出问题了。是否可以改成:<br>sprintf(s, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%7s%7s</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, a1, a2);<br>也没好到哪儿去,正确的应该是Q?br>sprintf(s, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%.7s%.7s</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, a1, a2);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">产生Q?ABCDEFGHIJKLMN"</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">q可以类比打印QҎ?#8221;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">m.nf”Q在”</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">m.ns”中,m 表示占用宽度Q字W串长度不时补I格Q超Z则按照实际宽度打华ͼQn 才表CZ相应的字W串中最多取用的字符数。通常在打印字W串时m 没什么大用,q是点号后面的n 用的多。自Ӟ也可以前后都只取部分字符Q?br>sprintf(s, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%.6s%.5s</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, a1, a2);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">产生Q?ABCDEFHIJKL"</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">在许多时候,我们或许q希望这些格式控制符中用以指定长度信息的数字是动态的Q而不是静态指定的Q因多时候,E序要到q行时才会清楚到底需要取字符数组中的几个字符Q这U动态的宽度</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">_ֺ讄功能在sprintf 的实C也被考虑CQsprintf 采用”</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">”来占用一个本来需要一个指定宽度或_ֺ的常数数字的位置Q同P而实际的宽度或精度就可以和其它被打印的变量一栯提供出来Q于是,上面的例子可以变成:<br>sprintf(s, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%.*s%.*s</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">, a1, </span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">, a2);<br>或者:<br>sprintf(s, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%.*s%.*s</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(a1), a1, </span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(a2), a2);<br>实际上,前面介绍的打印字W、整数、QҎ{都可以动态指定那些常量|比如Q?br>sprintf(s, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%-*d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">A</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">产生"65 "</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">sprintf(s, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%#0*X</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">128</span><span style="COLOR: #000000">); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">产生"0X000080"Q?#"产生0X</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">sprintf(s, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%*.*f</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">3.1415926</span><span style="COLOR: #000000">); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">产生" 3.14"</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br><br>打印地址信息<br>有时调试E序Ӟ我们可能x看某些变量或者成员的地址Q由于地址或者指针也不过是个32 位的敎ͼ你完全可以用打印无W号整数?#8221;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">u”把他们打印出来:<br>sprintf(s, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%u</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">i);<br>不过通常Zq是喜欢使用16 q制而不?0 q制来显CZ个地址Q?br>sprintf(s, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%08X</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">i);<br>然而,q些都是间接的方法,对于地址打印Qsprintf 提供了专门的”</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">p”Q?br>sprintf(s, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%p</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">i);<br>我觉得它实际上就相当于:<br>sprintf(s, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%0*x</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">2</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">), </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">i);<br>利用sprintf 的返回?br>较少有h注意printf</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">sprintf 函数的返回|但有时它却是有用的,spritnf q回了本ơ函数调?br>最l打印到字符~冲Z的字W数目。也是说每当一ơsprinf 调用l束以后Q你无须再调用一?br>strlen 便已l知道了l果字符串的长度。如Q?br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> len </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> sprintf(s, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, i);<br>对于正整数来_len 便等于整数i ?0 q制位数?br>下面的是个完整的例子Q?0 个[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">)之间的随机数Qƈ他们打印到一个字W数ls 中,<br>以逗号分隔开?br>#include <br>#include <br>#include <br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main() <br>{<br>   srand(time(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">));<br></span><span style="COLOR: #0000ff">   char</span><span style="COLOR: #000000"> s[</span><span style="COLOR: #000000">64</span><span style="COLOR: #000000">];<br></span><span style="COLOR: #0000ff">   int</span><span style="COLOR: #000000"> offset </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #0000ff">   for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; i </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">; i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">) {<br>      offset </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> sprintf(s </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> offset, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, rand() </span><span style="COLOR: #000000">%</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">);<br>   }<br>   s[offset </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">\n</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">最后一个逗号换成换行W?/span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">   printf(s);<br></span><span style="COLOR: #0000ff">   return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br>设想当你从数据库中取Z条记录,然后希望把他们的各个字段按照某种规则q接成一个字<br>W串Ӟ可以用这U方法,从理ZԌ他应该比不断的strcat 效率高,因ؓstrcat 每次调用<br>都需要先扑ֈ最后的那个’’的位|,而在上面l出的例子中Q我们每ơ都利用sprintf q回值把q?br>个位|直接记下来了?br><br><br>使用sprintf 的常见问?br>sprintf 是个变参函数Q用时l常出问题,而且只要出问题通常是能导致程序崩溃的内存?br>问错误,但好在由sprintf 误用D的问题虽然严重,却很Ҏ扑ևQ无非就是那么几U情况,?br>常用眼睛再把出错的代码多看几眼就看出来了?br><br><br></span><span style="COLOR: #000000">??</span><span style="COLOR: #000000"> ~冲区溢?br>W一个参数的长度太短了,没的_l个大点的地方吧。当然也可能是后面的参数的问<br>题,变参对应一定要l心Q而打印字W串Ӟ量使用”</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">.ns”的Ş式指定最大字W数?br><br><br></span><span style="COLOR: #000000">??</span><span style="COLOR: #000000"> 忘记了第一个参?br>低得不能再低问题Q用printf 用得太惯了?/span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">偶就常犯。:。(</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #000000">??</span><span style="COLOR: #000000"> 变参对应出问?br>通常是忘C提供对应某个格式W的变参Q导致以后的参数l统错位Q检查检查吧。尤<br>其是对应”</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">”的那些参敎ͼ都提供了吗?不要把一个整数对应一?#8221;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">s”Q编译器会觉得你<br>ƺ她太甚了(~译器是obj 和exe 的妈妈,应该是个女的Q?PQ?br><br><br>strftime<br>sprnitf q有个不错的表妹QstrftimeQ专门用于格式化旉字符串的Q用法跟她表哥很像,?br>是一大堆格式控制W,只是毕竟姑娘家心细Q她q要调用者指定缓冲区的最大长度,可能是ؓ<br>了在出现问题时可以推卸责d。这里D个例子:<br>time_t t </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> time(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">产生"YYYY-MM-DD hh:mm:ss"格式的字W串?/span><span style="COLOR: #008000"><br></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> s[</span><span style="COLOR: #000000">32</span><span style="COLOR: #000000">];<br>strftime(s, </span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(s), </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%Y-%m-%d %H:%M:%S</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, localtime(</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">t));<br>sprintf 在MFC 中也能找C的知韻ICString::FormatQstrftime 在MFC 中自然也有她的同道:<br>CTime::FormatQ这一对由于从面向对象哪里得到了赞助,用以写出的代码更觉优雅?br></span></div> <img src ="http://www.shnenglu.com/Hero/aggbug/58400.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Hero/" target="_blank">Hero</a> 2008-08-09 19:23 <a href="http://www.shnenglu.com/Hero/archive/2008/08/09/58400.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.shangbi.com.cn" target="_blank">Ůͬþ</a>| <a href="http://www.33k4.cn" target="_blank">ŷպþĻ</a>| <a href="http://www.jianhua365.cn" target="_blank">˳˳ۺþþ</a>| <a href="http://www.telaviv.com.cn" target="_blank">2021˾Ʒþ</a>| <a href="http://www.lianyigs.cn" target="_blank">þþƷAV뽿ɫ </a>| <a href="http://www.kkfo.cn" target="_blank">Ʒ99þþþ91gav</a>| <a href="http://www.pobk.cn" target="_blank">ձWVһһþ㽶</a>| <a href="http://www.135gkr4.cn" target="_blank">ŷպƷþþþ</a>| <a href="http://www.e-li.cn" target="_blank">ɫþþۺľþһ</a>| <a href="http://www.syiz.cn" target="_blank">ҹƷþþþþþ</a>| <a href="http://www.aiaizhu.cn" target="_blank">Ůþþþþjþ</a>| <a href="http://www.lskcop.cn" target="_blank">պһþþþþ</a>| <a href="http://www.a0037.cn" target="_blank">ƷŷþþþӰ </a>| <a href="http://www.beibeiyou.cn" target="_blank">ۺϾƷþ</a>| <a href="http://www.onlinehotel.com.cn" target="_blank">þ99Ʒþ99ý</a>| <a href="http://www.heihan.com.cn" target="_blank">99þþƷ</a>| <a href="http://www.99605.com.cn" target="_blank">ɫۺϾþþþ</a>| <a href="http://www.lvzhuba.cn" target="_blank">þþƷһպ</a>| <a href="http://www.wamiu.cn" target="_blank">ŷҹƷþþþþ˳</a>| <a href="http://www.weixinqun688.cn" target="_blank">þþƷվ</a>| <a href="http://www.sg1024.cn" target="_blank">yy6080þ</a>| <a href="http://www.aisile.com.cn" target="_blank">һһþۺϺݺ</a>| <a href="http://www.moneychange.cn" target="_blank">þþþһƷɫ</a>| <a href="http://www.jincheng365.cn" target="_blank">ձƬҹþ</a>| <a href="http://www.thaald.cn" target="_blank">þۺ77777</a>| <a href="http://www.lwtjf.cn" target="_blank">þþþþþþ뾫Ʒպ</a>| <a href="http://www.easecorp.com.cn" target="_blank">99þerֻоƷ18</a>| <a href="http://www.czcsbsb.com.cn" target="_blank">97Ʒ91þþþþ</a>| <a href="http://www.szjjls.cn" target="_blank">aaþ</a>| <a href="http://www.xh80.cn" target="_blank">99þþùƷС˵</a>| <a href="http://www.rhtyyls.cn" target="_blank">777þµַ</a>| <a href="http://www.rigemei.cn" target="_blank">պþþþĻ</a>| <a href="http://www.damingxing.cn" target="_blank">һһþۺϺݺ</a>| <a href="http://www.176zfblp.cn" target="_blank">XxŷʸƷþþþþ</a>| <a href="http://www.pqdaili.cn" target="_blank">Ʒþþþþþapp</a>| <a href="http://www.jbl21.cn" target="_blank">91ɫۺϾþ</a>| <a href="http://www.lakesys.com.cn" target="_blank">þ޹ӰԺվ</a>| <a href="http://www.pi04.cn" target="_blank">Ʒһþ㽶߿</a>| <a href="http://www.yajige.cn" target="_blank">һþ㽶</a>| <a href="http://www.yw33777.cn" target="_blank">þƵվ</a>| <a href="http://www.liangz.cn" target="_blank">޳ɫWWWþվ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>