<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feed.feedsky.com/styles/podcast2.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link href="http://feed.feedsky.com/scriptlearn" type="application/rss+xml" rel="self"></atom:link><fs:self_link href="http://feed.feedsky.com/scriptlearn" type="application/rss+xml"></fs:self_link><lastBuildDate>Tue, 18 May 2010 15:07:52 GMT</lastBuildDate><title>脚本学习</title><description>Script World</description><link>http://www.scriptlearn.com</link><sy:updatePeriod>hourly</sy:updatePeriod><sy:updateFrequency>1</sy:updateFrequency><language>en</language><pubDate>Tue, 18 May 2010 15:07:52 GMT</pubDate><item><title>TIOBE公布2010年5月编程语言排行榜</title><link>http://item.feedsky.com/~feedsky/scriptlearn/~8071953/367933359/6139342/1/item.html</link><content:encoded>&lt;p&gt;尽管Objective-C上月只涨了0.08%，但无法阻止该语言首次进入前10名。这是非常了不起的成绩，特别是在自2001年6月TIOBE指数开始只有13种不同的编程语言进前10名的情况下。Objective-C语言受欢迎的原因主要是它是在iphone和ipad应用程序的唯一语言。从编程语言的角度来看，Objective-C没有提供新的有趣的特性。&lt;/p&gt;
&lt;p&gt;下图为2010年5月编程语言排行榜前20名：&lt;br /&gt;
&lt;img src=&quot;http://www.scriptlearn.com/wp-content/uploads/2010/05/2010-5-1.jpg&quot; alt=&quot;&quot; title=&quot;2010-5-1&quot; width=&quot;595&quot; height=&quot;575&quot; class=&quot;aligncenter size-full wp-image-2037&quot; /&gt;&lt;/p&gt;
&lt;p&gt;主要语言的长期变化趋势图如下：&lt;br /&gt;
&lt;img src=&quot;http://www.scriptlearn.com/wp-content/uploads/2010/05/2010-5-2.png&quot; alt=&quot;&quot; title=&quot;2010-5-2&quot; width=&quot;640&quot; height=&quot;480&quot; class=&quot;aligncenter size-full wp-image-2038&quot; /&gt;&lt;/p&gt;
&lt;p&gt;21-50名语言排行：&lt;br /&gt;
&lt;img src=&quot;http://www.scriptlearn.com/wp-content/uploads/2010/05/2010-5-3.jpg&quot; alt=&quot;&quot; title=&quot;2010-5-3&quot; width=&quot;271&quot; height=&quot;692&quot; class=&quot;aligncenter size-full wp-image-2039&quot; /&gt;&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/367933359/scriptlearn/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/scriptlearn/~8071953/367933359/6139342/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/scriptlearn/367933359/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/scriptlearn/367933359/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.scriptlearn.com/archives/2036/feed</wfw:commentRss><slash:comments>0</slash:comments><description>尽管Objective-C上月只涨了0.08%，但无法阻止该语言首次进入前10名。这是非常了不起的成绩，特别是在自2001年6月TIOBE指数开始只有13种不同的编程语言进前10名的情况下。Objective-C语言受欢迎的原因主要是它是在iphone和ipad应用程序的唯一语言。从编程语言的角度来看，Objective-C没有提供新的有趣的特性。
下图为2010年5月编程语言排行榜前20名：

主要语言的长期变化趋势图如下：

21-50名语言排行：&lt;img src=&quot;http://www1.feedsky.com/t1/367933359/scriptlearn/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/scriptlearn/~8071953/367933359/6139342/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/scriptlearn/367933359/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/scriptlearn/367933359/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>新闻</category><category>2010</category><category>语言排行榜</category><category>TIOBE</category><pubDate>Tue, 18 May 2010 23:07:52 +0800</pubDate><author>scripter</author><comments>http://www.scriptlearn.com/archives/2036#comments</comments><guid isPermaLink="false">http://www.scriptlearn.com/?p=2036</guid><dc:creator>scripter</dc:creator><fs:srclink>http://www.scriptlearn.com/archives/2036</fs:srclink><fs:srcfeed>http://www.scriptlearn.com/feed</fs:srcfeed><fs:itemid>feedsky/scriptlearn/~8071953/367933359/6139342</fs:itemid></item><item><title>别人的代码——Programmers(13)</title><link>http://item.feedsky.com/~feedsky/scriptlearn/~8071953/367933360/6139342/1/item.html</link><content:encoded>&lt;p&gt;&lt;a href=&quot;http://www.scriptlearn.com/archives/category/programmerjoke&quot;&gt;&lt;img src=&quot;http://www.scriptlearn.com/wp-content/uploads/2010/04/other_code.gif&quot; alt=&quot;&quot; title=&quot;other_code&quot; width=&quot;600&quot; height=&quot;1352&quot; class=&quot;aligncenter size-full wp-image-2031&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;转载自&lt;a href=&quot;http://blog.xiqiao.info/2010/04/19/668&quot;&gt;http://blog.xiqiao.info/2010/04/19/668&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/367933360/scriptlearn/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/scriptlearn/~8071953/367933360/6139342/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/scriptlearn/367933360/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/scriptlearn/367933360/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.scriptlearn.com/archives/2030/feed</wfw:commentRss><slash:comments>6</slash:comments><description>转载自http://blog.xiqiao.info/2010/04/19/668&lt;img src=&quot;http://www1.feedsky.com/t1/367933360/scriptlearn/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/scriptlearn/~8071953/367933360/6139342/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/scriptlearn/367933360/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/scriptlearn/367933360/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>神秘的程序员们</category><category>程序员幽默</category><pubDate>Mon, 19 Apr 2010 19:15:01 +0800</pubDate><author>scripter</author><comments>http://www.scriptlearn.com/archives/2030#comments</comments><guid isPermaLink="false">http://www.scriptlearn.com/?p=2030</guid><dc:creator>scripter</dc:creator><fs:srclink>http://www.scriptlearn.com/archives/2030</fs:srclink><fs:srcfeed>http://www.scriptlearn.com/feed</fs:srcfeed><fs:itemid>feedsky/scriptlearn/~8071953/367933360/6139342</fs:itemid></item><item><title>TIOBE公布2010年4月编程语言排行榜</title><link>http://item.feedsky.com/~feedsky/scriptlearn/~8071953/367933361/6139342/1/item.html</link><content:encoded>&lt;h3&gt;C语言王者归来&lt;/h3&gt;
&lt;p&gt;C语方在经过4年多的时间再次回到第一名。C语言的分数这些年相当稳定，近10年一直在15%到20%徘徊。因此，C语方重回第1的位置由于的竞争对手Java分数的下降，而不是由于自身引起的。Java在长时间处在下降趋势，在JVM上，JAVA的阵地被其他语言一步步蚕食，一个例子就是JAVAFX脚本语言现在已经接近前20名了。&lt;br /&gt;
&lt;span id=&quot;more-2020&quot;&gt;&lt;/span&gt;&lt;br /&gt;
下图为2010年4月编程语言排行榜前20名：&lt;br /&gt;
&lt;img src=&quot;http://www.scriptlearn.com/wp-content/uploads/2010/04/2010-4-1.jpg&quot; alt=&quot;&quot; title=&quot;2010-4-1&quot; width=&quot;575&quot; height=&quot;577&quot; class=&quot;aligncenter size-full wp-image-2021&quot; /&gt;&lt;br /&gt;
主要语言的长期变化趋势图如下：&lt;br /&gt;
&lt;img src=&quot;http://www.scriptlearn.com/wp-content/uploads/2010/04/2010-4-2.png&quot; alt=&quot;&quot; title=&quot;2010-4-2&quot; width=&quot;640&quot; height=&quot;480&quot; class=&quot;aligncenter size-full wp-image-2022&quot; /&gt;&lt;br /&gt;
21-50名语言排行：&lt;br /&gt;
&lt;img src=&quot;http://www.scriptlearn.com/wp-content/uploads/2010/04/2010-4-3.jpg&quot; alt=&quot;&quot; title=&quot;2010-4-3&quot; width=&quot;260&quot; height=&quot;772&quot; class=&quot;aligncenter size-full wp-image-2023&quot; /&gt;&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/367933361/scriptlearn/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/scriptlearn/~8071953/367933361/6139342/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/scriptlearn/367933361/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/scriptlearn/367933361/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.scriptlearn.com/archives/2020/feed</wfw:commentRss><slash:comments>6</slash:comments><description>C语言王者归来
C语方在经过4年多的时间再次回到第一名。C语言的分数这些年相当稳定，近10年一直在15%到20%徘徊。因此，C语方重回第1的位置由于的竞争对手Java分数的下降，而不是由于自身引起的。Java在长时间处在下降趋势，在JVM上，JAVA的阵地被其他语言一步步蚕食，一个例子就是JAVAFX脚本语言现在已经接近前20名了。

下图为2010年4月编程语言排行榜前20名：

主要语言的长期变化趋势图如下：

21-50名语言排行：&lt;img src=&quot;http://www1.feedsky.com/t1/367933361/scriptlearn/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/scriptlearn/~8071953/367933361/6139342/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/scriptlearn/367933361/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/scriptlearn/367933361/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>新闻</category><category>2010</category><category>语言排行榜</category><category>TIOBE</category><pubDate>Tue, 06 Apr 2010 19:14:51 +0800</pubDate><author>scripter</author><comments>http://www.scriptlearn.com/archives/2020#comments</comments><guid isPermaLink="false">http://www.scriptlearn.com/?p=2020</guid><dc:creator>scripter</dc:creator><fs:srclink>http://www.scriptlearn.com/archives/2020</fs:srclink><fs:srcfeed>http://www.scriptlearn.com/feed</fs:srcfeed><fs:itemid>feedsky/scriptlearn/~8071953/367933361/6139342</fs:itemid></item><item><title>非常思维——Programmers(12)</title><link>http://item.feedsky.com/~feedsky/scriptlearn/~8071953/367933362/6139342/1/item.html</link><content:encoded>&lt;p&gt;&lt;a href=&quot;http://www.scriptlearn.com/wp-content/uploads/2010/03/fcsw.gif&quot;&gt;&lt;img src=&quot;http://www.scriptlearn.com/wp-content/uploads/2010/03/fcsw.gif&quot; alt=&quot;&quot; title=&quot;非常思维&quot; width=&quot;600&quot; height=&quot;1341&quot; class=&quot;aligncenter size-full wp-image-2016&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;转载自http://blog.xiqiao.info/2010/03/23/666&lt;/strong&gt;&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/367933362/scriptlearn/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/scriptlearn/~8071953/367933362/6139342/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/scriptlearn/367933362/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/scriptlearn/367933362/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.scriptlearn.com/archives/2015/feed</wfw:commentRss><slash:comments>3</slash:comments><description>转载自http://blog.xiqiao.info/2010/03/23/666&lt;img src=&quot;http://www1.feedsky.com/t1/367933362/scriptlearn/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/scriptlearn/~8071953/367933362/6139342/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/scriptlearn/367933362/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/scriptlearn/367933362/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>神秘的程序员们</category><category>程序员幽默</category><pubDate>Wed, 24 Mar 2010 10:26:05 +0800</pubDate><author>scripter</author><comments>http://www.scriptlearn.com/archives/2015#comments</comments><guid isPermaLink="false">http://www.scriptlearn.com/?p=2015</guid><dc:creator>scripter</dc:creator><fs:srclink>http://www.scriptlearn.com/archives/2015</fs:srclink><fs:srcfeed>http://www.scriptlearn.com/feed</fs:srcfeed><fs:itemid>feedsky/scriptlearn/~8071953/367933362/6139342</fs:itemid></item><item><title>python 字符串使用总结</title><link>http://item.feedsky.com/~feedsky/scriptlearn/~8071953/367933363/6139342/1/item.html</link><content:encoded>&lt;div&gt;
&lt;p&gt;1.python 字符串通常有单引号（&amp;#8217;…&amp;#8217;）、双引号（&amp;#8221;…&amp;#8221;）、三引号（&amp;#8221;&quot;&amp;#8221;…&amp;#8221;&quot;&amp;#8221;）或（&amp;#8221;&amp;#8217;…&amp;#8221;&amp;#8217;）包围，三引 号包含的字符串可由多行组成，一般可表示大段的叙述性字符串。在使用时基本没有差别，但双引号和三引号（&amp;#8221;&quot;&amp;#8221;…&amp;#8221;&quot;&amp;#8221;）中可以包含单引号，三引号 (&amp;#8221;&amp;#8217;…&amp;#8221;&amp;#8217;)可以包含双引号，而不需要转义。&lt;/p&gt;
&lt;p&gt;2.用（\）对特殊字符转义，如（\）、（&amp;#8217;）、（&amp;#8221;）。&lt;/p&gt;
&lt;p&gt;3.常用字符串函数&lt;/p&gt;
&lt;p&gt;(1) str.count() //返回该字符串中某个子串出现的次数&lt;/p&gt;
&lt;p&gt;(2) str.find()   //返回某个子串出现在该字符串的起始位置&lt;/p&gt;
&lt;p&gt;(3) str.lower() //将该字符串全部转化为小写&lt;/p&gt;
&lt;p&gt;(4) str.upper() //转为大写&lt;/p&gt;
&lt;p&gt;(5) str.split() //分割字符串，返回字串串列表，默认以空格分割&lt;/p&gt;
&lt;p&gt;(6) len(str)     //返回字符串长度&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; str = &amp;#8216;Hello, world&amp;#8217;&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; str.count(&amp;#8216;o&amp;#8217;)&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; 2&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; str.find(&amp;#8216;lo&amp;#8217;)&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; 3&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; str.lower()&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; &amp;#8216;hello, world&amp;#8217;&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; str.upper()&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; &amp;#8216;HELLO, WORLD&amp;#8217;&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; str.split()&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; ['Hello,', 'world']&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; str.split(&amp;#8216;,&amp;#8217;)&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; ['Hello', ' world']&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; len(str)&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; 13&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; str&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; &amp;#8216;Hello, world&amp;#8217;&lt;/p&gt;
&lt;p&gt;以上所有操作都不会改变字符串本身！&lt;/p&gt;
&lt;p&gt;4.字符串与数字相互转换&lt;/p&gt;
&lt;p&gt;import string&lt;/p&gt;
&lt;p&gt;string.atoi(str[,base]) //base为可选参数，表示将字符转换成的进制类型&lt;/p&gt;
&lt;p&gt;数字转换成字符串可简单了，直接用str()&lt;/p&gt;
&lt;p&gt;5.字符与ASCII转换&lt;/p&gt;
&lt;p&gt;char-&amp;gt;ascii ord()&lt;/p&gt;
&lt;p&gt;ascii-&amp;gt;char chr()&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Python字符串操作&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1.复制字符串&lt;/p&gt;
&lt;p&gt;#strcpy(sStr1,sStr2)&lt;/p&gt;
&lt;p&gt;sStr1 = &amp;#8217;strcpy&amp;#8217;&lt;/p&gt;
&lt;p&gt;sStr2 = sStr1&lt;/p&gt;
&lt;p&gt;sStr1 = &amp;#8217;strcpy2&amp;#8242;&lt;/p&gt;
&lt;p&gt;print sStr2&lt;/p&gt;
&lt;p&gt;2.连接字符串&lt;/p&gt;
&lt;p&gt;#strcat(sStr1,sStr2)&lt;/p&gt;
&lt;p&gt;sStr1 = &amp;#8217;strcat&amp;#8217;&lt;/p&gt;
&lt;p&gt;sStr2 = &amp;#8216;append&amp;#8217;&lt;/p&gt;
&lt;p&gt;sStr1 += sStr2&lt;/p&gt;
&lt;p&gt;print sStr1&lt;/p&gt;
&lt;p&gt;3.查找字符&lt;/p&gt;
&lt;p&gt;#strchr(sStr1,sStr2)&lt;/p&gt;
&lt;p&gt;sStr1 = &amp;#8217;strchr&amp;#8217;&lt;/p&gt;
&lt;p&gt;sStr2 = &amp;#8216;r&amp;#8217;&lt;/p&gt;
&lt;p&gt;nPos = sStr1.index(sStr2)&lt;/p&gt;
&lt;p&gt;print nPos&lt;/p&gt;
&lt;p&gt;4.比较字符串&lt;/p&gt;
&lt;p&gt;#strcmp(sStr1,sStr2)&lt;/p&gt;
&lt;p&gt;sStr1 = &amp;#8217;strchr&amp;#8217;&lt;/p&gt;
&lt;p&gt;sStr2 = &amp;#8217;strch&amp;#8217;&lt;/p&gt;
&lt;p&gt;print cmp(sStr1,sStr2)&lt;/p&gt;
&lt;p&gt;5.扫描字符串是否包含指定的字符&lt;/p&gt;
&lt;p&gt;#strspn(sStr1,sStr2)&lt;/p&gt;
&lt;p&gt;sStr1 = &amp;#8216;12345678&amp;#8242;&lt;/p&gt;
&lt;p&gt;sStr2 = &amp;#8216;456&amp;#8242;&lt;/p&gt;
&lt;p&gt;#sStr1 and chars both in sStr1 and sStr2&lt;/p&gt;
&lt;p&gt;print len(sStr1 and sStr2)&lt;/p&gt;
&lt;p&gt;6.字符串长度&lt;/p&gt;
&lt;p&gt;#strlen(sStr1)&lt;/p&gt;
&lt;p&gt;sStr1 = &amp;#8217;strlen&amp;#8217;&lt;/p&gt;
&lt;p&gt;print len(sStr1)&lt;/p&gt;
&lt;p&gt;7.将字符串中的小写字符转换为大写字符&lt;/p&gt;
&lt;p&gt;#strlwr(sStr1)&lt;/p&gt;
&lt;p&gt;sStr1 = &amp;#8216;JCstrlwr&amp;#8217;&lt;/p&gt;
&lt;p&gt;sStr1 = sStr1.upper()&lt;/p&gt;
&lt;p&gt;print sStr1&lt;/p&gt;
&lt;p&gt;8.追加指定长度的字符串&lt;/p&gt;
&lt;p&gt;#strncat(sStr1,sStr2,n)&lt;/p&gt;
&lt;p&gt;sStr1 = &amp;#8216;12345&amp;#8242;&lt;/p&gt;
&lt;p&gt;sStr2 = &amp;#8216;abcdef&amp;#8217;&lt;/p&gt;
&lt;p&gt;n = 3&lt;/p&gt;
&lt;p&gt;sStr1 += sStr2[0:n]&lt;/p&gt;
&lt;p&gt;print sStr1&lt;/p&gt;
&lt;p&gt;9.字符串指定长度比较&lt;/p&gt;
&lt;p&gt;#strncmp(sStr1,sStr2,n)&lt;/p&gt;
&lt;p&gt;sStr1 = &amp;#8216;12345&amp;#8242;&lt;/p&gt;
&lt;p&gt;sStr2 = &amp;#8216;123bc&amp;#8217;&lt;/p&gt;
&lt;p&gt;n = 3&lt;/p&gt;
&lt;p&gt;print cmp(sStr1[0:n],sStr2[0:n])&lt;/p&gt;
&lt;p&gt;10.复制指定长度的字符&lt;/p&gt;
&lt;p&gt;#strncpy(sStr1,sStr2,n)&lt;/p&gt;
&lt;p&gt;sStr1 = &amp;#8221;&lt;/p&gt;
&lt;p&gt;sStr2 = &amp;#8216;12345&amp;#8242;&lt;/p&gt;
&lt;p&gt;n = 3&lt;/p&gt;
&lt;p&gt;sStr1 = sStr2[0:n]&lt;/p&gt;
&lt;p&gt;print sStr1&lt;/p&gt;
&lt;p&gt;11.字符串比较，不区分大小写&lt;/p&gt;
&lt;p&gt;#stricmp(sStr1,sStr2)&lt;/p&gt;
&lt;p&gt;sStr1 = &amp;#8216;abcefg&amp;#8217;&lt;/p&gt;
&lt;p&gt;sStr2 = &amp;#8216;ABCEFG&amp;#8217;&lt;/p&gt;
&lt;p&gt;print cmp(sStr1.upper(),sStr2.upper())&lt;/p&gt;
&lt;p&gt;12.将字符串前n个字符替换为指定的字符&lt;/p&gt;
&lt;p&gt;#strnset(sStr1,ch,n)&lt;/p&gt;
&lt;p&gt;sStr1 = &amp;#8216;12345&amp;#8242;&lt;/p&gt;
&lt;p&gt;ch = &amp;#8216;r&amp;#8217;&lt;/p&gt;
&lt;p&gt;n = 3&lt;/p&gt;
&lt;p&gt;sStr1 = n * ch + sStr1[3:]&lt;/p&gt;
&lt;p&gt;print sStr1&lt;/p&gt;
&lt;p&gt;13.扫描字符串&lt;/p&gt;
&lt;p&gt;#strpbrk(sStr1,sStr2)&lt;/p&gt;
&lt;p&gt;sStr1 = &amp;#8216;cekjgdklab&amp;#8217;&lt;/p&gt;
&lt;p&gt;sStr2 = &amp;#8216;gka&amp;#8217;&lt;/p&gt;
&lt;p&gt;nPos = -1&lt;/p&gt;
&lt;p&gt;for c in sStr1:&lt;/p&gt;
&lt;p&gt;if c in sStr2:&lt;/p&gt;
&lt;p&gt;nPos = sStr1.index(c)&lt;/p&gt;
&lt;p&gt;break&lt;/p&gt;
&lt;p&gt;print nPos&lt;/p&gt;
&lt;p&gt;14.翻转字符串&lt;/p&gt;
&lt;p&gt;#strrev(sStr1)&lt;/p&gt;
&lt;p&gt;sStr1 = &amp;#8216;abcdefg&amp;#8217;&lt;/p&gt;
&lt;p&gt;sStr1 = sStr1[::-1]&lt;/p&gt;
&lt;p&gt;print sStr1&lt;/p&gt;
&lt;p&gt;15.查找字符串&lt;/p&gt;
&lt;p&gt;#strstr(sStr1,sStr2)&lt;/p&gt;
&lt;p&gt;sStr1 = &amp;#8216;abcdefg&amp;#8217;&lt;/p&gt;
&lt;p&gt;sStr2 = &amp;#8216;cde&amp;#8217;&lt;/p&gt;
&lt;p&gt;print sStr1.find(sStr2)&lt;/p&gt;
&lt;p&gt;16.分割字符串&lt;/p&gt;
&lt;p&gt;#strtok(sStr1,sStr2)&lt;/p&gt;
&lt;p&gt;sStr1 = &amp;#8216;ab,cde,fgh,ijk&amp;#8217;&lt;/p&gt;
&lt;p&gt;sStr2 = &amp;#8216;,&amp;#8217;&lt;/p&gt;
&lt;p&gt;sStr1 = sStr1[sStr1.find(sStr2) + 1:]&lt;/p&gt;
&lt;p&gt;print sStr1&lt;/p&gt;
&lt;p&gt;转载自：&lt;strong&gt;缥缈的云&lt;/strong&gt;[&lt;a href=&quot;http://www.leexiang.info/&quot;&gt;http://www.leexiang.info&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;本文链接: &lt;a title=&quot;&amp;lt; ?php the_title(); ?&amp;gt;&quot; href=&quot;http://www.leexiang.info/archives/294&quot;&gt;http://www.leexiang.info/archives/294&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/367933363/scriptlearn/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/scriptlearn/~8071953/367933363/6139342/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/scriptlearn/367933363/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/scriptlearn/367933363/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.scriptlearn.com/archives/2006/feed</wfw:commentRss><slash:comments>0</slash:comments><description>1.python 字符串通常有单引号（&amp;#8217;…&amp;#8217;）、双引号（&amp;#8221;…&amp;#8221;）、三引号（&amp;#8221;&quot;&amp;#8221;…&amp;#8221;&quot;&amp;#8221;）或（&amp;#8221;&amp;#8217;…&amp;#8221;&amp;#8217;）包围，三引 号包含的字符串可由多行组成，一般可表示大段的叙述性字符串。在使用时基本没有差别，但双引号和三引号（&amp;#8221;&quot;&amp;#8221;…&amp;#8221;&quot;&amp;#8221;）中可以包含单引号，三引号 (&amp;#8221;&amp;#8217;…&amp;#8221;&amp;#8217;)可以包含双引号，而不需要转义。
2.用（\）对特殊字符转义，如（\）、（&amp;#8217;）、（&amp;#8221;）。
3.常用字符串函数
(1) str.count() //返回该字符串中某个子串出现的次数
(2) str.find()   //返回某个子串出现在该字符串的起始位置
(3) str.lower() //将该字符串全部转化为小写
(4) str.upper() //转为大写
(5) str.split() //分割字符串，返回字串串列表，默认以空格分割
(6) len(str)     //返回字符串长度
例如：
&amp;#62;&amp;#62;&amp;#62; str = &amp;#8216;Hello, world&amp;#8217;
&amp;#62;&amp;#62;&amp;#62; str.count(&amp;#8216;o&amp;#8217;)
&amp;#62;&amp;#62;&amp;#62; 2
&amp;#62;&amp;#62;&amp;#62; str.find(&amp;#8216;lo&amp;#8217;)
&amp;#62;&amp;#62;&amp;#62; 3
&amp;#62;&amp;#62;&amp;#62; str.lower()
&amp;#62;&amp;#62;&amp;#62; &amp;#8216;hello, world&amp;#8217;
&amp;#62;&amp;#62;&amp;#62; str.upper()
&amp;#62;&amp;#62;&amp;#62; &amp;#8216;HELLO, WORLD&amp;#8217;
&amp;#62;&amp;#62;&amp;#62; str.split()
&amp;#62;&amp;#62;&amp;#62; ['Hello,', 'world']
&amp;#62;&amp;#62;&amp;#62; str.split(&amp;#8216;,&amp;#8217;)
&amp;#62;&amp;#62;&amp;#62; ['Hello', ' world']
&amp;#62;&amp;#62;&amp;#62; len(str)
&amp;#62;&amp;#62;&amp;#62; 13
&amp;#62;&amp;#62;&amp;#62; str
&amp;#62;&amp;#62;&amp;#62; &amp;#8216;Hello, world&amp;#8217;
以上所有操作都不会改变字符串本身！
4.字符串与数字相互转换
import string
string.atoi(str[,base]) //base为可选参数，表示将字符转换成的进制类型
数字转换成字符串可简单了，直接用str()
5.字符与ASCII转换
char-&amp;#62;ascii ord()
ascii-&amp;#62;char chr()
Python字符串操作
1.复制字符串
#strcpy(sStr1,sStr2)
sStr1 = &amp;#8217;strcpy&amp;#8217;
sStr2 = sStr1
sStr1 = &amp;#8217;strcpy2&amp;#8242;
print sStr2
2.连接字符串
#strcat(sStr1,sStr2)
sStr1 = &amp;#8217;strcat&amp;#8217;
sStr2 [...]&lt;img src=&quot;http://www1.feedsky.com/t1/367933363/scriptlearn/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/scriptlearn/~8071953/367933363/6139342/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/scriptlearn/367933363/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/scriptlearn/367933363/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>字符串</category><category>python</category><pubDate>Mon, 22 Mar 2010 12:18:55 +0800</pubDate><author>scripter</author><comments>http://www.scriptlearn.com/archives/2006#comments</comments><guid isPermaLink="false">http://www.scriptlearn.com/?p=2006</guid><dc:creator>scripter</dc:creator><fs:srclink>http://www.scriptlearn.com/archives/2006</fs:srclink><fs:srcfeed>http://www.scriptlearn.com/feed</fs:srcfeed><fs:itemid>feedsky/scriptlearn/~8071953/367933363/6139342</fs:itemid></item><item><title>PHP 中文乱码的常见解决方法总结</title><link>http://item.feedsky.com/~feedsky/scriptlearn/~8071953/367933364/6139342/1/item.html</link><content:encoded>&lt;ul&gt;本文介绍了PHP中文乱码的常见解决方法。要解决PHP中文乱码最好最快的解决办法就是,页面申明的编码与数据库内部编码一致。&lt;/ul&gt;
&lt;ul&gt;PHP中文乱码是PHP开发中的常见问题之一。PHP中文乱码有时发生在网页本身，有些产生在于MySQL交互的过程中，有时与操作系统有关。下面进行一番总结。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一．首先是PHP网页的编码&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1. php文件本身的编码与网页的编码应匹配&lt;/p&gt;
&lt;p&gt;a. 如果欲使用gb2312编码，那么php要输出头：header(“Content-Type: text/html; charset=gb2312&amp;#8243;)，静态页面添加&amp;lt;meta http-equiv=&amp;#8221;Content-Type&amp;#8221; content=&amp;#8221;text/html; charset=gb2312&amp;#8243;&amp;gt;，所有文件的编码格式为ANSI，可用记事本打开，另存为选择编码为ANSI，覆盖源文件。&lt;br /&gt;
&lt;span id=&quot;more-1999&quot;&gt;&lt;/span&gt;&lt;br /&gt;
b. 如果欲使用utf-8编码，那么php要输出头 ：header(“Content-Type: text/html; charset=utf-8&amp;#8243;)，静态页面添加&amp;lt;meta http-equiv=&amp;#8221;Content-Type&amp;#8221; content=&amp;#8221;text/html; charset=utf-8&amp;#8243;&amp;gt;，所有文件的编码格式为utf-8。保存为utf-8可能会有点麻烦，一般utf-8文件开头会有BOM，如果使用 session就会出问题，可用editplus来保存，在editplus中，工具-&amp;gt;参数选择-&amp;gt;文件-&amp;gt;UTF-8签名，选择总是删除，再保存就可以去掉BOM信息了。&lt;/p&gt;
&lt;p&gt;2. php本身不是Unicode的，所有substr之类的函数得改成mb_substr（需要装mbstring扩展）；或者用iconv转码。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;二．PHP与Mysql的数据交互&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;PHP与数据库的编码应一致&lt;/p&gt;
&lt;p&gt;1. 修改mysql配置文件my.ini或my.cnf，mysql最好用utf8编码&lt;/p&gt;
&lt;p&gt;[mysql]&lt;br /&gt;
default-character-set=utf8&lt;br /&gt;
[mysqld]&lt;br /&gt;
default-character-set=utf8&lt;br /&gt;
default-storage-engine=MyISAM&lt;br /&gt;
在[mysqld]下加入:&lt;br /&gt;
default-collation=utf8_bin&lt;br /&gt;
init_connect=&amp;#8217;SET NAMES utf8&amp;#8242;&lt;/p&gt;
&lt;p&gt;2. 在需要做数据库操作的php程序前加mysql_query(&amp;#8220;set names &amp;#8216;编码&amp;#8217;&amp;#8221;);，编码和php编码一致，如果php编码是gb2312那mysql编码就是gb2312，如果是utf-8那mysql编码就是 utf8，这样插入或检索数据时就不会出现乱码了&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;三．PHP与操作系统相关&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Windows和Linux的编码是不一样的，在Windows环境下，调用PHP的函数时参数如果是utf-8编码会出现错误，比如 move_uploaded_file()、filesize()、readfile()等，这些函数在处理上传、下载时经常会用到，调用时可能会出现下面的错误:&lt;/p&gt;
&lt;p&gt;Warning: move_uploaded_file()[function.move-uploaded-file]:failed to open stream: Invalid argument in &amp;#8230;&lt;/p&gt;
&lt;p&gt;Warning: move_uploaded_file()[function.move-uploaded-file]:Unable to move &amp;#8221; to &amp;#8221; in &amp;#8230;&lt;/p&gt;
&lt;p&gt;Warning: filesize() [function.filesize]: stat failed for &amp;#8230; in &amp;#8230;&lt;/p&gt;
&lt;p&gt;Warning: readfile() [function.readfile]: failed to open stream: Invalid argument in ..&lt;/p&gt;
&lt;p&gt;在Linux环境下用gb2312编码虽然不会出现这些错误，但保存后的文件名出现乱码导致无法读取文件，这时可先将参数转换成操作系统识别的编码，编码转换可用mb_convert_encoding(字符串,新编码,原编码)或iconv(原编码,新编码,字符串)，这样处理后保存的文件名就不会出现乱码，也可以正常读取文件，实现中文名称文件的上传、下载。&lt;/p&gt;
&lt;p&gt;其实还有更好的解决方法，彻底与系统脱离，也就不用考虑系统是何编码。可以生成一个只有字母和数字的序列作为文件名，而将原来带有中文的名字保存在数据库中，这样调用move_uploaded_file()就不会出现问题，下载的时候只需将文件名改为原来带有中文的名字。实现下载的代码如下&lt;/p&gt;
&lt;p&gt;header(&amp;#8220;Pragma: public&amp;#8221;);&lt;/p&gt;
&lt;p&gt;header(&amp;#8220;Expires: 0&amp;#8243;);&lt;/p&gt;
&lt;p&gt;header(&amp;#8220;Cache-Component: must-revalidate, post-check=0, pre-check=0&amp;#8243;);&lt;/p&gt;
&lt;p&gt;header(&amp;#8220;Content-type: $file_type&amp;#8221;);&lt;/p&gt;
&lt;p&gt;header(&amp;#8220;Content-Length: $file_size&amp;#8221;);&lt;/p&gt;
&lt;p&gt;header(&amp;#8220;Content-Disposition: attachment; filename=\&amp;#8221;$file_name\&amp;#8221;&quot;);&lt;/p&gt;
&lt;p&gt;header(&amp;#8220;Content-Transfer-Encoding: binary&amp;#8221;);&lt;/p&gt;
&lt;p&gt;readfile($file_path);&lt;/p&gt;
&lt;p&gt;$file_type是文件的类型，$file_name是原来的名字，$file_path是保存在服务上文件的地址。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;四．再来总结一下为什么会乱码&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一般来说，乱码的出现有2种原因，首先是由于编码(charset) 设置错误，导致浏览器以错误的编码来解析，从而出现了满屏乱七八糟的“天书”，其次是文件被以错误的编码打开，然后保存，比如一个文本文件原先是GB2312 编码的，却以UTF-8 编码打开再保存。要解决上述乱码问题，首先需要知道开发中哪些环节涉及到了编码：&lt;/p&gt;
&lt;p&gt;1、文件编码：指的是页面文件(.html,.php等)本身是以何种编码来保存的。记事本和Dreamweaver 在打开页面时候会自动识别文件编码因而不太会出问题。而ZendStudio却不会自动识别编码，它只会根据首选项的配置固定以某种编码打开文件，如果工作时候一不注意，用错误编码打开文件，做了修改之后一保存，乱码就出现了（我深有体会）。&lt;/p&gt;
&lt;p&gt;2、页面申明编码：在HTML代码HEAD里面，可以用&amp;lt;meta http-equiv=&amp;#8221;Content-Type&amp;#8221; content=&amp;#8221;text/html; charset=&amp;#8221;XXX&amp;#8221; /&amp;gt; 来告诉浏览器网页采用了什么编码，目前中文网站开发中XXX主要用的是GB2312和UTF-8 两种编码。&lt;/p&gt;
&lt;p&gt;3、数据库连接编码：指的是进行数据库操作时候以哪种编码与数据库传输数据，这里需要注意的是不要与数据库本身的编码混淆，比如MySQL内部默认是latin1编码，也就是说Mysql是以latin1编码来存储数据，以其他编码传输给Mysql的数据会被转换成latin1编码。&lt;br /&gt;
知道了WEB开发中哪些地方涉及到了编码，也就知道了乱码产生的原因：上述3项编码设置不一致，由于各种编码绝大部分是兼容ASCII的，所以英文符号不会出现，中文就倒霉了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;五．决战一些常见的错误情况与解决：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1、数据库采用UTF8 编码，而页面申明编码是GB2312 ，这是最常见的产生乱码的原因。这时候在PHP脚本里面直接SELECT数据出来的就是乱码，需要在查询前先使用： mysql_query(&amp;#8220;SET NAMES GBK&amp;#8221;); 来设定MYSQL连接编码，保证页面申明编码与这里设定的连接编码一致（GBK是GB2312的扩展 ）。如果页面是UTF-8 编码的话，可以用： mysql_query(&amp;#8220;SET NAMES UTF8&amp;#8243;);&lt;br /&gt;
注意是UTF8而不是一般用的UTF-8。假如页面申明的编码与数据库内部编码一致可以不设定连接编码。&lt;/p&gt;
&lt;p&gt;注：事实上MYSQL的数据输入输出比上面讲的更复杂一些，MYSQL配置文件my.ini中定义了2个默认编码，分别是[client]里的default -character-set和[mysqld] 里的default-character-set 来分别设定默认时候客户端连接和数据库内部所采用的编码。我们上面指定的编码其实是MYSQL客户端连接服务器时候的命令行参数character_set_client，来告诉MYSQL服务器接受到的客户端数据是什么编码的，而不是采用默认编码。&lt;/p&gt;
&lt;p&gt;2、页面申明编码与文件本身编码不一致，这种情况很少发生，因为如果编码不一致美工做页面时候在浏览器看到的就是乱码了。更多时候是发布以后修改一些小BUG，以错误编码打开页面然后保存导致的。或者是用某些FTP软件直接在线修改文件，比如CuteFTP，由于软件编码配置错误而导致转换错了编码。&lt;/p&gt;
&lt;p&gt;3、一些租用虚拟主机的朋友，明明上述3项编码都设置正确了还是有乱码。比方说网页是GB2312 编码的，IE等浏览器打开却总是识别成UTF-8 ，网页HEAD里面已经申明是GB2312 了，手动修改浏览器编码为GB2312 后页面显示正常。产生原因是服务器Apache设定了服务器全局的默认编码，在httpd.conf里面加了AddDefaultCharset UTF-8 。这时候服务器会首先发送HTTP头给浏览器，其优先级比页面里申明编码高，自然浏览器就识别错了。解决办法有2个，请管理员在配置文件自己的虚机里加上一条AddDefaultCharset GB2312 来覆盖全局配置，或者在自己目录的.htaccess里配置。&lt;/p&gt;
&lt;p&gt;总结:总之一句话,要解决PHP中文乱码最好最快的解决办法就是,页面申明的编码与数据库内部编码一致,如果页面申请的页码与数据库内部编码不一致时,就设定连接编码 ,mysql_query(&amp;#8220;SET NAMES XXX &amp;#8220;); XXX为连接编码.一定可以解决乱码的问题.&lt;/ul&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/367933364/scriptlearn/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/scriptlearn/~8071953/367933364/6139342/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/scriptlearn/367933364/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/scriptlearn/367933364/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.scriptlearn.com/archives/1999/feed</wfw:commentRss><slash:comments>4</slash:comments><description>本文介绍了PHP中文乱码的常见解决方法。要解决PHP中文乱码最好最快的解决办法就是,页面申明的编码与数据库内部编码一致。
PHP中文乱码是PHP开发中的常见问题之一。PHP中文乱码有时发生在网页本身，有些产生在于MySQL交互的过程中，有时与操作系统有关。下面进行一番总结。
一．首先是PHP网页的编码
1. php文件本身的编码与网页的编码应匹配
a. 如果欲使用gb2312编码，那么php要输出头：header(“Content-Type: text/html; charset=gb2312&amp;#8243;)，静态页面添加&amp;#60;meta http-equiv=&amp;#8221;Content-Type&amp;#8221; content=&amp;#8221;text/html; charset=gb2312&amp;#8243;&amp;#62;，所有文件的编码格式为ANSI，可用记事本打开，另存为选择编码为ANSI，覆盖源文件。

b. 如果欲使用utf-8编码，那么php要输出头 ：header(“Content-Type: text/html; charset=utf-8&amp;#8243;)，静态页面添加&amp;#60;meta http-equiv=&amp;#8221;Content-Type&amp;#8221; content=&amp;#8221;text/html; charset=utf-8&amp;#8243;&amp;#62;，所有文件的编码格式为utf-8。保存为utf-8可能会有点麻烦，一般utf-8文件开头会有BOM，如果使用 session就会出问题，可用editplus来保存，在editplus中，工具-&amp;#62;参数选择-&amp;#62;文件-&amp;#62;UTF-8签名，选择总是删除，再保存就可以去掉BOM信息了。
2. php本身不是Unicode的，所有substr之类的函数得改成mb_substr（需要装mbstring扩展）；或者用iconv转码。
二．PHP与Mysql的数据交互
PHP与数据库的编码应一致
1. 修改mysql配置文件my.ini或my.cnf，mysql最好用utf8编码
[mysql]
default-character-set=utf8
[mysqld]
default-character-set=utf8
default-storage-engine=MyISAM
在[mysqld]下加入:
default-collation=utf8_bin
init_connect=&amp;#8217;SET NAMES utf8&amp;#8242;
2. 在需要做数据库操作的php程序前加mysql_query(&amp;#8220;set names &amp;#8216;编码&amp;#8217;&amp;#8221;);，编码和php编码一致，如果php编码是gb2312那mysql编码就是gb2312，如果是utf-8那mysql编码就是 utf8，这样插入或检索数据时就不会出现乱码了
三．PHP与操作系统相关
Windows和Linux的编码是不一样的，在Windows环境下，调用PHP的函数时参数如果是utf-8编码会出现错误，比如 move_uploaded_file()、filesize()、readfile()等，这些函数在处理上传、下载时经常会用到，调用时可能会出现下面的错误:
Warning: move_uploaded_file()[function.move-uploaded-file]:failed to open stream: Invalid argument in &amp;#8230;
Warning: move_uploaded_file()[function.move-uploaded-file]:Unable to move &amp;#8221; to &amp;#8221; in &amp;#8230;
Warning: filesize() [function.filesize]: stat failed for &amp;#8230; in &amp;#8230;
Warning: readfile() [function.readfile]: failed to open stream: [...]&lt;img src=&quot;http://www1.feedsky.com/t1/367933364/scriptlearn/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/scriptlearn/~8071953/367933364/6139342/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/scriptlearn/367933364/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/scriptlearn/367933364/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>编码</category><category>字符串</category><category>php</category><pubDate>Sun, 21 Mar 2010 18:12:49 +0800</pubDate><author>scripter</author><comments>http://www.scriptlearn.com/archives/1999#comments</comments><guid isPermaLink="false">http://www.scriptlearn.com/?p=1999</guid><dc:creator>scripter</dc:creator><fs:srclink>http://www.scriptlearn.com/archives/1999</fs:srclink><fs:srcfeed>http://www.scriptlearn.com/feed</fs:srcfeed><fs:itemid>feedsky/scriptlearn/~8071953/367933364/6139342</fs:itemid></item><item><title>python 文件和目录操作</title><link>http://item.feedsky.com/~feedsky/scriptlearn/~8071953/367933365/6139342/1/item.html</link><content:encoded>&lt;p&gt;&lt;strong&gt;1．获得当前路径&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在Python中可以使用os.getcwd()函数获得当前的路径。其原型如下所示。&lt;/p&gt;
&lt;p&gt;os.getcwd()&lt;br /&gt;
该函数不需要传递参数，它返回当前的目录。需要说明的是，当前目录并不是指脚本所在的目录，而是所运行脚本的目录。例如，在PythonWin中输入如下脚本。&lt;br /&gt;
&lt;span id=&quot;more-1994&quot;&gt;&lt;/span&gt;
&lt;pre class=&quot;brush:python&quot;&gt;
&gt;&gt;&gt; import os
&gt;&gt;&gt; print 'current directory is ',os.getcwd()
current directory is D:\Python25\Lib\site-packages\pythonwin #这里是PythonWin的安装目录
&lt;/pre&gt;
&lt;p&gt;如果将上述内容写入pwd.py，假设pwd.py位于E:\book\code目录，运行Windows的命令行窗口，进入E:\book目录，输入code\pwd.py，输出如下所示。&lt;br /&gt;
E:\book&gt;code\pwd.py&lt;br /&gt;
current directory is E:\book&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2．获得目录中的内容&lt;/strong&gt;&lt;br /&gt;
在Python中可以使用os.listdir()函数获得指定目录中的内容。其原型如下所示。&lt;br /&gt;
os.listdir(path)&lt;/p&gt;
&lt;p&gt;其参数含义如下。&lt;br /&gt;
·     path:                      要获得内容目录的路径。&lt;br /&gt;
以下实例获得当前目录的内容。&lt;/p&gt;
&lt;pre class=&quot;brush:python&quot;&gt;
&gt;&gt;&gt; import os
&gt;&gt;&gt; os.listdir(os.getcwd())             # 获得当前目录中的内容
['dde.pyd', 'license.txt', 'Pythonwin.exe', 'scintilla.dll', 'win32ui.pyd', 'win32uiole.pyd', 'pywin']
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3．创建目录&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在Python中可以使用os.mkdir()函数创建目录。其原型如下所示。&lt;br /&gt;
os.mkdir(path)&lt;/p&gt;
&lt;p&gt;其参数含义为。&lt;br /&gt;
·     path:                   要创建目录的路径。&lt;/p&gt;
&lt;p&gt;以下的实例将在E:\book目录下创建temp目录。&lt;/p&gt;
&lt;pre class=&quot;brush:python&quot;&gt;
&gt;&gt;&gt; import os
&gt;&gt;&gt; os.mkdir('E:\\book\\temp')          # 使用os.mkdir创建目录
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;4．删除目录&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在Python中可以使用os.rmdir()函数删除目录。其原型如下所示。&lt;br /&gt;
os.rmdir(path)&lt;/p&gt;
&lt;p&gt;其参数含义如下。&lt;br /&gt;
·     path:                      要删除的目录的路径。&lt;/p&gt;
&lt;p&gt;以下实例删除E:\book\temp目录。&lt;/p&gt;
&lt;pre class=&quot;brush:python&quot;&gt;
&gt;&gt;&gt; import os
&gt;&gt;&gt; os.rmdir('E:\\book\\temp')          # 删除目录
&lt;/pre&gt;
&lt;p&gt;需要说明的是，使用os.rmdir删除的目录必须为空目录，否则函数出错。&lt;/p&gt;
&lt;p&gt;5．判断是否是目录&lt;/p&gt;
&lt;p&gt;在Python中可以使用os.path.isdir()函数判断某一路径是否为目录。其函数原型如下所示。&lt;br /&gt;
os.path.isdir(path)&lt;/p&gt;
&lt;p&gt;其参数含义如下。&lt;br /&gt;
·     path:                      要进行判断的路径。&lt;/p&gt;
&lt;p&gt;以下实例判断E:\book\temp是否为目录。&lt;/p&gt;
&lt;pre class=&quot;brush:python&quot;&gt;
&gt;&gt;&gt; import os
&gt;&gt;&gt; os.path.isdir('E:\\book\\temp')     # 判断E:\book\temp是否为目录
True                                    # 表E:\book\temp是目录
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;6．判断是否为文件&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在Python中可以使用os.path.isfile()函数判断某一路径是否为文件。其函数原型如下所示。&lt;br /&gt;
os.path.isfile(path)&lt;/p&gt;
&lt;p&gt;其参数含义如下。&lt;br /&gt;
·     path：要进行判断的路径。&lt;/p&gt;
&lt;p&gt;以下实例判断E:\book\temp是否为文件。&lt;/p&gt;
&lt;pre class=&quot;brush:python&quot;&gt;
&gt;&gt;&gt; import os
&gt;&gt;&gt; os.path.isfile('E:\\book\\temp')        # 判断是否为文件
False                                   # 表示E:\book\temp不是文件
&lt;/pre&gt;
&lt;p&gt;列出目录中所有文件的方法&lt;/p&gt;
&lt;p&gt;关键字: dir&lt;/p&gt;
&lt;pre class=&quot;brush:python&quot;&gt;
import string, os, sys

dir = '/var'
print '----------- no sub dir'

files = os.listdir(dir)
for f in files:
    print dir + os.sep + f

print '----------- all dir'

for root, dirs, files in os.walk(dir):
    for name in files:
        print os.path.join(root, name)
&lt;/pre&gt;
&lt;p&gt;前面的 os.listdir 可以列出 dir 里面的所有文件和目录，但不包括子目录中的内容。os.walk 可以遍历下面的所有目录，包括子目录。&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/367933365/scriptlearn/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/scriptlearn/~8071953/367933365/6139342/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/scriptlearn/367933365/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/scriptlearn/367933365/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.scriptlearn.com/archives/1994/feed</wfw:commentRss><slash:comments>3</slash:comments><description>1．获得当前路径
在Python中可以使用os.getcwd()函数获得当前的路径。其原型如下所示。
os.getcwd()
该函数不需要传递参数，它返回当前的目录。需要说明的是，当前目录并不是指脚本所在的目录，而是所运行脚本的目录。例如，在PythonWin中输入如下脚本。


&gt;&gt;&gt; import os
&gt;&gt;&gt; print 'current directory is ',os.getcwd()
current directory is D:\Python25\Lib\site-packages\pythonwin #这里是PythonWin的安装目录

如果将上述内容写入pwd.py，假设pwd.py位于E:\book\code目录，运行Windows的命令行窗口，进入E:\book目录，输入code\pwd.py，输出如下所示。
E:\book&gt;code\pwd.py
current directory is E:\book
2．获得目录中的内容
在Python中可以使用os.listdir()函数获得指定目录中的内容。其原型如下所示。
os.listdir(path)
其参数含义如下。
·     path:                      要获得内容目录的路径。
以下实例获得当前目录的内容。

&gt;&gt;&gt; import os
&gt;&gt;&gt; os.listdir(os.getcwd())           [...]&lt;img src=&quot;http://www1.feedsky.com/t1/367933365/scriptlearn/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/scriptlearn/~8071953/367933365/6139342/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/scriptlearn/367933365/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/scriptlearn/367933365/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>文件处理</category><category>python</category><category>操作</category><category>目录</category><pubDate>Sun, 21 Mar 2010 00:06:16 +0800</pubDate><author>scripter</author><comments>http://www.scriptlearn.com/archives/1994#comments</comments><guid isPermaLink="false">http://www.scriptlearn.com/?p=1994</guid><dc:creator>scripter</dc:creator><fs:srclink>http://www.scriptlearn.com/archives/1994</fs:srclink><fs:srcfeed>http://www.scriptlearn.com/feed</fs:srcfeed><fs:itemid>feedsky/scriptlearn/~8071953/367933365/6139342</fs:itemid></item><item><title>python logging模块介绍</title><link>http://item.feedsky.com/~feedsky/scriptlearn/~8071953/367933366/6139342/1/item.html</link><content:encoded>&lt;p&gt;&lt;font size=&quot;5&quot;&gt;简介-Python文档&lt;/font&gt;&lt;br /&gt;
从Python2.3版本中开始引入的logging模块为应用提供了灵活的日志系统。&lt;/p&gt;
&lt;p&gt;logging的行为依靠调用 &lt;strong&gt;Logger&lt;/strong&gt; 类的方法来实现，实例一般叫做logger。每个实例都拥有自己的名字，并且可以通过点来分割具备层次的名字。例如，一个logger叫做”scan”是一个叫做”scan.text”的logger的顶层，当然也包括”scan.html”和”scan.pdf”。logger的名字指示了他属于应用程序的哪个位置。&lt;br /&gt;
&lt;span id=&quot;more-1981&quot;&gt;&lt;/span&gt;&lt;br /&gt;
日志信息也拥有级别指定其重要程度。缺省提供的级别包括DEBUG，INFO，WARNING，ERROR，CRITICAL(严重)。为了方便，你可以调用特定的方法来指定日志的重要性，对应的方法为 &lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;debug()&lt;/span&gt;&lt;/tt&gt; ， &lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;info()&lt;/span&gt;&lt;/tt&gt; ， &lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;warning()&lt;/span&gt;&lt;/tt&gt; ， &lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;error()&lt;/span&gt;&lt;/tt&gt; ， &lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;critical()&lt;/span&gt;&lt;/tt&gt; 。你也不必拘泥于这些级别，你可以使用更为通用的方法 &lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;log()&lt;/span&gt;&lt;/tt&gt; 并且手动指定其级别。&lt;/p&gt;
&lt;p&gt;日志级别对应值如下表所示。了解这些有助于你定义自己的日志级别的相对关系。如果你定义的级别与已有的数值相同，则原有的级别会被覆盖。&lt;/p&gt;
&lt;table border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;级别&lt;/td&gt;
&lt;td&gt;数值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CRITICAL&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ERROR&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WARNING&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;INFO&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DEBUG&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NOTSET&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;日志级别也可以在指定logger时定义，可以在开发时装入和存储配置。当调用logger的日志方法时，logger对比日志级别和自己的被指定的级别。如果本身的级别高于调用方法的级别，则不会记录这个日志信息。这是一个方便的方法用于忽略过多细节的日志。&lt;/p&gt;
&lt;p&gt;日志信息会被编码为 &lt;strong&gt;LogRecord&lt;/strong&gt; 类，当logger决定记录一个事件时，就会为日志信息创建一个LogRecord实例。&lt;/p&gt;
&lt;p&gt;日志信息会被发布(dispatch)机制通过handler来发布出去，这些handler继承自 &lt;strong&gt;Handler&lt;/strong&gt; 类。Handler负责把日志信息(LogRecord的实例)发布到对应的位置供处理这些信息。Handler传递LogRecord实例并指定特定目标。每个logger都可以拥有0个或多个handler，通过 &lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;addHandler()&lt;/span&gt;&lt;/tt&gt; 方法添加。除了handler与logger的组合之外，所有的handler还会被所组合的祖先logger所调用来发布信息。&lt;/p&gt;
&lt;p&gt;有如logger，handler也可以有自己的级别过滤器，用于过滤日志级别。如果一个handler决定发布一个事件，可以调用 &lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;emit()&lt;/span&gt;&lt;/tt&gt; 来发送信息到目的。大多数用户继承的Handler的子类需要重载这个emit()方法。&lt;/p&gt;
&lt;p&gt;除了基本的Handler类，比较有用的子类如：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;StreamHandler实例发送错误到流(类似文件的对象)。&lt;/li&gt;
&lt;li&gt;FileHandler实例发送错误到磁盘文件。&lt;/li&gt;
&lt;li&gt;BaseRotatingHandler是所有轮徇日志的基类，不能直接使用。但是可以使用RotatingFileHandler和TimeRotatingFileHandler。&lt;/li&gt;
&lt;li&gt;RotatingFileHandler实例发送信息到磁盘文件，并且限制最大的日志文件大小，并适时轮徇。&lt;/li&gt;
&lt;li&gt;TimeRotatingFileHandler实例发送错误信息到磁盘，并在适当的事件间隔进行轮徇。&lt;/li&gt;
&lt;li&gt;SocketHandler实例发送日志到TCP/IP socket。&lt;/li&gt;
&lt;li&gt;DatagramHandler实例发送错误信息通过UDP协议。&lt;/li&gt;
&lt;li&gt;SMTPHandler实例发送错误信息到特定的email地址。&lt;/li&gt;
&lt;li&gt;SysLogHandler实例发送日志到UNIX syslog服务，并支持远程syslog服务。&lt;/li&gt;
&lt;li&gt;NTEventLogHandler实例发送日志到WindowsNT/2000/XP事件日志。&lt;/li&gt;
&lt;li&gt;MemoryHandler实例发送日志到内存中的缓冲区，并在达到特定条件时清空。&lt;/li&gt;
&lt;li&gt;HTTPHandler实例发送错误信息到HTTP服务器，通过GET或POST方法。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;StreamHandler和FileHandler类都是在核心logging模块中定义的。其他handler定义在各个子模块中，叫做logging.handlers。当然还有一个logging.config模块提供了配置功能。&lt;/p&gt;
&lt;p&gt;日志信息在输出之前会经过 &lt;strong&gt;Formatter&lt;/strong&gt; 类的格式化。他们在最开始使用%操作符来设置。&lt;/p&gt;
&lt;p&gt;批量格式化信息，需要 &lt;strong&gt;BufferingFormatter&lt;/strong&gt; 类。除了格式化字符串之外，它还会在输出信息之前加上其他信息。&lt;/p&gt;
&lt;p&gt;当基于logger和handler的级别过滤器仍然不够时，可以使用 &lt;strong&gt;Filter&lt;/strong&gt; 类的实例来添加到logger和handler实例中，通过他们的 &lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;addFilter()&lt;/span&gt;&lt;/tt&gt; 方法。当决定输出日志之前，logger和handler会询问过滤器，如果过滤器返回False，则不会显示这条日志。&lt;/p&gt;
&lt;p&gt;最简单的过滤器功能用于指定日志的名字。如果使用了这个过滤器，则发送到命名logger和其子logger的日志将会通过，其他的会被丢弃。&lt;/p&gt;
&lt;p&gt;除了上面所描述的，还有很多模块级别的函数。如下：&lt;/p&gt;
&lt;p&gt;&lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;getLogger([name])&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;返回一个logger，可以指定名字，如果没有指定名字则返回根logger。指定的名字典型的为以点分隔的分层次的名字。选择一个恰当的名字，让别人知道，谁在输出日志。所有使用相同名字调用这个函数都会返回相同的logger实例。这意味着logger实例不需要在应用中到处传递。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;getLoggerClass()&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;返回一个标准的Logger类，或者上次传递到 &lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;setLoggerClass()&lt;/span&gt;&lt;/tt&gt; 的类。这个函数用于定义一个新的日志类，但是之前的代码不会受到影响。例如:&lt;/p&gt;
&lt;pre&gt;class MyLogger(logging.getLoggerClass()):
    #重载一些行为&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;debug(msg[,*args[,**kwargs]])&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;记录一个DEBUG级别的日志信息到根logger。 msg 参数就是用于输出的日志， args 参数是用于填入msg字符串的参数，当然kwargs也是差不多的角色。这说明msg可以是一个包含%d、%s等等的待格式化字符串。&lt;/p&gt;
&lt;p&gt;在kwargs中有2个参数是必须的： &lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;exc_info&lt;/span&gt;&lt;/tt&gt; 如果不为False，则异常产生的信息也会被记录；如果提供了一个异常tuple(以 &lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;sys.exc_info()&lt;/span&gt;&lt;/tt&gt; 格式)，则会使用它；否则会调用 &lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;sys.exc_info()&lt;/span&gt;&lt;/tt&gt; 来获取异常信息。&lt;/p&gt;
&lt;p&gt;另外一个参数为 &lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;extra&lt;/span&gt;&lt;/tt&gt; 用于传递一个字典表示 LogRecord 中的 __dict__ 信息，可以加入用户自定义属性。这些传递的参数可以随你喜欢的。例如可能需要传递的:&lt;/p&gt;
&lt;pre&gt;FORMAT=&quot;%(asctime)-15s %(clientip)s %(user)-8s %(message)s&quot;
logging.basicConfig(format=FORMAT)
dict={'clientip':'192.168.1.1','user':'fbloggs'}
logging.warning(&quot;Protocol problem: %s&quot;,&quot;connection reset&quot;,extra=d)&lt;/pre&gt;
&lt;p&gt;将会有如下的显示:&lt;/p&gt;
&lt;pre&gt;2006-02-08 22:20:02,165 192.168.1.1 fbloggs Protocol problem: connection reset&lt;/pre&gt;
&lt;p&gt;extra字典中的键不会与已有的键相冲突，具体可以参考Formatter的文档中关于使用字典的部分。&lt;/p&gt;
&lt;p&gt;在选择字典中的键名时，必须小心一些情况。上面的例子中，已经在待格式化字符串中有’clientip’和’user’了，这时如果没有传递这两个键，则不会输出日志，因为出现了异常了。这种情况时，你必须要传递这2个键。&lt;/p&gt;
&lt;p&gt;出于这种复杂性，这种功能往往用在很特殊的地方，比如多线程服务器，或关心多种信息的上下文环境，例如远程IP和登录用户。在这些情况中，需要先指定Formatter实例。 &lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;extra&lt;/span&gt;&lt;/tt&gt; 参数从2.5版本开始加入。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;info(msg[,*args[,**kwargs]])&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;记录INFO级别的日志信息，其他参数同debug()。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;warning(msg[,*args[,**kwargs]])&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;记录WARNING级别的日志信息，其他参数同debug()。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;error(msg[,*args[,**kwargs]])&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;记录ERROR级别的日志信息，其他参数同debug()。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;critical(msg[,*args[,**kwargs]])&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;记录CRITICAL级别的日志信息，其他参数同debug()。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;exception(msg[,*args])&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;记录ERROR级别的日志信息，其他参数同debug()。一般用在异常处理中。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;log(level,msg[,*args[,**kwargs]])&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;记录level级别的日志信息，其他参数同debug()。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;disable(lvl)&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;提供一个在logger中禁用某个级别日志的方法，用于应用临时切换可显示的日志。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;addLevelName(lvl,levelName)&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;给级别lvl指定一个名字levelName到内部字典。以后用于映射数字的级别到特定的名字，供给Formatter用来格式化字符串。也可以用于定义自己的级别。这里也是唯一可以注册级别用的地方，级别必须是数字，并且在按照一定的排序要求。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;getLevelName(lvl)&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;返回lvl级别的文字说明。如果级别是CRITICAL、ERROR、WARNING、INFO、DEBUG中的某一个，也会返回对应的名字。如果你自己通过addLevelName()自定义过级别，那么也会返回对应的名字。如果对应级别不存在，则返回 &lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;“Level %s”%lvl&lt;/span&gt;&lt;/tt&gt; 这个字符串。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;makeLogRecord(attrdict)&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;创建并返回一个LogRecord实例，并使用attrdict赋值过。这个函数用于把一个LogRecord给pickle过后通过socket发送，并方便接收方重组这个信息。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;basicConfig([**kwargs])&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;对日志系统进行基本配置，使用缺省的StreamHandler和Formatter并添加根logger。一些函数如debug()、info()、warning()、error()、critical()会自动使用basicConfig()配置好的根logger进行日志输出。在2.4版之前，basicConfig()不接受字典参数。&lt;/p&gt;
&lt;p&gt;如下是支持的字典参数：&lt;/p&gt;&lt;/blockquote&gt;
&lt;table border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;格式&lt;/td&gt;
&lt;td&gt;描述&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;filename&lt;/td&gt;
&lt;td&gt;指定FileHandler的文件名，而不是StreamHandler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;filemode&lt;/td&gt;
&lt;td&gt;打开文件的模式，同open函数中的同名参数，默认为’a’&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;format&lt;/td&gt;
&lt;td&gt;输出格式字符串&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;datefmt&lt;/td&gt;
&lt;td&gt;日期格式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;level&lt;/td&gt;
&lt;td&gt;设置根logger的日志级别&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;stream&lt;/td&gt;
&lt;td&gt;指定StreamHandler。这个参数与filename冲突，忽略stream&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;shutdown()&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;告知日志系统准备关闭日志并将所有信息写入磁盘。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;setLoggerClass(klass)&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;告知日志系统使用类klass作为示例的Logger类。这个类应该定义 &lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;__init__()&lt;/span&gt;&lt;/tt&gt; 方法并接受一个参数表示名字，而且 &lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;__init__()&lt;/span&gt;&lt;/tt&gt; 方法应该在内部调用&lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;Logger.__init__()&lt;/span&gt;&lt;/tt&gt; 方法。这个函数一般在应用自定义Logger的行为时使用。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://www.python.org/peps/pep-0282.html&quot;&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;PEP 282, A Logging System&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.red-dove.com/python_logging.html&quot;&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;Original Python logging package&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;5&quot;&gt;2    各种Handler的子类&lt;/font&gt;&lt;br /&gt;
 &lt;br /&gt;
2.1    TimedRotatingFileHandler&lt;br /&gt;
&lt;strong&gt;TimedRotatingFileHandler&lt;/strong&gt; 类是在logging.handler包中，支持对写入到磁盘的日志按照时间间隔来轮询。&lt;/p&gt;
&lt;p&gt;&lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;class TimedRotatingFileHandler(filename[,when[,interval[,backupCount]]])&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;返回一个新的TimedRotatingFileHandler类实例，在指定文件名时会自动使用词缀。轮询发生的时间取决于参数 when 和 interval 。&lt;/p&gt;
&lt;p&gt;你可以使用 when 来指定 interval 的类型。可选值如下，注意区分大小写：&lt;/p&gt;&lt;/blockquote&gt;
&lt;table border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;值&lt;/td&gt;
&lt;td&gt;interval的类型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S&lt;/td&gt;
&lt;td&gt;秒&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;M&lt;/td&gt;
&lt;td&gt;分钟&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;H&lt;/td&gt;
&lt;td&gt;小时&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;td&gt;天&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;W&lt;/td&gt;
&lt;td&gt;周&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;midnight&lt;/td&gt;
&lt;td&gt;在午夜&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;如果 backupCount 为非零，则系统会在旧日志文件名的末尾添加词缀。词缀格式为日期和时间，使用 strftime 格式如 %Y-%m-%d %H:%M:%S 或者依赖于之前的规则。最多会保留 backupCount 个日志文件，如果继续增加，会持续删除最旧的的日志。&lt;/p&gt;
&lt;p&gt;&lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;doRollover()&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;进行一次回转，有如上面描述的。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;tt&gt;&lt;span style=&quot;font-family: 新宋体;&quot;&gt;emit(record)&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;把日志输出到文件，按照如上的回转规则。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;文章来源： http://gashero.yeax.com/?p=16&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/367933366/scriptlearn/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/scriptlearn/~8071953/367933366/6139342/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/scriptlearn/367933366/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/scriptlearn/367933366/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.scriptlearn.com/archives/1981/feed</wfw:commentRss><slash:comments>0</slash:comments><description>简介-Python文档
从Python2.3版本中开始引入的logging模块为应用提供了灵活的日志系统。
logging的行为依靠调用 Logger 类的方法来实现，实例一般叫做logger。每个实例都拥有自己的名字，并且可以通过点来分割具备层次的名字。例如，一个logger叫做”scan”是一个叫做”scan.text”的logger的顶层，当然也包括”scan.html”和”scan.pdf”。logger的名字指示了他属于应用程序的哪个位置。

日志信息也拥有级别指定其重要程度。缺省提供的级别包括DEBUG，INFO，WARNING，ERROR，CRITICAL(严重)。为了方便，你可以调用特定的方法来指定日志的重要性，对应的方法为 debug() ， info() ， warning() ， error() ， critical() 。你也不必拘泥于这些级别，你可以使用更为通用的方法 log() 并且手动指定其级别。
日志级别对应值如下表所示。了解这些有助于你定义自己的日志级别的相对关系。如果你定义的级别与已有的数值相同，则原有的级别会被覆盖。



级别
数值


CRITICAL
50


ERROR
40


WARNING
30


INFO
20


DEBUG
10


NOTSET
0



日志级别也可以在指定logger时定义，可以在开发时装入和存储配置。当调用logger的日志方法时，logger对比日志级别和自己的被指定的级别。如果本身的级别高于调用方法的级别，则不会记录这个日志信息。这是一个方便的方法用于忽略过多细节的日志。
日志信息会被编码为 LogRecord 类，当logger决定记录一个事件时，就会为日志信息创建一个LogRecord实例。
日志信息会被发布(dispatch)机制通过handler来发布出去，这些handler继承自 Handler 类。Handler负责把日志信息(LogRecord的实例)发布到对应的位置供处理这些信息。Handler传递LogRecord实例并指定特定目标。每个logger都可以拥有0个或多个handler，通过 addHandler() 方法添加。除了handler与logger的组合之外，所有的handler还会被所组合的祖先logger所调用来发布信息。
有如logger，handler也可以有自己的级别过滤器，用于过滤日志级别。如果一个handler决定发布一个事件，可以调用 emit() 来发送信息到目的。大多数用户继承的Handler的子类需要重载这个emit()方法。
除了基本的Handler类，比较有用的子类如：

StreamHandler实例发送错误到流(类似文件的对象)。
FileHandler实例发送错误到磁盘文件。
BaseRotatingHandler是所有轮徇日志的基类，不能直接使用。但是可以使用RotatingFileHandler和TimeRotatingFileHandler。
RotatingFileHandler实例发送信息到磁盘文件，并且限制最大的日志文件大小，并适时轮徇。
TimeRotatingFileHandler实例发送错误信息到磁盘，并在适当的事件间隔进行轮徇。
SocketHandler实例发送日志到TCP/IP socket。
DatagramHandler实例发送错误信息通过UDP协议。
SMTPHandler实例发送错误信息到特定的email地址。
SysLogHandler实例发送日志到UNIX syslog服务，并支持远程syslog服务。
NTEventLogHandler实例发送日志到WindowsNT/2000/XP事件日志。
MemoryHandler实例发送日志到内存中的缓冲区，并在达到特定条件时清空。
HTTPHandler实例发送错误信息到HTTP服务器，通过GET或POST方法。

StreamHandler和FileHandler类都是在核心logging模块中定义的。其他handler定义在各个子模块中，叫做logging.handlers。当然还有一个logging.config模块提供了配置功能。
日志信息在输出之前会经过 Formatter 类的格式化。他们在最开始使用%操作符来设置。
批量格式化信息，需要 BufferingFormatter 类。除了格式化字符串之外，它还会在输出信息之前加上其他信息。
当基于logger和handler的级别过滤器仍然不够时，可以使用 Filter 类的实例来添加到logger和handler实例中，通过他们的 addFilter() 方法。当决定输出日志之前，logger和handler会询问过滤器，如果过滤器返回False，则不会显示这条日志。
最简单的过滤器功能用于指定日志的名字。如果使用了这个过滤器，则发送到命名logger和其子logger的日志将会通过，其他的会被丢弃。
除了上面所描述的，还有很多模块级别的函数。如下：
getLogger([name])
返回一个logger，可以指定名字，如果没有指定名字则返回根logger。指定的名字典型的为以点分隔的分层次的名字。选择一个恰当的名字，让别人知道，谁在输出日志。所有使用相同名字调用这个函数都会返回相同的logger实例。这意味着logger实例不需要在应用中到处传递。
getLoggerClass()
返回一个标准的Logger类，或者上次传递到 setLoggerClass() 的类。这个函数用于定义一个新的日志类，但是之前的代码不会受到影响。例如:
class MyLogger(logging.getLoggerClass()):
    #重载一些行为

debug(msg[,*args[,**kwargs]])
记录一个DEBUG级别的日志信息到根logger。 msg 参数就是用于输出的日志， args 参数是用于填入msg字符串的参数，当然kwargs也是差不多的角色。这说明msg可以是一个包含%d、%s等等的待格式化字符串。
在kwargs中有2个参数是必须的： exc_info 如果不为False，则异常产生的信息也会被记录；如果提供了一个异常tuple(以 sys.exc_info() 格式)，则会使用它；否则会调用 sys.exc_info() 来获取异常信息。
另外一个参数为 extra 用于传递一个字典表示 LogRecord 中的 __dict__ 信息，可以加入用户自定义属性。这些传递的参数可以随你喜欢的。例如可能需要传递的:
FORMAT=&quot;%(asctime)-15s %(clientip)s %(user)-8s %(message)s&quot;
logging.basicConfig(format=FORMAT)
dict={'clientip':'192.168.1.1','user':'fbloggs'}
logging.warning(&quot;Protocol problem: %s&quot;,&quot;connection reset&quot;,extra=d)
将会有如下的显示:
2006-02-08 22:20:02,165 192.168.1.1 fbloggs Protocol problem: connection reset
extra字典中的键不会与已有的键相冲突，具体可以参考Formatter的文档中关于使用字典的部分。
在选择字典中的键名时，必须小心一些情况。上面的例子中，已经在待格式化字符串中有’clientip’和’user’了，这时如果没有传递这两个键，则不会输出日志，因为出现了异常了。这种情况时，你必须要传递这2个键。
出于这种复杂性，这种功能往往用在很特殊的地方，比如多线程服务器，或关心多种信息的上下文环境，例如远程IP和登录用户。在这些情况中，需要先指定Formatter实例。 extra 参数从2.5版本开始加入。
info(msg[,*args[,**kwargs]])
记录INFO级别的日志信息，其他参数同debug()。
warning(msg[,*args[,**kwargs]])
记录WARNING级别的日志信息，其他参数同debug()。
error(msg[,*args[,**kwargs]])
记录ERROR级别的日志信息，其他参数同debug()。
critical(msg[,*args[,**kwargs]])
记录CRITICAL级别的日志信息，其他参数同debug()。
exception(msg[,*args])
记录ERROR级别的日志信息，其他参数同debug()。一般用在异常处理中。
log(level,msg[,*args[,**kwargs]])
记录level级别的日志信息，其他参数同debug()。
disable(lvl)
提供一个在logger中禁用某个级别日志的方法，用于应用临时切换可显示的日志。
addLevelName(lvl,levelName)
给级别lvl指定一个名字levelName到内部字典。以后用于映射数字的级别到特定的名字，供给Formatter用来格式化字符串。也可以用于定义自己的级别。这里也是唯一可以注册级别用的地方，级别必须是数字，并且在按照一定的排序要求。
getLevelName(lvl)
返回lvl级别的文字说明。如果级别是CRITICAL、ERROR、WARNING、INFO、DEBUG中的某一个，也会返回对应的名字。如果你自己通过addLevelName()自定义过级别，那么也会返回对应的名字。如果对应级别不存在，则返回 “Level %s”%lvl 这个字符串。
makeLogRecord(attrdict)
创建并返回一个LogRecord实例，并使用attrdict赋值过。这个函数用于把一个LogRecord给pickle过后通过socket发送，并方便接收方重组这个信息。
basicConfig([**kwargs])
对日志系统进行基本配置，使用缺省的StreamHandler和Formatter并添加根logger。一些函数如debug()、info()、warning()、error()、critical()会自动使用basicConfig()配置好的根logger进行日志输出。在2.4版之前，basicConfig()不接受字典参数。
如下是支持的字典参数：



格式
描述


filename
指定FileHandler的文件名，而不是StreamHandler


filemode
打开文件的模式，同open函数中的同名参数，默认为’a’


format
输出格式字符串


datefmt
日期格式


level
设置根logger的日志级别


stream
指定StreamHandler。这个参数与filename冲突，忽略stream



shutdown()
告知日志系统准备关闭日志并将所有信息写入磁盘。
setLoggerClass(klass)
告知日志系统使用类klass作为示例的Logger类。这个类应该定义 __init__() 方法并接受一个参数表示名字，而且 __init__() 方法应该在内部调用Logger.__init__() 方法。这个函数一般在应用自定义Logger的行为时使用。
PEP 282, A Logging System
Original Python logging package
2    各种Handler的子类
 
2.1    TimedRotatingFileHandler
TimedRotatingFileHandler 类是在logging.handler包中，支持对写入到磁盘的日志按照时间间隔来轮询。
class TimedRotatingFileHandler(filename[,when[,interval[,backupCount]]])
返回一个新的TimedRotatingFileHandler类实例，在指定文件名时会自动使用词缀。轮询发生的时间取决于参数 when 和 interval 。
你可以使用 when 来指定 interval 的类型。可选值如下，注意区分大小写：



值
interval的类型


S
秒


M
分钟


H
小时


D
天


W
周


midnight
在午夜



如果 backupCount 为非零，则系统会在旧日志文件名的末尾添加词缀。词缀格式为日期和时间，使用 strftime 格式如 %Y-%m-%d %H:%M:%S 或者依赖于之前的规则。最多会保留 [...]&lt;img src=&quot;http://www1.feedsky.com/t1/367933366/scriptlearn/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/scriptlearn/~8071953/367933366/6139342/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/scriptlearn/367933366/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/scriptlearn/367933366/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>python</category><category>logging</category><pubDate>Sat, 20 Mar 2010 23:50:07 +0800</pubDate><author>scripter</author><comments>http://www.scriptlearn.com/archives/1981#comments</comments><guid isPermaLink="false">http://www.scriptlearn.com/?p=1981</guid><dc:creator>scripter</dc:creator><fs:srclink>http://www.scriptlearn.com/archives/1981</fs:srclink><fs:srcfeed>http://www.scriptlearn.com/feed</fs:srcfeed><fs:itemid>feedsky/scriptlearn/~8071953/367933366/6139342</fs:itemid></item><item><title>python中使用中文</title><link>http://item.feedsky.com/~feedsky/scriptlearn/~8071953/367933367/6139342/1/item.html</link><content:encoded>&lt;p&gt;python的中文问题一直是困扰新手的头疼问题，这篇文章将给你详细地讲解一下这方面的知识。当然，几乎可以确定的是，在将来的版本中，python会彻底解决此问题，不用我们这么麻烦了。&lt;/p&gt;
&lt;p&gt;先来看看python的版本：&lt;/p&gt;
&lt;pre class=&quot;brush:python&quot;&gt;import sys
sys.version
'2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)]'&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;（一）&lt;/strong&gt;&lt;br /&gt;
用记事本创建一个文件ChineseTest.py，默认ANSI：&lt;br /&gt;
&lt;span id=&quot;more-1970&quot;&gt;&lt;/span&gt;
&lt;pre class=&quot;brush:python&quot;&gt;
s = &quot;中文&quot;
print s
&lt;/pre&gt;
&lt;p&gt;测试一下瞧瞧：&lt;br /&gt;
E:\Project\Python\Test&amp;gt;python ChineseTest.py&lt;br /&gt;
  File &amp;#8220;ChineseTest.py&amp;#8221;, line 1&lt;br /&gt;
E:\Project\Python\Test&amp;gt;python ChineseTest.py&lt;br /&gt;
File &amp;#8220;ChineseTest.py&amp;#8221;, line 1&lt;br /&gt;
SyntaxError: Non-ASCII character &amp;#8216;\xd6&amp;#8242; in file ChineseTest.py on line 1, but no encoding declared; see &lt;a href=&quot;http://www.pytho n.org/peps/pep-0263.html&quot;&gt;http://www.python.org/peps/pep-0263.html&lt;/a&gt; for details&lt;/p&gt;
&lt;p&gt;偷偷地把文件编码改成UTF-8：&lt;br /&gt;
E:\Project\Python\Test&amp;gt;python ChineseTest.py&lt;br /&gt;
  File &amp;#8220;ChineseTest.py&amp;#8221;, line 1&lt;/p&gt;
&lt;p&gt;SyntaxError: Non-ASCII character &amp;#8216;\xe4&amp;#8242; in file ChineseTest.py on line 1, but no encoding declared; see &lt;a href=&quot;http://www.python.org/peps/pep-0263.html&quot;&gt;http://www.python.org/peps/pep-0263.html&lt;/a&gt; for details&lt;/p&gt;
&lt;p&gt;无济于事。。。&lt;br /&gt;
既然它提供了网址，那就看看吧。简单地浏览一下，终于知道如果文件里有非ASCII字符，需要在第一行或第二行指定编码声明。把ChineseTest.py文件的编码重新改为ANSI，并加上编码声明：&lt;br /&gt;
# coding=gbk&lt;br /&gt;
s = &amp;#8220;中文&amp;#8221;&lt;br /&gt;
print s&lt;/p&gt;
&lt;p&gt;再试一下：&lt;br /&gt;
E:\Project\Python\Test&amp;gt;python ChineseTest.py&lt;br /&gt;
中文&lt;/p&gt;
&lt;p&gt;正常咯：）&lt;br /&gt;
&lt;strong&gt;（二）&lt;/strong&gt;&lt;br /&gt;
看一看它的长度：&lt;br /&gt;
# coding=gbk&lt;br /&gt;
s = &amp;#8220;中文&amp;#8221;&lt;br /&gt;
print len(s)&lt;br /&gt;
结果：4。&lt;br /&gt;
s这里是str类型，所以计算的时候一个中文相当于两个英文字符，因此长度为4。&lt;br /&gt;
我们这样写:&lt;/p&gt;
&lt;pre class=&quot;brush:python&quot;&gt;
# coding=gbk
s = &quot;中文&quot;
s1 = u&quot;中文&quot;
s2 = unicode(s, &quot;gbk&quot;) #省略参数将用python默认的ASCII来解码
s3 = s.decode(&quot;gbk&quot;) #把str转换成unicode是decode，unicode函数作用与之相同
print len(s1)
print len(s2)
print len(s3)
&lt;/pre&gt;
&lt;p&gt;结果：&lt;br /&gt;
2&lt;br /&gt;
2&lt;br /&gt;
2&lt;br /&gt;
&lt;strong&gt;（三）&lt;/strong&gt;&lt;br /&gt;
接着来看看文件的处理：&lt;br /&gt;
建立一个文件test.txt，文件格式用ANSI，内容为:&lt;br /&gt;
abc中文&lt;br /&gt;
用python来读取&lt;br /&gt;
# coding=gbk&lt;br /&gt;
print open(&amp;#8220;Test.txt&amp;#8221;).read()&lt;br /&gt;
结果：abc中文&lt;br /&gt;
把文件格式改成UTF-8：&lt;br /&gt;
结果：abc涓枃&lt;br /&gt;
显然，这里需要解码：&lt;/p&gt;
&lt;pre class=&quot;brush:python&quot;&gt;
# coding=gbk
import codecs
print open(&quot;Test.txt&quot;).read().decode(&quot;utf-8&quot;)
&lt;/pre&gt;
&lt;p&gt;结果：abc中文&lt;br /&gt;
上面的test.txt我是用Editplus来编辑的，但当我用Windows自带的记事本编辑并存成UTF-8格式时，&lt;br /&gt;
运行时报错：&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
  File &amp;#8220;ChineseTest.py&amp;#8221;, line 3, in &amp;lt;module&amp;gt;&lt;br /&gt;
    print open(&amp;#8220;Test.txt&amp;#8221;).read().decode(&amp;#8220;utf-8&amp;#8243;)&lt;br /&gt;
&lt;span&gt;UnicodeEncodeError&lt;/span&gt;: &amp;#8216;gbk&amp;#8217; codec can&amp;#8217;t encode character u&amp;#8217;\ufeff&amp;#8217; in position 0: illegal multibyte sequence&lt;/p&gt;
&lt;p&gt;原来，某些软件，如notepad，在保存一个以UTF-8编码的文件时，会在文件开始的地方插入三个不可见的字符（0xEF 0xBB 0xBF，即BOM）。&lt;br /&gt;
因此我们在读取时需要自己去掉这些字符，python中的codecs module定义了这个常量：&lt;/p&gt;
&lt;pre class=&quot;brush:python&quot;&gt;
# coding=gbk
import codecs
data = open(&quot;Test.txt&quot;).read()
if data[:3] == codecs.BOM_UTF8:
 data = data[3:]
print data.decode(&quot;utf-8&quot;)
&lt;/pre&gt;
&lt;p&gt;结果：abc中文&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;（四）一点遗留问题&lt;/strong&gt;&lt;br /&gt;
在第二部分中，我们用unicode函数和decode方法把str转换成unicode。为什么这两个函数的参数用&amp;#8221;gbk&amp;#8221;呢？&lt;br /&gt;
第一反应是我们的编码声明里用了gbk(# coding=gbk)，但真是这样？&lt;br /&gt;
修改一下源文件：&lt;/p&gt;
&lt;pre class=&quot;brush:python&quot;&gt;
# coding=utf-8
s = &quot;中文&quot;
print unicode(s, &quot;utf-8&quot;)
&lt;/pre&gt;
&lt;p&gt;运行，报错：&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
  File &amp;#8220;ChineseTest.py&amp;#8221;, line 3, in &amp;lt;module&amp;gt;&lt;br /&gt;
    s = unicode(s, &amp;#8220;utf-8&amp;#8243;)&lt;br /&gt;
UnicodeDecodeError: &amp;#8216;utf8&amp;#8242; codec can&amp;#8217;t decode bytes in position 0-1: invalid data&lt;br /&gt;
显然，如果前面正常是因为两边都使用了gbk，那么这里我保持了两边utf-8一致，也应该正常，不至于报错。&lt;br /&gt;
更进一步的例子，如果我们这里转换仍然用gbk：&lt;/p&gt;
&lt;pre class=&quot;brush:python&quot;&gt;
# coding=utf-8
s = &quot;中文&quot;
print unicode(s, &quot;gbk&quot;)
&lt;/pre&gt;
&lt;p&gt;结果：中文&lt;br /&gt;
翻阅了一篇英文资料，它大致讲解了python中的print原理：&lt;br /&gt;
When Python executes a print statement, it simply passes the output to the operating system (using fwrite() or something like it), and some other program is responsible for actually displaying that output on the screen. For example, on Windows, it might be the Windows console subsystem that displays the result. Or if you&amp;#8217;re using Windows and running Python on a Unix box somewhere else, your Windows SSH client is actually responsible for displaying the data. If you are running Python in an xterm on Unix, then xterm and your X server handle the display. &amp;lt;&amp;gt;&lt;/p&gt;
&lt;p&gt;To print data reliably, you must know the encoding that this display program expects.&lt;/p&gt;
&lt;p&gt;简单地说，python中的print直接把字符串传递给操作系统，所以你需要把str解码成与操作系统一致的格式。Windows使用CP936(几乎与gbk相同)，所以这里可以使用gbk。&lt;br /&gt;
最后测试：&lt;/p&gt;
&lt;pre class=&quot;brush:python&quot;&gt;
# coding=utf-8
s = &quot;中文&quot;
print unicode(s, &quot;cp936&quot;)
&lt;/pre&gt;
&lt;p&gt;结果：中文&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/367933367/scriptlearn/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/scriptlearn/~8071953/367933367/6139342/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/scriptlearn/367933367/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/scriptlearn/367933367/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.scriptlearn.com/archives/1970/feed</wfw:commentRss><slash:comments>0</slash:comments><description>python的中文问题一直是困扰新手的头疼问题，这篇文章将给你详细地讲解一下这方面的知识。当然，几乎可以确定的是，在将来的版本中，python会彻底解决此问题，不用我们这么麻烦了。
先来看看python的版本：
import sys
sys.version
'2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)]'
（一）
用记事本创建一个文件ChineseTest.py，默认ANSI：


s = &quot;中文&quot;
print s

测试一下瞧瞧：
E:\Project\Python\Test&amp;#62;python ChineseTest.py
  File &amp;#8220;ChineseTest.py&amp;#8221;, line 1
E:\Project\Python\Test&amp;#62;python ChineseTest.py
File &amp;#8220;ChineseTest.py&amp;#8221;, line 1
SyntaxError: Non-ASCII character &amp;#8216;\xd6&amp;#8242; in file ChineseTest.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
偷偷地把文件编码改成UTF-8：
E:\Project\Python\Test&amp;#62;python ChineseTest.py
  File &amp;#8220;ChineseTest.py&amp;#8221;, line 1
SyntaxError: Non-ASCII character &amp;#8216;\xe4&amp;#8242; in file ChineseTest.py on line 1, [...]&lt;img src=&quot;http://www1.feedsky.com/t1/367933367/scriptlearn/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/scriptlearn/~8071953/367933367/6139342/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/scriptlearn/367933367/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/scriptlearn/367933367/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>编码</category><category>python</category><pubDate>Sat, 20 Mar 2010 23:17:38 +0800</pubDate><author>scripter</author><comments>http://www.scriptlearn.com/archives/1970#comments</comments><guid isPermaLink="false">http://www.scriptlearn.com/?p=1970</guid><dc:creator>scripter</dc:creator><fs:srclink>http://www.scriptlearn.com/archives/1970</fs:srclink><fs:srcfeed>http://www.scriptlearn.com/feed</fs:srcfeed><fs:itemid>feedsky/scriptlearn/~8071953/367933367/6139342</fs:itemid></item><item><title>python String和PyQt QString的区别</title><link>http://item.feedsky.com/~feedsky/scriptlearn/~8071953/367933368/6139342/1/item.html</link><content:encoded>&lt;p&gt;以下在python2.5和PyQt4.4.6 for python2.5环境下讨论。&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: large;&quot;&gt;1.在python中有两种与字符有关的类型：string object和Unicode object。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;    平时进行输入输出的一般都用string object，当需要显示一些特殊字符或者中文等文字时候，需要转换为Unicode编码。在PyQt中也有两种字符类型与上面两者对应：QByteArray和QString，主要是使用QString操作数据。&lt;br /&gt;
&lt;span id=&quot;more-1943&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;strong&gt;1.&lt;/strong&gt; python string object可以理解为一个接一个字节的字节组，至于表示什么编码，与表示文字有关，比如“python string”，“中文”。注意它是有不同编码区分的。&lt;br /&gt;
PyQt中与之对应的是QbyteArray，而不是Qstring。&lt;/p&gt;
&lt;p&gt;A built-in string object (plain or Unicode) is a sequence of characters used to store and represent text-based information (plain strings are also sometimes used to store and represent arbitrary sequences of binary bytes). （摘自《Python in a NutShell》）&lt;/p&gt;
&lt;p&gt;QByteArray can be used to store both raw bytes (including &amp;#8216;&amp;#8221;0&amp;#8217;s) and traditional 8-bit &amp;#8216;&amp;#8221;0&amp;#8242;-terminated.（摘自《PyQt手册》）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2）&lt;/strong&gt;Python Unicode object可以理解为固定使用utf-16编码的字节组，其中英文和中文都使用两个字节（16位）来表示，如：u&amp;#8221;Python Unicode object&amp;#8221;、u&amp;#8221;中文&amp;#8221;。&lt;br /&gt;
PyQt中与之对应的就是QString了。&lt;/p&gt;
&lt;p&gt;Unicode string literals have the same syntax as other string literals, with a u or U immediately before the leading quote. （摘自《Python in a NutShell》）&lt;/p&gt;
&lt;p&gt;Qt also provides the QString class to store string data. It stores 16-bit Unicode characters, making it easy to store non-ASCII/non-Latin-1 characters in your application.（摘自《PyQt手册》）&lt;br /&gt;
QString stores a string of 16-bit QChars, where each QChar corresponds one Unicode 4.0 character.（摘自《PyQt手册》）&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: large;&quot;&gt;2 PyQt内部类型转换&lt;/span&gt;&lt;br /&gt;
QString有 toAscii()、toUtf8()函数转换为QByteArray类型，（这个基本不用，因为很少直接用QByteArray类型）有__init__ (self, QByteArray a)函数将QByteArray类型转为QString。&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: large;&quot;&gt;3. Python string object和Python Unicode object相互转换&lt;/span&gt;&lt;br /&gt;
&lt;strong&gt;1&lt;/strong&gt;）Python string object是原始编码是有区分的，通过 decode(&amp;#8216;原始编码&amp;#8217;) 函数解码得到通用utf16编码即Python Unicode object。&lt;/p&gt;
&lt;pre class=&quot;brush:python&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&quot;python string&quot;.decode('ascii')
或者
&amp;gt;&amp;gt;&amp;gt;&quot;python string&quot;.decode()&lt;/pre&gt;
&lt;p&gt;得到 u&amp;#8221;python string&amp;#8221;&lt;br /&gt;
因为默认按ascii解码。&lt;/p&gt;
&lt;pre class=&quot;brush:python&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&quot;中文&quot;.decode('gbk')&lt;/pre&gt;
&lt;p&gt;得到 u&amp;#8221;&quot;u4e2d&amp;#8221;u6587&amp;#8243; ，打印出来就是 中文 二字。(注意结果是2字节一组，共两组，对应两个汉字)&lt;br /&gt;
又：&amp;#8221;python string&amp;#8221;.decode(&amp;#8216;gkb&amp;#8217;) ，即按汉字来解码，也可以得到 u&amp;#8221;python string&amp;#8221;，因为gbk编码也支持英文字母；&lt;br /&gt;
但是&amp;#8221;中文&amp;#8221;.decode(&amp;#8216;ascii&amp;#8217;) 即按ascii解码是错误的，因为ascii编码不支持汉字！&lt;/p&gt;
&lt;pre class=&quot;brush:python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &quot;dfdf&quot;.decode()
u'dfdf'
&amp;gt;&amp;gt;&amp;gt; &quot;dfdf&quot;.decode(&quot;ascii&quot;)
u'dfdf'
&amp;gt;&amp;gt;&amp;gt; &quot;dfdf&quot;.decode(&quot;gbk&quot;)
u'dfdf'
&amp;gt;&amp;gt;&amp;gt; &quot;中文&quot;.decode(&quot;gbk&quot;)
u'&quot;u4e2d&quot;u6587'
&amp;gt;&amp;gt;&amp;gt;print &quot;中文&quot;.decode(&quot;gbk&quot;)
中文
&amp;gt;&amp;gt;&amp;gt; &quot;中文&quot;.decode(&quot;gb2312&quot;)
u'&quot;u4e2d&quot;u6587'
&amp;gt;&amp;gt;&amp;gt; &quot;中文&quot;.decode(&quot;ascii&quot;)&lt;/pre&gt;
&lt;p&gt;Traceback (most recent call last):&lt;br /&gt;
File &amp;#8220;&amp;#8221;, line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;
UnicodeDecodeError: &amp;#8216;ascii&amp;#8217; codec can&amp;#8217;t decode byte 0xd6 in position 0: ordinal not in range(128)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2）&lt;/strong&gt;Python Unicode object原始编码固定是utf16，通过 encode(&amp;#8216;目的编码&amp;#8217;) 编码来得到Python string object。&lt;/p&gt;
&lt;pre class=&quot;brush:python&quot;&gt;&amp;gt;&amp;gt;&amp;gt;u&quot;unicode string&quot;.encode()
或者
&amp;gt;&amp;gt;&amp;gt;u&quot;unicode string&quot;.encode('ascii')
得到
'unicode string'，默认目的编码为ascii。
&amp;gt;&amp;gt;&amp;gt;u&quot;中文&quot;.encode(&quot;gbk&quot;)
得到'&quot;xd4&quot;xd0&quot;xce&quot;xc4'，打印出来就是 中文。(注意结果是1字节一组，共4组)

&amp;gt;&amp;gt;&amp;gt; u&quot;sdff&quot;.encode()
'sdff'
&amp;gt;&amp;gt;&amp;gt; u&quot;sdff&quot;.encode('ascii')
'sdff'
&amp;gt;&amp;gt;&amp;gt; u&quot;sdff&quot;.encode('gbk')
'sdff'
&amp;gt;&amp;gt;&amp;gt; u&quot;sdff&quot;.encode('gb2312')
'sdff'
&amp;gt;&amp;gt;&amp;gt; u&quot;中文&quot;.encode('gbk')
'&quot;xd6&quot;xd0&quot;xce&quot;xc4'
&amp;gt;&amp;gt;&amp;gt; print u&quot;中文&quot;.encode('gbk')
中文
&amp;gt;&amp;gt;&amp;gt; u&quot;中文&quot;.encode('ascii')&lt;/pre&gt;
&lt;p&gt;Traceback (most recent call last):&lt;br /&gt;
File &amp;#8220;&amp;lt;stdin&amp;gt;&amp;#8221;, line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;
UnicodeEncodeError: &amp;#8216;ascii&amp;#8217; codec can&amp;#8217;t encode characters in position 0-1: ordin&lt;br /&gt;
al not in range(128)&lt;br /&gt;
&lt;strong&gt;注意：&lt;/strong&gt;执行&amp;gt;&amp;gt;&amp;gt; u&amp;#8221;中文&amp;#8221;.encode(&amp;#8216;gbk&amp;#8217;)命令需要你的IDE支持gbk编码，在官方shell下执行肯定没问题，但如果你的IDE比如PyWin中文输入异常，则可能报错。&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: large;&quot;&gt;4. Python string object和Python Unicode object向QString的转换。&lt;/span&gt;&lt;br /&gt;
Qt一般不直接操作QByteArray，只需关注Python string object和Python Unicode object向QString的转换。&lt;br /&gt;
很多关于PyQt4的英文书籍说：PyQt函数需要QString参数的地方都可以直接用Python string object或者Python Unicode object，如果非要转换可以直接用QtCore.QString()构造。比如《GUI Programming with PyQt》，再如《PyQt手册》：&lt;/p&gt;
&lt;p&gt;Whenever PyQt expects a QString as a function argument, a Python string object or a Python Unicode object can be provided instead, and PyQt will do the necessary conversion automatically.&lt;/p&gt;
&lt;p&gt;You may also manually convert Python string and Unicode objects to QString instances by using the QString constructor as demonstrated in the following code fragment:&lt;/p&gt;
&lt;p&gt;qs1 = QtCore.QString(&amp;#8220;Converted Python string object&amp;#8221;)&lt;br /&gt;
qs2 = QtCore.QString(u&amp;#8221;Converted Python Unicode object&amp;#8221;)&lt;/p&gt;
&lt;p&gt;但可惜这只适用于英文即ascii编码，对于中文则行不通！&lt;/p&gt;
&lt;p&gt;直接的QString：&lt;/p&gt;
&lt;pre class=&quot;brush:python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; QtCore.QString('中文')
PyQt4.QtCore.QString(u'&quot;xd6&quot;xd0&quot;xce&quot;xc4')
&amp;gt;&amp;gt;&amp;gt; print QtCore.QString('中文')&lt;/pre&gt;
&lt;p&gt;Traceback (most recent call last):&lt;br /&gt;
File &amp;#8220;&amp;lt;stdin&amp;gt;&amp;#8221;, line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;
UnicodeEncodeError: &amp;#8216;ascii&amp;#8217; codec can&amp;#8217;t encode characters in position 0-3: ordinal not in range(128)&lt;/p&gt;
&lt;pre class=&quot;brush:python&quot;&gt;&amp;gt;&amp;gt;&amp;gt;
&amp;gt;&amp;gt;&amp;gt; QtCore.QString(u'中文')
PyQt4.QtCore.QString(u'&quot;u4e2d&quot;u6587')
&amp;gt;&amp;gt;&amp;gt; print QtCore.QString(u'中文')&lt;/pre&gt;
&lt;p&gt;Traceback (most recent call last):&lt;br /&gt;
File &amp;#8220;&amp;lt;stdin&amp;gt;&amp;#8221;, line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;
UnicodeEncodeError: &amp;#8216;ascii&amp;#8217; codec can&amp;#8217;t encode characters in position 0-1: ordinal not in range(128)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
因为它们都是默认按ascii编码转换！&lt;/p&gt;
&lt;p&gt;GUI编程：&lt;br /&gt;
可以创建一个QTextEdit对象myTextEdit， 检验：&lt;br /&gt;
myTextEdit.append(&amp;#8220;中文&amp;#8221;)&lt;br /&gt;
或者&lt;br /&gt;
myTextEdit.append(u&amp;#8221;中文&amp;#8221;)&lt;br /&gt;
或者&lt;br /&gt;
myTextEdit.append(QtCore.QString(&amp;#8216;中文&amp;#8217;))&lt;br /&gt;
或者&lt;br /&gt;
myTextEdit.append(QtCore.QString(u&amp;#8217;中文&amp;#8217;))&lt;br /&gt;
你会发现显示都是乱码&amp;#8230;因为它们都是默认按ascii编码进行内部转换得到QString相应utf16编码的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决方法是:&lt;/strong&gt;&lt;br /&gt;
利用unicode()函数显示指定gb2312编码进行中文编码转换，转换后的Python Unicode object则是可以直接作为QString参数代入用的:&lt;/p&gt;
&lt;pre class=&quot;brush:python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; unicode('中文', 'gb2312', 'ignore')
u'&quot;u4e2d&quot;u6587'
&amp;gt;&amp;gt;&amp;gt; print unicode('中文', 'gb2312', 'ignore')
中文
&amp;gt;&amp;gt;&amp;gt;

myTextEdit.append(unicode('中文', 'gb2312', 'ignore'))
#用以替代myTextEdit.append(u&quot;中文&quot;)
或者多此一举下：
myTextEdit.append(QtCore.QString(unicode('中文', 'gb2312', 'ignore')))
#用以替代myTextEdit.append(QtCore.QString(u'中文'))&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;font-size: large;&quot;&gt;5. QString向Python string object和Python Unicode object的转换。&lt;/span&gt;&lt;br /&gt;
Python中需要用Python string object和Python Unicode object的地方可就不一定可以直接用QString了!!!&lt;br /&gt;
QString向Python string object转换可以理解，因为编码不同。&lt;br /&gt;
QString向Python Unicode object的转换？需要转换吗？不都是utf16编码吗？&lt;br /&gt;
QString是tuf16编码，但是它的实现并非Python Unicode object那样直接的utf16码，而实际是一个QChar串，每个QChar才对应unicode符，所以地位相当但并不相同。&lt;br /&gt;
许多英文书籍写到：可以使用str()函数直接将QString转换为Python string object，可以使用unicode()直接将QString转换为Python Unicode object。如《PyQt手册》：&lt;/p&gt;
&lt;p&gt;In order to convert a QString to a Python string object use the Python str() builtin. Applying str() to a null QString and an empty QString both result in an empty Python string object.&lt;/p&gt;
&lt;p&gt;In order to convert a QString to a Python Unicode object use the Python unicode() builtin. Applying unicode() to a null QString and an empty QString both result in an empty Python Unicode object.&lt;/p&gt;
&lt;p&gt;但同样只适用于英文，具体见下面分别分析。&lt;br /&gt;
1）QString向Python Unicode object的转换。&lt;/p&gt;
&lt;pre class=&quot;brush:python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; from PyQt4 import QtGui, QtCore
&amp;gt;&amp;gt;&amp;gt; unicode(QtCore.QString('def'))
u'def'
&amp;gt;&amp;gt;&amp;gt; print unicode(QtCore.QString('def'))
def&lt;/pre&gt;
&lt;p&gt;对于中文，unicode()必须要指定编码后有效。（这样也只针对直接的QString有效？对于Qt GUI编程中，从QWidget取得的QString无效？）&lt;/p&gt;
&lt;pre class=&quot;brush:python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; from PyQt4 import QtGui, QtCore
&amp;gt;&amp;gt;&amp;gt; unicode(QtCore.QString('中文'))
u'&quot;xd6&quot;xd0&quot;xce&quot;xc4'
&amp;gt;&amp;gt;&amp;gt; print unicode(QtCore.QString('中文'))&lt;/pre&gt;
&lt;p&gt;Traceback (most recent call last):&lt;br /&gt;
File &amp;#8220;&amp;lt;stdin&amp;gt;&amp;#8221;, line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;
UnicodeEncodeError: &amp;#8216;gbk&amp;#8217; codec can&amp;#8217;t encode character u&amp;#8217;&amp;#8221;xd6&amp;#8242; in position 0: il&lt;br /&gt;
legal multibyte sequence&lt;/p&gt;
&lt;p&gt;指定原始编码后：&lt;/p&gt;
&lt;pre class=&quot;brush:python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; unicode(QtCore.QString('中文'),'gbk','ignore')
u'&quot;u4e2d&quot;u6587'
&amp;gt;&amp;gt;&amp;gt; print unicode(QtCore.QString('中文'),'gbk','ignore')
中文 TEST&lt;/pre&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/367933368/scriptlearn/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/scriptlearn/~8071953/367933368/6139342/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/scriptlearn/367933368/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/scriptlearn/367933368/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.scriptlearn.com/archives/1943/feed</wfw:commentRss><slash:comments>0</slash:comments><description>以下在python2.5和PyQt4.4.6 for python2.5环境下讨论。
1.在python中有两种与字符有关的类型：string object和Unicode object。
    平时进行输入输出的一般都用string object，当需要显示一些特殊字符或者中文等文字时候，需要转换为Unicode编码。在PyQt中也有两种字符类型与上面两者对应：QByteArray和QString，主要是使用QString操作数据。

1. python string object可以理解为一个接一个字节的字节组，至于表示什么编码，与表示文字有关，比如“python string”，“中文”。注意它是有不同编码区分的。
PyQt中与之对应的是QbyteArray，而不是Qstring。
A built-in string object (plain or Unicode) is a sequence of characters used to store and represent text-based information (plain strings are also sometimes used to store and represent arbitrary sequences of binary bytes). （摘自《Python in a NutShell》）
QByteArray can be used to store both raw bytes [...]&lt;img src=&quot;http://www1.feedsky.com/t1/367933368/scriptlearn/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/scriptlearn/~8071953/367933368/6139342/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/scriptlearn/367933368/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/scriptlearn/367933368/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>编码</category><category>字符串</category><category>python</category><pubDate>Sat, 20 Mar 2010 20:59:14 +0800</pubDate><author>scripter</author><comments>http://www.scriptlearn.com/archives/1943#comments</comments><guid isPermaLink="false">http://www.scriptlearn.com/?p=1943</guid><dc:creator>scripter</dc:creator><fs:srclink>http://www.scriptlearn.com/archives/1943</fs:srclink><fs:srcfeed>http://www.scriptlearn.com/feed</fs:srcfeed><fs:itemid>feedsky/scriptlearn/~8071953/367933368/6139342</fs:itemid></item></channel></rss>