<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_HCBin</title><subtitle type="text">走在將來的未來</subtitle><id>http://feed.cnblogs.com/blog/u/66770/rss</id><updated>2012-04-18T07:26:55Z</updated><author><name>炎峰森林影</name><uri>http://www.cnblogs.com/hcbin/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hcbin/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/66770/rss"/><entry><id>http://www.cnblogs.com/hcbin/archive/2012/03/26/2417355.html</id><title type="text">[c++] - 实现类似printf这样的函数</title><summary type="text">来源：http://www.vimer.cn/2009/12/cc%E5%AE%9E%E7%8E%B0%E5%A4%9A%E5%8F%82%E6%95%B0%E5%87%BD%E6%95%B0%E7%BC%96%E7%A8%8B.html在C/C++中，我们经常会需要实现类似printf这样的函数，即函数的参数个数是不定的，这个时候就需要用到我们这篇文章讲到的方法啦。首先，我们要知道这种函数，如何来定义。比如我想实现一个函数能够支持 fun("%d",1);那么这个函数的定义实际上如下：void fun(const char *fmt, ...);其中...的意思是说参数无</summary><published>2012-03-26T00:57:00Z</published><updated>2012-03-26T00:57:00Z</updated><author><name>炎峰森林影</name><uri>http://www.cnblogs.com/hcbin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hcbin/archive/2012/03/26/2417355.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hcbin/archive/2012/03/26/2417355.html"/><content type="html">&lt;p&gt;来源：&lt;a href="http://www.vimer.cn/2009/12/cc%E5%AE%9E%E7%8E%B0%E5%A4%9A%E5%8F%82%E6%95%B0%E5%87%BD%E6%95%B0%E7%BC%96%E7%A8%8B.html"&gt;http://www.vimer.cn/2009/12/cc%E5%AE%9E%E7%8E%B0%E5%A4%9A%E5%8F%82%E6%95%B0%E5%87%BD%E6%95%B0%E7%BC%96%E7%A8%8B.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;在C/C++中，我们经常会需要实现类似printf这样的函数，即函数的参数个数是不定的，这个时候就需要用到我们这篇文章讲到的方法啦。&lt;br /&gt;首先，我们要知道这种函数，如何来定义。比如我想实现一个函数能够支持 fun("%d",1);&lt;br /&gt;那么这个函数的定义实际上如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; fun(&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; *fmt, ...);&lt;/div&gt;&lt;p&gt;其中...的意思是说参数无法一一列出，所以用...代替，至于怎么解，我们稍后再说。&lt;br /&gt;比较特殊的一点是，如果你希望将上面的函数定义成一个宏，那么这个宏可以这样写：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;#define&lt;/span&gt; FUN(fmt, args...)    fun(fmt, ##args)&lt;/div&gt;&lt;p&gt;又假设你希望宏能够自动加上换行符，那么可以这样写：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;#define&lt;/span&gt; FUN(fmt, args...)    fun(fmt"\n", ##args)&lt;/div&gt;&lt;p&gt;OK，那么函数定义的问题我们就解决啦，但是怎么来解呢？&lt;br /&gt;C里面提供了va_start,va_arg,va_end这样几个函数，解释如下：&lt;br /&gt;va_start使argp指向第一个可选参数。va_arg返回参数列表中的当前参数并使argp指向参数列表中的下一个参数。va_end把argp指针清为NULL。函数体内可以多次遍历这些参数，但是都必须以va_start开始，并以va_end结尾。&lt;br /&gt;可能只是这样说并不是很清楚，我们举个例子。&lt;br /&gt;1、假设我们现在想要fun实现和printf一样的功能，那么实际上，我们是不需要把所有解析出来的，我们只有把参数原样传给printf即可，代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; fun(&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* fmt,...)&lt;br /&gt;{&lt;br /&gt;    va_list ap;&lt;br /&gt;    va_start(ap, fmt);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;将ap指向fmt后的第一个参数&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    vfprintf(stderr,fmt,ap);&lt;br /&gt;    va_end(ap);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;将ap置为NULL&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;/div&gt;&lt;p&gt;2、假设我们现在是要将传入的参数都取出来，那么我们就要用到va_arg了，代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; fun(&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* fmt,...)&lt;br /&gt;{&lt;br /&gt;    va_list ap;&lt;br /&gt;    va_start(ap, fmt);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;将ap指向fmt后的第一个参数&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; value = va_arg(ap,&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;前提是我们知道第一个参数是int型；指针指向下一个参数 &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;value[%d]\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,value);&lt;br /&gt;    va_end(ap);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;将ap置为NULL&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;/div&gt;&lt;p&gt;其实到这里大家也就不难发现，我们如何能遍历所有的参数了，只要规定好最后一个参数为一个特殊字符，比如说-1，然后判断到这个值就停止就行&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; fun(&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* fmt,...)&lt;br /&gt;{&lt;br /&gt;    va_list ap;&lt;br /&gt;    va_start(ap, fmt);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;将ap指向fmt后的第一个参数&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; value;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;{&lt;br /&gt;        value = va_arg(ap,&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;前提是我们知道第一个参数是int型；指针指向下一个参数 &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;value[%d]\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,value);&lt;br /&gt;    }&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(value!=-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;br /&gt;    va_end(ap);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;将ap置为NULL&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;/div&gt;&lt;p&gt;OK，到此为止，可变参数的函数编写应该也就很明了啦~&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hcbin/aggbug/2417355.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hcbin/archive/2012/03/26/2417355.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hcbin/archive/2012/03/01/2375067.html</id><title type="text">[C#,Java,PHP] - IMAP文件夹名称编码和解码方法</title><summary type="text">[C#] 来源：http://www.oschina.net/code/snippet_110991_2237// 编码private string IMAPEncode(string folder){ string rtn = "", base64; int index = 0; Regex regAsis = new Regex(@"\G(?:[\x20-\x25\x27-\x7e])+"); Regex reg26 = new Regex(@"\G&amp;"); Regex regEncode = new Regex(@&amp;qu</summary><published>2012-03-01T01:57:00Z</published><updated>2012-03-01T01:57:00Z</updated><author><name>炎峰森林影</name><uri>http://www.cnblogs.com/hcbin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hcbin/archive/2012/03/01/2375067.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hcbin/archive/2012/03/01/2375067.html"/><content type="html">&lt;p&gt;[C#] 来源：&lt;a href="http://www.oschina.net/code/snippet_110991_2237" target="_blank"&gt;http://www.oschina.net/code/snippet_110991_2237&lt;/a&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 编码&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; IMAPEncode(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; folder)&lt;br /&gt;{&lt;br /&gt;   &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; rtn = &lt;span style="color: #800000;"&gt;""&lt;/span&gt;, base64;&lt;br /&gt;   &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; index = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;   Regex regAsis = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Regex(&lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\G(?:[\x20-\x25\x27-\x7e])+&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;   Regex reg26 = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Regex(&lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\G&amp;amp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;   Regex regEncode = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Regex(&lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\G(?:[^\x20-\x7e])+&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;   Regex regEq = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Regex(&lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;=+$&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;   Regex regSlash = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Regex(&lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\/&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;   &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt; (index &amp;lt; folder.Length) {&lt;br /&gt;      Match m;&lt;br /&gt;      m = regAsis.Match(folder, index);&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(m.Success)&lt;br /&gt;      {&lt;br /&gt;         index = index + m.Length;&lt;br /&gt;         rtn = rtn + m.Value;&lt;br /&gt;         &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;      }&lt;br /&gt;      m = reg26.Match(folder, index);&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(m.Success)&lt;br /&gt;      {&lt;br /&gt;         index = index + m.Length;&lt;br /&gt;         rtn = rtn + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;amp;-&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;         &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;      }&lt;br /&gt;      m = regEncode.Match(folder, index);&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(m.Success)&lt;br /&gt;      {&lt;br /&gt;         index = index + m.Length;&lt;br /&gt;         base64 = Convert.ToBase64String(Encoding.GetEncoding(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;UTF-16BE&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).GetBytes(m.Value));&lt;br /&gt;         base64 = regEq.Replace(base64, &lt;span style="color: #800000;"&gt;""&lt;/span&gt;);&lt;br /&gt;         base64 = regSlash.Replace(base64, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;,&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;         rtn = rtn + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + base64 + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;-&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;         &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;   &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; rtn;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 解码&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; IMAPDeconde(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; folder)&lt;br /&gt;{&lt;br /&gt;   &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; rtn = &lt;span style="color: #800000;"&gt;""&lt;/span&gt;, base64;&lt;br /&gt;   &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; index = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;   Regex regAsis = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Regex(&lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\G([^&amp;amp;]+)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;   Regex reg26 = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Regex(&lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\G\&amp;amp;-&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;   Regex regDecode = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Regex(&lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\G\&amp;amp;([A-Za-z0-9+,]+)-?&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;   Regex regComma = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Regex(&lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;,&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;   &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt; (index &amp;lt; folder.Length) {&lt;br /&gt;      Match m;&lt;br /&gt;      m = regAsis.Match(folder, index);&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(m.Success)&lt;br /&gt;      {&lt;br /&gt;         index = index + m.Length;&lt;br /&gt;         rtn = rtn + m.Value;&lt;br /&gt;         &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;      }&lt;br /&gt;      m = reg26.Match(folder, index);&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(m.Success)&lt;br /&gt;      {&lt;br /&gt;         index = index + m.Length;&lt;br /&gt;         rtn = rtn + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;         &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;      }&lt;br /&gt;      m = regDecode.Match(folder, index);&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(m.Success)&lt;br /&gt;      {&lt;br /&gt;         index = index + m.Length;&lt;br /&gt;         base64 = m.Value.Substring(&lt;span style="color: #800080;"&gt;1&lt;/span&gt;, m.Value.Length - &lt;span style="color: #800080;"&gt;2&lt;/span&gt;);&lt;br /&gt;         base64 = regComma.Replace(base64, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;         &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; mod = base64.Length % &lt;span style="color: #800080;"&gt;4&lt;/span&gt;;&lt;br /&gt;         &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(mod &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt; ) base64 = base64.PadRight(base64.Length + (&lt;span style="color: #800080;"&gt;4&lt;/span&gt; - mod), &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;=&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;);&lt;br /&gt;         base64 = Encoding.GetEncoding(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;UTF-16BE&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).GetString(Convert.FromBase64String(base64));&lt;br /&gt;         rtn = rtn + base64;&lt;br /&gt;         &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;   &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; rtn;&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;[Java] 来源：&lt;a href="http://grandboy.iteye.com/blog/908887" target="_blank"&gt;http://grandboy.iteye.com/blog/908887&lt;/a&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 编码&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; ImapFolderEncoder {&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; String encode(String folder) {&lt;br /&gt;    String rtn = "", base64;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; index = 0;&lt;br /&gt;    Pattern regAsis = Pattern.compile("\\G(?:[\\x20-\\x25\\x27-\\x7e])+");&lt;br /&gt;    Pattern reg26 = Pattern.compile("\\G&amp;amp;");&lt;br /&gt;    Pattern regEncode = Pattern.compile("\\G(?:[^\\x20-\\x7e])+");&lt;br /&gt;    Pattern regEq = Pattern.compile("=+$");&lt;br /&gt;    Pattern regSlash = Pattern.compile("\\/");&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt; (index &amp;lt; folder.length()) {&lt;br /&gt;        Matcher m;&lt;br /&gt;        m = regAsis.matcher(folder);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (m.find(index)) {&lt;br /&gt;        index = index + (m.end() - m.start());&lt;br /&gt;        rtn = rtn + m.group();&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;        m = reg26.matcher(folder);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (m.find(index)) {&lt;br /&gt;        index = index + (m.end() - m.start());&lt;br /&gt;        rtn = rtn + "&amp;amp;-";&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;        m = regEncode.matcher(folder);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (m.find(index)) {&lt;br /&gt;        index = index + (m.end() - m.start());&lt;br /&gt;        base64 = SimpleUtil.encodeBase64Content(m.group(), "UTF-16BE");&lt;br /&gt;        base64 = base64.replaceAll(regEq.pattern(), "");&lt;br /&gt;        base64 = base64.replaceAll(regSlash.pattern(), ",");&lt;br /&gt;        rtn = rtn + "&amp;amp;" + base64 + "-";&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; rtn;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 解码&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; ImapFolderDecoder {&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; String decode(String folder) {&lt;br /&gt;    String rtn = "", base64;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; index = 0;&lt;br /&gt;    Pattern regAsis = Pattern.compile("\\G([^&amp;amp;]+)");&lt;br /&gt;    Pattern reg26 = Pattern.compile("\\G\\&amp;amp;-");&lt;br /&gt;    Pattern regDecode = Pattern.compile("\\G\\&amp;amp;([A-Za-z0-9+,]+)-?");&lt;br /&gt;    Pattern regComma = Pattern.compile(",");&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt; (index &amp;lt; folder.length()) {&lt;br /&gt;        Matcher m;&lt;br /&gt;        m = regAsis.matcher(folder);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (m.find(index)) {&lt;br /&gt;        index = index + (m.end() - m.start());&lt;br /&gt;        rtn = rtn + m.group();&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;        m = reg26.matcher(folder);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (m.find(index)) {&lt;br /&gt;        index = index + (m.end() - m.start());&lt;br /&gt;        rtn = rtn + "&amp;amp;";&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;        m = regDecode.matcher(folder);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (m.find(index)) {&lt;br /&gt;        index = index + (m.end() - m.start());&lt;br /&gt;        base64 = m.group().substring(1, m.group().length() - 1);&lt;br /&gt;        base64 = base64.replaceAll(regComma.pattern(), "/");&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; mod = base64.length() % 4;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; count = 4 - mod;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt; (count &amp;gt; 0) {&lt;br /&gt;            base64 += "=";&lt;br /&gt;            count--;&lt;br /&gt;        }&lt;br /&gt;        base64 = SimpleUtil.base64Decode(base64, "UTF-16BE");&lt;br /&gt;        rtn = rtn + base64;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; rtn;&lt;br /&gt;    }&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;[PHP] 来源：从上面C#的代码翻译过来&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 编码&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; IMAPEncode(&lt;span style="color: #800080;"&gt;$sStr&lt;/span&gt;)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #800080;"&gt;$sOut&lt;/span&gt; = '';&lt;br /&gt;    &lt;span style="color: #800080;"&gt;$sBase64&lt;/span&gt; = '';&lt;br /&gt;    &lt;span style="color: #800080;"&gt;$nIndex&lt;/span&gt; = 0;&lt;br /&gt;    &lt;span style="color: #800080;"&gt;$sRegAsis&lt;/span&gt; = '/^(?:[\x20-\x25\x27-\x7e])+/';&lt;br /&gt;    &lt;span style="color: #800080;"&gt;$sReg26&lt;/span&gt; = '/^&amp;amp;/';&lt;br /&gt;    &lt;span style="color: #800080;"&gt;$sRegEncode&lt;/span&gt; = '/^(?:[^\x20-\x7e])+/';&lt;br /&gt;    &lt;span style="color: #800080;"&gt;$sRegEq&lt;/span&gt; = '/=+$/';&lt;br /&gt;    &lt;span style="color: #800080;"&gt;$sRegSlash&lt;/span&gt; = '/\//';&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt; (&lt;span style="color: #800080;"&gt;$nIndex&lt;/span&gt; &amp;lt; &lt;span style="color: #008080;"&gt;strlen&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$sStr&lt;/span&gt;))&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #800080;"&gt;$aTmp&lt;/span&gt; = &lt;span style="color: #0000ff;"&gt;array&lt;/span&gt;();&lt;br /&gt;        &lt;span style="color: #800080;"&gt;$nResult&lt;/span&gt; = &lt;span style="color: #008080;"&gt;preg_match&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$sRegAsis&lt;/span&gt;, &lt;span style="color: #800080;"&gt;$sStr&lt;/span&gt;, &amp;amp;&lt;span style="color: #800080;"&gt;$aTmp&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;, &lt;span style="color: #800080;"&gt;$nIndex&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #800080;"&gt;$nResult&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #800080;"&gt;$nIndex&lt;/span&gt; += &lt;span style="color: #008080;"&gt;strlen&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$aTmp&lt;/span&gt;[0]);&lt;br /&gt;            &lt;span style="color: #800080;"&gt;$sOut&lt;/span&gt; .= &lt;span style="color: #800080;"&gt;$aTmp&lt;/span&gt;[0];&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #800080;"&gt;$nResult&lt;/span&gt; = &lt;span style="color: #008080;"&gt;preg_match&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$sReg26&lt;/span&gt;, &lt;span style="color: #800080;"&gt;$sStr&lt;/span&gt;, &amp;amp;&lt;span style="color: #800080;"&gt;$aTmp&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;, &lt;span style="color: #800080;"&gt;$nIndex&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #800080;"&gt;$nResult&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #800080;"&gt;$nIndex&lt;/span&gt; += &lt;span style="color: #008080;"&gt;strlen&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$aTmp&lt;/span&gt;[0]);&lt;br /&gt;            &lt;span style="color: #800080;"&gt;$sOut&lt;/span&gt; .= '&amp;amp;-';&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #800080;"&gt;$nResult&lt;/span&gt; = &lt;span style="color: #008080;"&gt;preg_match&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$sRegEncode&lt;/span&gt;, &lt;span style="color: #800080;"&gt;$sStr&lt;/span&gt;, &amp;amp;&lt;span style="color: #800080;"&gt;$aTmp&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;, &lt;span style="color: #800080;"&gt;$nIndex&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #800080;"&gt;$nResult&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #800080;"&gt;$nIndex&lt;/span&gt; += &lt;span style="color: #008080;"&gt;strlen&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$aTmp&lt;/span&gt;[0]);&lt;br /&gt;            &lt;span style="color: #800080;"&gt;$sBase64&lt;/span&gt; = &lt;span style="color: #008080;"&gt;base64_encode&lt;/span&gt;(&lt;span style="color: #008080;"&gt;iconv&lt;/span&gt;('UTF-8', 'UTF-16BE', &lt;span style="color: #800080;"&gt;$aTmp&lt;/span&gt;[0]));&lt;br /&gt;            &lt;span style="color: #800080;"&gt;$sBase64&lt;/span&gt; = &lt;span style="color: #008080;"&gt;preg_replace&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$sRegEq&lt;/span&gt;, '', &lt;span style="color: #800080;"&gt;$sBase64&lt;/span&gt;);&lt;br /&gt;            &lt;span style="color: #800080;"&gt;$sBase64&lt;/span&gt; = &lt;span style="color: #008080;"&gt;preg_replace&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$sRegSlash&lt;/span&gt;, ',', &lt;span style="color: #800080;"&gt;$sBase64&lt;/span&gt;);&lt;br /&gt;            &lt;span style="color: #800080;"&gt;$sOut&lt;/span&gt; .= '&amp;amp;' . &lt;span style="color: #800080;"&gt;$sBase64&lt;/span&gt; . '-';&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;$sOut&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 解码&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; IMAPDeconde(&lt;span style="color: #800080;"&gt;$sStr&lt;/span&gt;)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #800080;"&gt;$sOut&lt;/span&gt; = '';&lt;br /&gt;    &lt;span style="color: #800080;"&gt;$sBase64&lt;/span&gt; = '';&lt;br /&gt;    &lt;span style="color: #800080;"&gt;$nIndex&lt;/span&gt; = 0;&lt;br /&gt;    &lt;span style="color: #800080;"&gt;$sRegAsis&lt;/span&gt; = '/^([^&amp;amp;]+)/';&lt;br /&gt;    &lt;span style="color: #800080;"&gt;$sReg26&lt;/span&gt; = '/^\&amp;amp;-/';&lt;br /&gt;    &lt;span style="color: #800080;"&gt;$sRegDecode&lt;/span&gt; = '/^\&amp;amp;([A-Za-z0-9+,]+)-?/';&lt;br /&gt;    &lt;span style="color: #800080;"&gt;$sRegComma&lt;/span&gt; = '/,/';&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt; (&lt;span style="color: #800080;"&gt;$nIndex&lt;/span&gt; &amp;lt; &lt;span style="color: #008080;"&gt;strlen&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$sStr&lt;/span&gt;))&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #800080;"&gt;$aTmp&lt;/span&gt; = &lt;span style="color: #0000ff;"&gt;array&lt;/span&gt;();&lt;br /&gt;        &lt;span style="color: #800080;"&gt;$nResult&lt;/span&gt; = &lt;span style="color: #008080;"&gt;preg_match&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$sRegAsis&lt;/span&gt;, &lt;span style="color: #800080;"&gt;$sStr&lt;/span&gt;, &amp;amp;&lt;span style="color: #800080;"&gt;$aTmp&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;, &lt;span style="color: #800080;"&gt;$nIndex&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #800080;"&gt;$nResult&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #800080;"&gt;$nIndex&lt;/span&gt; += &lt;span style="color: #008080;"&gt;strlen&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$aTmp&lt;/span&gt;[0]);&lt;br /&gt;            &lt;span style="color: #800080;"&gt;$sOut&lt;/span&gt; .= &lt;span style="color: #800080;"&gt;$aTmp&lt;/span&gt;[0];&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #800080;"&gt;$nResult&lt;/span&gt; = &lt;span style="color: #008080;"&gt;preg_match&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$sReg26&lt;/span&gt;, &lt;span style="color: #800080;"&gt;$sStr&lt;/span&gt;, &amp;amp;&lt;span style="color: #800080;"&gt;$aTmp&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;, &lt;span style="color: #800080;"&gt;$nIndex&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #800080;"&gt;$nResult&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #800080;"&gt;$nIndex&lt;/span&gt; += &lt;span style="color: #008080;"&gt;strlen&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$aTmp&lt;/span&gt;[0]);&lt;br /&gt;            &lt;span style="color: #800080;"&gt;$sOut&lt;/span&gt; .= '&amp;amp;';&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #800080;"&gt;$nResult&lt;/span&gt; = &lt;span style="color: #008080;"&gt;preg_match&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$sRegDecode&lt;/span&gt;, &lt;span style="color: #800080;"&gt;$sStr&lt;/span&gt;, &amp;amp;&lt;span style="color: #800080;"&gt;$aTmp&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;, &lt;span style="color: #800080;"&gt;$nIndex&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #800080;"&gt;$nResult&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #800080;"&gt;$nIndex&lt;/span&gt; += &lt;span style="color: #008080;"&gt;strlen&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$aTmp&lt;/span&gt;[0]);&lt;br /&gt;            &lt;span style="color: #800080;"&gt;$sBase64&lt;/span&gt; = &lt;span style="color: #008080;"&gt;substr&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$aTmp&lt;/span&gt;[0], 1, &lt;span style="color: #008080;"&gt;strlen&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$aTmp&lt;/span&gt;[0]) - 2);&lt;br /&gt;            &lt;span style="color: #800080;"&gt;$sBase64&lt;/span&gt; = &lt;span style="color: #008080;"&gt;preg_replace&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$sRegComma&lt;/span&gt;, '/', &lt;span style="color: #800080;"&gt;$sBase64&lt;/span&gt;);&lt;br /&gt;            &lt;span style="color: #800080;"&gt;$nMod&lt;/span&gt; = &lt;span style="color: #008080;"&gt;strlen&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$sBase64&lt;/span&gt;) % 4;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #800080;"&gt;$nMod&lt;/span&gt; &amp;gt; 0) &lt;span style="color: #800080;"&gt;$sBase64&lt;/span&gt; .= &lt;span style="color: #008080;"&gt;str_repeat&lt;/span&gt;('=', 4 - &lt;span style="color: #800080;"&gt;$nMod&lt;/span&gt;);&lt;br /&gt;            &lt;span style="color: #800080;"&gt;$sBase64&lt;/span&gt; = &lt;span style="color: #008080;"&gt;iconv&lt;/span&gt;('UTF-16BE', 'UTF-8', &lt;span style="color: #008080;"&gt;base64_decode&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$sBase64&lt;/span&gt;));&lt;br /&gt;            &lt;span style="color: #800080;"&gt;$sOut&lt;/span&gt; .= &lt;span style="color: #800080;"&gt;$sBase64&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;$sOut&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hcbin/aggbug/2375067.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hcbin/archive/2012/03/01/2375067.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hcbin/archive/2012/02/28/2371578.html</id><title type="text">[jQuery] - jSrcollable</title><summary type="text">jquery.jsrcollable.js/********************************************************************* * * Function Name : jQuery.fn.jSrcollable * * Description : * * * Parameters : * wrapper[string] : jQuery的容器选择器 * edge[int] : 留出的空白边距 * * Demo : * &lt;div id="wrapper" style="width:200px; heigh</summary><published>2012-02-28T06:59:00Z</published><updated>2012-02-28T06:59:00Z</updated><author><name>炎峰森林影</name><uri>http://www.cnblogs.com/hcbin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hcbin/archive/2012/02/28/2371578.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hcbin/archive/2012/02/28/2371578.html"/><content type="html">&lt;p&gt;jquery.jsrcollable.js&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;********************************************************************&lt;br /&gt; *&lt;br /&gt; * Function Name : jQuery.fn.jSrcollable&lt;br /&gt; *&lt;br /&gt; * Description :&lt;br /&gt; *     &lt;br /&gt; *&lt;br /&gt; * Parameters :&lt;br /&gt; *     wrapper[string] : jQuery的容器选择器&lt;br /&gt; *     edge[int] : 留出的空白边距&lt;br /&gt; *&lt;br /&gt; * Demo :&lt;br /&gt; *     &amp;lt;div id="wrapper" style="width:200px; height:200px; border:solid 1px #000;"&amp;gt;&lt;br /&gt; *       &amp;lt;div style="width:500px; height:500px; border:solid 5px #36C;"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt; *     &amp;lt;/div&amp;gt;&lt;br /&gt; * &lt;br /&gt; *     &amp;lt;script type= "text/javascript"&amp;gt;&lt;br /&gt; *       jQuery(document).ready(function(jQuery){&lt;br /&gt; *           jQuery.fn.jSrcollable("#wrapper", 5);&lt;br /&gt; *       });&lt;br /&gt; *     &amp;lt;/script&amp;gt;&lt;br /&gt; *&lt;br /&gt; ********************************************************************&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;jQuery.noConflict();&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; jSrcollable = {&lt;br /&gt;    move: &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(wrapper, edge) {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; wrapper = jQuery(wrapper);&lt;br /&gt;        wrapper.css({overflow: 'hidden'});&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 获取最宽对象&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; maxWidth = wrapper.width();&lt;br /&gt;        wrapper.children().each(&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(){&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(maxWidth &amp;lt; jQuery(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;).outerWidth(&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;)) maxWidth = jQuery(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;).outerWidth(&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;);&lt;br /&gt;        });&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 在wrapper与innerHTML之间添加一个div&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; inner = jQuery('&amp;lt;div/&amp;gt;').css({width: maxWidth + 'px', padding: edge + 'px', overflow: 'hidden'});&lt;br /&gt;        inner.append(wrapper.html());&lt;br /&gt;        wrapper.html(inner);&lt;br /&gt;        &lt;br /&gt;        wrapper.mousemove(&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(e) {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; left = (e.pageX) * (inner.outerWidth(&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;) - wrapper.width()) / wrapper.width();&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; top = (e.pageY) * (inner.outerHeight(&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;) - wrapper.height()) / wrapper.height();&lt;br /&gt;            left += ((e.pageX &amp;gt; wrapper.width() / 2) ? 1 : -1) * wrapper.width() * 0.3;&lt;br /&gt;            top += ((e.pageY &amp;gt; wrapper.height() / 2) ? 1 : -1) * wrapper.height() * 0.3;&lt;br /&gt;            wrapper.scrollLeft(left);&lt;br /&gt;            wrapper.scrollTop(top);&lt;br /&gt;        });&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;jQuery.fn.jSrcollable = &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(wrapper, edge){&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(edge == undefined || edge == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;) edge = 5;&lt;br /&gt;    jSrcollable.move(wrapper, edge);&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Demo:&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;DOCTYPE HTML&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;html&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;meta &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;http-equiv&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Content-Type"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; content&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="text/html; charset=utf-8"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;script &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;src&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="text/javascript"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;script &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;src&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="jquery.jsrcollable.js"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="text/javascript"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;div &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="wrapper"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; style&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="width:200px; height:200px; border:solid 1px #000;"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;div &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;style&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="width:500px; height:500px; border:solid 5px #36C;"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;br&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;br&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;br&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;br&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;br&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;br&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;br&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;br&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;br&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标在这里移动鼠标&lt;span style="color: #0000ff;"&gt;&lt;br /&gt;  &amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;script &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;= "text/javascript"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&lt;br /&gt;jQuery(document).ready(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;(jQuery){&lt;br /&gt;    jQuery.fn.jSrcollable(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;#wrapper&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;, &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;5&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;);&lt;br /&gt;});&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;html&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;谁知道这个效果叫什么名称?不知道关键字在百度,谷歌里不知道怎样搜索,最后只能是自己写T_T&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hcbin/aggbug/2371578.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hcbin/archive/2012/02/28/2371578.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hcbin/archive/2012/02/12/2347927.html</id><title type="text">[网络] - 不使用翻墙软件就能访问facebook、twitter、Youtube(Youtube能访问但不能播放)</title><summary type="text">来源：http://hi.baidu.com/palmerl/blog/item/20b7065ae6cc657c853524a3.html众所周知，Google的服务在中国大陆地区不是被屏蔽，就是被干扰。导致Google的各种服务要么无法使用，要么极不稳定。本文介绍的方法，其原理是修改hosts文件强制使用谷歌的IP地址来访问Google的服务，详见《【科普一下】关于墙》和《当 Google 被屏蔽时，我该怎么做？》这两篇文章。能够解决的问题：搜索，网页快照，Google+，Gmail，日历，文档，照片，阅读器，论坛。所使用的工具，叫做“Hosts自动更新程序”。有Chrome浏览器的同学在</summary><published>2012-02-12T06:10:00Z</published><updated>2012-02-12T06:10:00Z</updated><author><name>炎峰森林影</name><uri>http://www.cnblogs.com/hcbin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hcbin/archive/2012/02/12/2347927.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hcbin/archive/2012/02/12/2347927.html"/><content type="html">&lt;p&gt;来源：&lt;a href="http://hi.baidu.com/palmerl/blog/item/20b7065ae6cc657c853524a3.html"&gt;http://hi.baidu.com/palmerl/blog/item/20b7065ae6cc657c853524a3.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;众所周知，Google的服务在中国大陆地区不是被屏蔽，就是被干扰。导致Google的各种服务要么无法使用，要么极不稳定。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;本文介绍的方法，其原理是修改hosts文件强制&lt;strong&gt;使用谷歌的IP地址来访问Google的服务&lt;/strong&gt;，详见《&lt;a href="http://hi.baidu.com/palmerl/blog/item/198584d26ed61e2b32fa1cc5.html" target="_blank"&gt;【科普一下】关于墙&lt;/a&gt;》和《当 Google 被屏蔽时，我该怎么做？》这两篇文章。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;能够解决的问题：&lt;strong&gt;搜索，网页快照，Google+，Gmail，日历，文档，照片，阅读器，论坛&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;所使用的工具，叫做&amp;ldquo;&lt;strong&gt;Hosts自动更新程序&lt;/strong&gt;&amp;rdquo;。有&lt;a href="http://www.google.cn/chrome/intl/zh-CN/landing_chrome.html?hl=zh-cn" target="_blank"&gt;Chrome浏览器&lt;/a&gt;的同学在Chrome Web Strore里搜一下，或者直接打开下面的地址：&lt;/p&gt;&lt;p&gt;&lt;a href="https://chrome.google.com/webstore/detail/bcomihljbnefaobillhnajpgompoelme?hl=zh-CN" target="_blank"&gt;https://chrome.google.com/webstore/detail/bcomihljbnefaobillhnajpgompoelme?hl=zh-CN&lt;/a&gt;&lt;/p&gt;&lt;p&gt;没有Chrome浏览器的同学，脚本版下载地址（解压后运行gengxin.bat）：&lt;a href="http://u.115.com/file/aq7a1lq4" target="_blank"&gt;http://u.115.com/file/aq7a1lq4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;运行有问题的话，请右键管理员运行。防止Google跳转的方法是访问一次&lt;a href="http://www.google.com/ncr" target="_blank"&gt;Google.com in English&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;这个工具的主页：&lt;a href="https://plus.google.com/109906764666611489817/posts/iRs7zi4hHqB" target="_blank"&gt;https://plus.google.com/109906764666611489817/posts/iRs7zi4hHqB&lt;/a&gt;（能打开就说明成功了。如果不成功，请排除某些国产软件的影响，例如360。）&lt;/p&gt;&lt;p&gt;&lt;br /&gt;需要注意的问题：阅读器和论坛需要用https方式访问。另外，由于Windows XP系统的IE浏览器不支持SNI（服务器名称指示，允许一个IP地址上多个域名安装多张证书），可能会遇到证书报错提示。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hcbin/aggbug/2347927.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hcbin/archive/2012/02/12/2347927.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hcbin/archive/2011/12/12/2284946.html</id><title type="text">[PHP] - 中文字符串截取(UTF-8与非UTF-8)</title><summary type="text">来源：http://zhidao.baidu.com/question/282309749.htmlfunction cutstr ($string, $length, $dot = '...', $charset = 'utf-8') { //功能:按长度截取字符串 //$string, $length, $dot,$charset //字符串,要取长度,截断符,编码 if (strlen($string) &lt;= $length) { return $string; } $string = str_replace(array('&amp;&amp;#39</summary><published>2011-12-12T07:58:00Z</published><updated>2011-12-12T07:58:00Z</updated><author><name>炎峰森林影</name><uri>http://www.cnblogs.com/hcbin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hcbin/archive/2011/12/12/2284946.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hcbin/archive/2011/12/12/2284946.html"/><content type="html">&lt;p&gt;来源：&lt;a href="http://zhidao.baidu.com/question/282309749.html"&gt;http://zhidao.baidu.com/question/282309749.html&lt;/a&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; cutstr (&lt;span style="color: #800080;"&gt;$string&lt;/span&gt;, &lt;span style="color: #800080;"&gt;$length&lt;/span&gt;, &lt;span style="color: #800080;"&gt;$dot&lt;/span&gt; = '...', &lt;span style="color: #800080;"&gt;$charset&lt;/span&gt; = 'utf-8') {&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;功能:按长度截取字符串&lt;br /&gt;    //$string, $length, $dot,$charset&lt;br /&gt;    //字符串,要取长度,截断符,编码&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #008080;"&gt;strlen&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$string&lt;/span&gt;) &amp;lt;= &lt;span style="color: #800080;"&gt;$length&lt;/span&gt;) {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;$string&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #800080;"&gt;$string&lt;/span&gt; = &lt;span style="color: #008080;"&gt;str_replace&lt;/span&gt;(&lt;span style="color: #0000ff;"&gt;array&lt;/span&gt;('&amp;amp;', '"', '&amp;lt;', '&amp;gt;'), &lt;span style="color: #0000ff;"&gt;array&lt;/span&gt;('&amp;amp;', '"', '&amp;lt;', '&amp;gt;'), &lt;span style="color: #800080;"&gt;$string&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #800080;"&gt;$strcut&lt;/span&gt; = '';&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #008080;"&gt;strtolower&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$charset&lt;/span&gt;) == 'utf-8') {&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #800080;"&gt;$n&lt;/span&gt; = &lt;span style="color: #800080;"&gt;$tn&lt;/span&gt; = &lt;span style="color: #800080;"&gt;$noc&lt;/span&gt; = 0;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt; (&lt;span style="color: #800080;"&gt;$n&lt;/span&gt; &amp;lt; &lt;span style="color: #008080;"&gt;strlen&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$string&lt;/span&gt;)) {&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #800080;"&gt;$t&lt;/span&gt; = &lt;span style="color: #008080;"&gt;ord&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$string&lt;/span&gt;[&lt;span style="color: #800080;"&gt;$n&lt;/span&gt;]);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #800080;"&gt;$t&lt;/span&gt; == 9 || &lt;span style="color: #800080;"&gt;$t&lt;/span&gt; == 10 || (32 &amp;lt;= &lt;span style="color: #800080;"&gt;$t&lt;/span&gt; &amp;amp;&amp;amp; &lt;span style="color: #800080;"&gt;$t&lt;/span&gt; &amp;lt;= 126)) {&lt;br /&gt;                &lt;span style="color: #800080;"&gt;$tn&lt;/span&gt; = 1;&lt;br /&gt;                &lt;span style="color: #800080;"&gt;$n&lt;/span&gt;++;&lt;br /&gt;                &lt;span style="color: #800080;"&gt;$noc&lt;/span&gt;++;&lt;br /&gt;            } &lt;span style="color: #0000ff;"&gt;elseif&lt;/span&gt; (194 &amp;lt;= &lt;span style="color: #800080;"&gt;$t&lt;/span&gt; &amp;amp;&amp;amp; &lt;span style="color: #800080;"&gt;$t&lt;/span&gt; &amp;lt;= 223) {&lt;br /&gt;                &lt;span style="color: #800080;"&gt;$tn&lt;/span&gt; = 2;&lt;br /&gt;                &lt;span style="color: #800080;"&gt;$n&lt;/span&gt; += 2;&lt;br /&gt;                &lt;span style="color: #800080;"&gt;$noc&lt;/span&gt; += 2;&lt;br /&gt;            } &lt;span style="color: #0000ff;"&gt;elseif&lt;/span&gt; (224 &amp;lt;= &lt;span style="color: #800080;"&gt;$t&lt;/span&gt; &amp;amp;&amp;amp; &lt;span style="color: #800080;"&gt;$t&lt;/span&gt; &amp;lt;= 239) {&lt;br /&gt;                &lt;span style="color: #800080;"&gt;$tn&lt;/span&gt; = 3;&lt;br /&gt;                &lt;span style="color: #800080;"&gt;$n&lt;/span&gt; += 3;&lt;br /&gt;                &lt;span style="color: #800080;"&gt;$noc&lt;/span&gt; += 2;&lt;br /&gt;            } &lt;span style="color: #0000ff;"&gt;elseif&lt;/span&gt; (240 &amp;lt;= &lt;span style="color: #800080;"&gt;$t&lt;/span&gt; &amp;amp;&amp;amp; &lt;span style="color: #800080;"&gt;$t&lt;/span&gt; &amp;lt;= 247) {&lt;br /&gt;                &lt;span style="color: #800080;"&gt;$tn&lt;/span&gt; = 4;&lt;br /&gt;                &lt;span style="color: #800080;"&gt;$n&lt;/span&gt; += 4;&lt;br /&gt;                &lt;span style="color: #800080;"&gt;$noc&lt;/span&gt; += 2;&lt;br /&gt;            } &lt;span style="color: #0000ff;"&gt;elseif&lt;/span&gt; (248 &amp;lt;= &lt;span style="color: #800080;"&gt;$t&lt;/span&gt; &amp;amp;&amp;amp; &lt;span style="color: #800080;"&gt;$t&lt;/span&gt; &amp;lt;= 251) {&lt;br /&gt;                &lt;span style="color: #800080;"&gt;$tn&lt;/span&gt; = 5;&lt;br /&gt;                &lt;span style="color: #800080;"&gt;$n&lt;/span&gt; += 5;&lt;br /&gt;                &lt;span style="color: #800080;"&gt;$noc&lt;/span&gt; += 2;&lt;br /&gt;            } &lt;span style="color: #0000ff;"&gt;elseif&lt;/span&gt; (&lt;span style="color: #800080;"&gt;$t&lt;/span&gt; == 252 || &lt;span style="color: #800080;"&gt;$t&lt;/span&gt; == 253) {&lt;br /&gt;                &lt;span style="color: #800080;"&gt;$tn&lt;/span&gt; = 6;&lt;br /&gt;                &lt;span style="color: #800080;"&gt;$n&lt;/span&gt; += 6;&lt;br /&gt;                &lt;span style="color: #800080;"&gt;$noc&lt;/span&gt; += 2;&lt;br /&gt;            } &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; {&lt;br /&gt;                &lt;span style="color: #800080;"&gt;$n&lt;/span&gt;++;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #800080;"&gt;$noc&lt;/span&gt; &amp;gt;= &lt;span style="color: #800080;"&gt;$length&lt;/span&gt;) {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #800080;"&gt;$noc&lt;/span&gt; &amp;gt; &lt;span style="color: #800080;"&gt;$length&lt;/span&gt;) {&lt;br /&gt;            &lt;span style="color: #800080;"&gt;$n&lt;/span&gt; -= &lt;span style="color: #800080;"&gt;$tn&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #800080;"&gt;$strcut&lt;/span&gt; = &lt;span style="color: #008080;"&gt;substr&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$string&lt;/span&gt;, 0, &lt;span style="color: #800080;"&gt;$n&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    } &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #800080;"&gt;$i&lt;/span&gt; = 0; &lt;span style="color: #800080;"&gt;$i&lt;/span&gt; &amp;lt; &lt;span style="color: #800080;"&gt;$length&lt;/span&gt;; &lt;span style="color: #800080;"&gt;$i&lt;/span&gt;++) {&lt;br /&gt;            &lt;span style="color: #800080;"&gt;$strcut&lt;/span&gt; .= &lt;span style="color: #008080;"&gt;ord&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$string&lt;/span&gt;[&lt;span style="color: #800080;"&gt;$i&lt;/span&gt;]) &amp;gt; 127 ? &lt;span style="color: #800080;"&gt;$string&lt;/span&gt;[&lt;span style="color: #800080;"&gt;$i&lt;/span&gt;] . &lt;span style="color: #800080;"&gt;$string&lt;/span&gt;[++ &lt;span style="color: #800080;"&gt;$i&lt;/span&gt;] : &lt;span style="color: #800080;"&gt;$string&lt;/span&gt;[&lt;span style="color: #800080;"&gt;$i&lt;/span&gt;];&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #800080;"&gt;$strcut&lt;/span&gt; = &lt;span style="color: #008080;"&gt;str_replace&lt;/span&gt;(&lt;span style="color: #0000ff;"&gt;array&lt;/span&gt;('&amp;amp;', '"', '&amp;lt;', '&amp;gt;'), &lt;span style="color: #0000ff;"&gt;array&lt;/span&gt;('&amp;amp;', '"', '&amp;lt;', '&amp;gt;'), &lt;span style="color: #800080;"&gt;$strcut&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;$strcut&lt;/span&gt; . &lt;span style="color: #800080;"&gt;$dot&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #800080;"&gt;$str&lt;/span&gt; = "我们要截取的字符串";&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;echo&lt;/span&gt; cutstr(&lt;span style="color: #800080;"&gt;$str&lt;/span&gt;, 15, "...", 'utf-8');&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hcbin/aggbug/2284946.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hcbin/archive/2011/12/12/2284946.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hcbin/archive/2011/10/28/2228220.html</id><title type="text">[SEO] - 中科院软件所张俊林：Baidu分词算法分析</title><summary type="text">来源：http://tech-field.org/seo/reprint-articles/chinese-segmentation/百度分词算法分析之一查询处理以及分词技术随着搜索经济的崛起，人们开始越加关注全球各大搜索引擎的性能、技术和日流量。作为企业，会根据搜索引擎的知名度以及日流量来选择是否要投放广告等；作为普通网民，会根据搜索引擎的性能和技术来选择自己喜欢的引擎查找资料；作为技术人员，会把有代表性的搜索引擎作为研究对象. 搜索引擎经济的崛起，又一次向人们证明了网络所蕴藏的巨大商机。网络离开了搜索将只剩下空洞杂乱的数据，以及大量等待去费力挖掘的金矿。但是,如何设计一个高效的搜索引擎?我</summary><published>2011-10-28T15:06:00Z</published><updated>2011-10-28T15:06:00Z</updated><author><name>炎峰森林影</name><uri>http://www.cnblogs.com/hcbin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hcbin/archive/2011/10/28/2228220.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hcbin/archive/2011/10/28/2228220.html"/><content type="html">&lt;p&gt;来源：&lt;a href="http://tech-field.org/seo/reprint-articles/chinese-segmentation/"&gt;http://tech-field.org/seo/reprint-articles/chinese-segmentation/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;百度分词算法分析之一&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;查询处理以及分词技术&lt;/p&gt;&lt;p&gt;随着搜索经济的崛起，人们开始越加关注全球各大搜索引擎的性能、技术和日流量。作为企业，会根据搜索引擎的知名度以及日流量来选择是否要投放广告等；作为普通网民，会根据搜索引擎的性能和技术来选择自己喜欢的引擎查找资料；作为技术人员，会把有代表性的搜索引擎作为研究对象. 搜索引擎经济的崛起，又一次向人们证明了网络所蕴藏的巨大商机。网络离开了搜索将只剩下空洞杂乱的数据，以及大量等待去费力挖掘的金矿。&lt;/p&gt;&lt;p&gt;但是,如何设计一个高效的搜索引擎?我们可以以百度所采取的技术手段来探讨如何设计一个实用的搜索引擎.搜索引擎涉及到许多技术点,比如查询处理,排序算法,页面抓取算法,CACHE机制,ANTI-SPAM等等.这些技术细节,作为商业公司的搜索引擎服务提供商比如百度,GOOGLE等是不会公之于众的.我们可以将现有的搜索引擎看作一个黑盒,通过向黑盒提交输入,判断黑盒返回的输出大致判断黑盒里面不为人知的技术细节.&lt;/p&gt;&lt;p&gt;查询处理与分词是一个中文搜索引擎必不可少的工作,而百度作为一个典型的中文搜索引擎一直强调其&amp;rdquo;中文处理&amp;rdquo;方面具有其它搜索引擎所不具有的关键技术和优势.那么我们就来看看百度到底采用了哪些所谓的核心技术.&lt;/p&gt;&lt;p&gt;我们分两个部分来讲述:查询处理/中文分词.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;一. 查询处理&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;用户向搜索引擎提交查询,搜索引擎一般在接受到用户查询后要做一些处理,然后在索引数据库里面提取相关的信息.那么百度在接受到用户查询后做了些什么工作呢?&lt;/p&gt;&lt;p&gt;1. 假设用户提交了不只一个查询串,比如&amp;rdquo;信息检索 理论 工具&amp;rdquo;.那么搜索引擎首先做的是根据分隔符比如空格,标点符号,将查询串分割成若干子查询串,比如上面的查询就会被解析为:&amp;lt;信息检索,理论,工具&amp;gt;三个子字符串;这个道理简单,我们接着往下看.&lt;/p&gt;&lt;p&gt;2. 假设提交的查询有重复的内容,搜索引擎怎么处理呢?比如查询&amp;rdquo;理论 工具 理论&amp;rdquo;,百度是将重复的字符串当作只出现过一次,也就是处理成等价的&amp;rdquo;理论 工具&amp;rdquo;,而GOOGLE显然是没有进行归并,而是将重复查询子串的权重增大进行处理.那么是如何得出这个结论的呢?我们可以将&amp;rdquo;理论 工具&amp;rdquo;提交给百度,返回341,000篇文档,大致看看第一页的返回内容.OK.继续,我们提交查询&amp;rdquo;理论 工具 理论&amp;rdquo;,在看看返回结果,仍然是那么多返回文档,当然这个不能说明太多问题,那看看第一页返回结果的排序,看出来了吗?顺序完全没有变化,而GOOGLE则排序有些变动,这说明百度是将重复的查询归并成一个处理的,而且字符串之间的先后出现顺序基本不予考虑(GOOGLE是考虑了这个顺序关系的).&lt;/p&gt;&lt;p&gt;3. 假设提交的中文查询包含英文单词,搜索引擎是怎么处理的?比如查询&amp;rdquo;电影BT下载&amp;rdquo;,百度的方法是将中文字符串中的英文当作一个整体保留,并以此为断点将中文切分开,这样上述的查询就切为&amp;lt;电影,BT,下载&amp;gt;,不论中间的英文是否一个字典里能查到的单词也好,还是随机的字符也好,都会当作一个整体来对待.至于为什么,你用查询&amp;rdquo; 电影dfdfdf下载&amp;rdquo;看看结果就知道了.当然如果查询中包含数字,也是如此办理.&lt;/p&gt;&lt;p&gt;到目前为止,一切很简单,也很清楚,百度怎么处理用户查询的呢?归纳如下:首先根据分割符号将查询分开,然后看看是否有重复的字符串,如果有,就抛弃多余的,只保留一个,接着判断是否有英文或者数字,如果有的话,把英文或者数字当作一个整体保留并把前后的中文切开.&lt;/p&gt;&lt;p&gt;接着该干什么呢?该考虑分词的问题了.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;二. 中文分词&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;首先,讲讲百度的分词时机或者条件问题,是否是个中文字符串百度就拿来切一下呢?非也,要想被百度的分词程序荣幸的切割一下也是要讲条件的,哪能是个字符串就切割啊?你当百度是卖锯条的么?&lt;/p&gt;&lt;p&gt;那么什么样的字符串才满足被切割的条件呢?简单说来,如果字符串只包含小于等于3个中文字符的话,那就保留不动,当字符串长度大于4个中文字符的时候,百度的分词程序才出马大干快上,把这个字符串肢解掉.&lt;/p&gt;&lt;p&gt;怎么证明呢?我们向百度提交&amp;rdquo;电影下载&amp;rdquo;,看看返回结果中标为红字的地方,不难看出来,查询已经被切割成&amp;lt;电影,下载&amp;gt;两个单词了,说明分词程序已经开工了,如果是比4个中文字符更长的字符串,那分词程序就更不客气了,一定大卸八块而后快.我们来看看三个字符的情况,提交查询&amp;rdquo;当然择&amp;rdquo;,看起来这个查询不伦不类,那是因为我希望看到这个字符串被切分为&amp;lt;当然,择&amp;gt;,返回结果365篇相关页面,翻到最后一页,发现标红的关键字都是&amp;rdquo;当然择&amp;rdquo;连续出现的情况,好像没有切分,但是还不确定,那么再提交人工分好的查询&amp;rdquo;当然 择&amp;rdquo;看看,返回结果1,090,000篇,基本上可以确定没有进行分词了,当然另外一种解释是:对于三个字符先切分,然后将切分后的结果当作一个短语查询,这样看到的效果和没有切分是相似的.但是我倾向于判断百度对于少于3个字符的串没有切分,奥卡姆不是说了么&amp;rdquo;如无必要,勿增实体&amp;rdquo;,干吗做无用功呢.那么如果没有切分,会有一个随之而来的问题,怎么从索引库里面提取未切分的字符串呢?这牵扯到索引的问题,我觉得百度应该采取了两套索引机制,一种是按照单词索引,一种是按照N-GRAM索引,至于索引的具体问题,以后在详细论述.&lt;/p&gt;&lt;p&gt;下面我们看看百度是采取的何种分词算法,现在分词算法已经算是比较成熟了,有简单的有复杂的,比如正向最大匹配,反向最大匹配,双向最大匹配,语言模型方法,最短路径算法等等,有兴趣的可以用GOOGLE去搜索一下以增加理解.这里就不展开说了.但是要记住一点的是:判断一个分词系统好不好,关键看两点,一个是消除歧义能力;一个是词典未登录词的识别比如人名,地名,机构名等.&lt;/p&gt;&lt;p&gt;那么百度用的是什么方法?我的判断是用双向最大匹配算法.至于怎么推理得出的,让我们一步步来看.当然,这里首先有个假设,百度不会采取比较复杂的算法,因为考虑到速度问题.&lt;/p&gt;&lt;p&gt;我们提交一个查询&amp;rdquo;&lt;span&gt;毛&lt;/span&gt;&lt;span&gt;泽&lt;/span&gt;&lt;span&gt;东&lt;/span&gt;北京华烟云&amp;rdquo;,又一个不知所云的查询,尽管不知所云但是自有它的道理,我想看看百度的分词是如何消歧以及是否有词典未登录词的识别的功能,如果是正向最大匹配算法的话,那么输出应该是:&amp;rdquo;&lt;span&gt;毛&lt;/span&gt;&lt;span&gt;泽&lt;/span&gt;&lt;span&gt;东&lt;/span&gt;/北京/华/烟云&amp;rdquo;,如果是反向最大匹配算法的话,那么输出应该是:&amp;rdquo;毛/泽/东北/京华烟云&amp;rdquo;,我们看看百度的分词结果:&amp;rdquo;&lt;span&gt;毛&lt;/span&gt;&lt;span&gt;泽&lt;/span&gt;&lt;span&gt;东&lt;/span&gt;/北/京华烟云&amp;rdquo;,一个很奇怪的输出,跟我们的期望相差较多,但是从中我们可以获得如下信息:百度分词可以识别人名,也可以识别&amp;rdquo;京华烟云&amp;rdquo;,这说明有词典未登录词的识别的功能,我们可以假设分词过程分为两个阶段:第一阶段,先查找一个特殊词典,这个词典包含一些人名,部分地名以及一些普通词典没有的新词,这样首先将&amp;rdquo;&lt;span&gt;毛&lt;/span&gt;&lt;span&gt;泽&lt;/span&gt;&lt;span&gt;东&lt;/span&gt;&amp;rdquo;解析出来,剩下了字符串&amp;rdquo;北京华烟云&amp;rdquo;,而&amp;rdquo;北/京华烟云&amp;rdquo;,可以看作是反向最大匹配的分词结果.这样基本说得通.为了证明这一点,我们提交查询&amp;rdquo;发&lt;span&gt;毛&lt;/span&gt;&lt;span&gt;泽&lt;/span&gt;&lt;span&gt;东&lt;/span&gt;北&amp;rdquo;,我们期望两种分词结果,一个是正向最大匹配&amp;lt;发毛,泽,东北&amp;gt;,一个是上述假设的结果&amp;lt;发,&lt;span&gt;毛&lt;/span&gt;&lt;span&gt;泽&lt;/span&gt;&lt;span&gt;东&lt;/span&gt;,北&amp;gt;,事实上百度输出是第二种情况,这样基本能确定百度分词采取了至少两个词典,一个是普通词典,一个是专用词典(人名等).而且是专用词典先切分,然后将剩余的片断交由普通词典来切分.&lt;/p&gt;&lt;p&gt;继续测验,提交查询&amp;rdquo;古巴比伦理&amp;rdquo;,如果是正向最大匹配,那么结果应该是&amp;lt;古巴比伦,理&amp;gt;,如果是反向最大匹配,那么结果应该是&amp;lt;古巴,比,伦理&amp;gt;,事实上百度的分词结果是&amp;lt;古巴比伦,理&amp;gt;,从这个例子看,好像用了正向最大匹配算法;此外还有一些例子表明好像是使用正向最大匹配的;但是且慢,我们看这个查询&amp;rdquo;北京华烟云&amp;rdquo;,正向最大匹配期望的结果是&amp;lt;北京,华,烟云&amp;gt;,而反向最大匹配期望的结果是&amp;lt;北,京华烟云&amp;gt;,事实上百度输出的是后者,这说明可能采用的反向最大匹配;从这点我们可以猜测百度采用的是双向最大匹配分词算法,如果正向和反向匹配分词结果一致当然好办,直接输出即可;但是如果两者不一致,正向匹配一种结果,反向匹配一种结果,此时该如何是好呢?从上面两个例子看,在这种情况下,百度采取最短路径方法,也就是切分的片断越少越好,比如&amp;lt;古巴,比,伦理&amp;gt;和&amp;lt;古巴比伦,理&amp;gt;相比选择后者,&amp;lt;北京,华,烟云&amp;gt;和&amp;lt;北,京华烟云&amp;gt;相比选择后者.还有类似的一些例子,这样基本可以解释这些输出结果.&lt;/p&gt;&lt;p&gt;但是仍然遗留的问题是:如果正向反向分词不一致,而且最短路径也相同,那怎么办?输出正向的还是反向的结果?我们再来看一个例子.提交查询&amp;rdquo;遥远古古巴比伦&amp;rdquo;,这个查询被百度切分为&amp;lt;遥远,古古,巴比伦&amp;gt;,说明词典里面有&amp;rdquo;巴比伦&amp;rdquo;,但是是否有&amp;rdquo;古巴比伦&amp;rdquo;这个词汇不确定,此时看不出是正向切分还是反向切分得出的结果,换查询为&amp;rdquo;遥远古巴比伦&amp;rdquo;,此时被切分为&amp;rdquo;遥远/古巴比伦&amp;rdquo;,这说明词典里面有&amp;rdquo;古巴比伦&amp;rdquo;这个词汇,这说明了&amp;rdquo;遥远古古巴比伦&amp;rdquo;是正向最大匹配的结果.那为什么&amp;rdquo;遥远古古巴比伦&amp;rdquo;不会被反向切分为&amp;rdquo;遥/远古/古巴比伦&amp;rdquo;呢,百度的可能选择是这种情况下选择单字少的那组切分结果.&lt;/p&gt;&lt;p&gt;当然还可以继续追问:如果切分后单字也一样多,那怎么办?最后看一个例子,查询&amp;rdquo;王强大小:&amp;rdquo;,百度将其切分为&amp;rdquo;王/强大/小&amp;rdquo;,是正向切分的结果,如果是反向的会被切分为&amp;rdquo;王/强/大小&amp;rdquo;,这说明有歧义而且单字也相同则选择正向切分结果.&lt;/p&gt;&lt;p&gt;OK,看到这里可能头已经有些晕了,最后总结一下百度的分词算法,当然里面还是有猜测的成分,算法如下:&lt;/p&gt;&lt;p&gt;首先查询专用词典(人名,部分地名等),将专有名称切出,剩下的部分采取双向分词策略,如果两者切分结果相同,说明没有歧义,直接输出分词结果.如果不一致,则输出最短路径的那个结果,如果长度相同,则选择单字词少的那一组切分结果.如果单字也相同,则选择正向分词结果..&lt;/p&gt;&lt;p&gt;百度一直宣传自己在中文处理方面的优势,从上面看,分词算法并无特殊之处,消歧效果并不理想,即使百度采取比上述分词算法复杂些的算法也难以说成是优势,如果说百度有优势的话,唯一的优势就是那个很大的专用词典,这个专用词典登录了人名(比如大长今),称谓(比如老太太),部分地名(比如阿联酋等),估计百度采用学术界公布的比较新的命名实体识别算法从语料库里面不断识别出词典未登录词,逐渐扩充这个专门词典.如果这就是优势的话,那么这个优势能够保持多久就是个很明显的问题.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;百度分词算法分析之二&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Spelling Checker拼写检查错误提示(以及拼音提示功能)&lt;/p&gt;&lt;p&gt;拼写检查错误提示是搜索引擎都具备的一个功能,也就是说用户提交查询 给搜索引擎,搜索引擎检查看是否用户输入的拼写有错误,对于中文用户来说一般造成的错误是输入法造成的错误.那么我们就来分析看看百度是 怎么实现这一功能的.&lt;br /&gt;我们分析拼写检查系统关注以下几个问题:&lt;br /&gt;(1)系统如何判断用户的输入是有可能发生错误的查询呢?&lt;br /&gt;(2)如果判断是可能错误的查询输入,如何提示正确的词汇呢?&lt;/p&gt;&lt;p&gt;那么百度是如何做的呢?百度判断用户输入是否错误的标准,我觉得应该是查字典,如果发现字典里面不包含这个词汇,那么很有可能是个错误的输入,此时启动 错误提示功能,这个很好判断,因为如果是一个正常词汇的话,百度一般不会有错误提示,而你故意输入一个词典不可能包含的所谓词汇,此时百度一般会提示你正 确的检索词汇.&lt;br /&gt;那么百度是怎么提示正确词汇的呢?很明显是通过拼音的方式,比如我输入查询" 制才",百度提供的提示词汇为: &amp;ldquo;制裁 质材 纸材",都是同音字.所以百度必然维持着一个同音词词典,里面保留着同音词信息,比如可能包含着下面这条词条: &amp;ldquo; zhi cai &amp;agrave;制裁,质材,纸材",另外还有一 个标注拼音程序,现在能够看到的基本流程是: 用户输入" 制才",查词典,发现没有这个词汇,OK,启动标注拼音程序,将" 制才"标注为拼音"zhi cai",然后查找同音词词典,发现同音词" 制裁,质材,纸材",那么提示用户可能的正确拼写.&lt;br /&gt;整体流程看起来很简单,但是还有一些遗留的小问题,比如是否将词表里面所有同音词都作为用 户的提示信息呢?比如某个拼音有10个同音词,是否都输出呢?百度并没有将所有同音词都输出而是选择一定筛选标准,选择其中几个输出.怎么证明这一点?我 们看看拼音"liu li"的同音词,紫光输入法提示同音词汇有" 流丽 流离 琉璃流利"4个,我们看看百度返回几个,输入"流厉"作为查询,这里是故意输入一个词典不包含的词汇,这样百度的拼写检查才开始工作,百度提示: " 琉璃刘丽 刘莉 ",这说明什么?说明不是所有同音词都输出,而是选择输出,那么选择的标准是什么?我能够猜测到的方法是对于用户查询LOG进行统计,提取用户查询次数多 的那些同音词输出,如果是这样的话,上面的例子说明用户搜索"琉璃"次数比其它的都要高些,次之是" 刘丽",再次是" 刘莉",看来大家都喜欢查询自己或者认识的人的名字.&lt;br /&gt;另外一个小问题:同音词词典包含2字词,3字词,那么是否包含4字词以及更长的词条?是 否包含一字词? 这里一字词好回答,不用测试也能知道肯定不包含,因为你输入一个字,谁知道是否是错误的呢?反正只要是汉字就能在词表里面找到,所以没有判断依据.二字词 是包含的,上面有例子,三字词也包含,比如查询 "中城药"百度错误提示:"中成药",修改查询为"重城药",还是提示"中成药" ,再次修改查询 "重城要",百度依然提示"中成药". 那么4字词汇呢?&lt;br /&gt;百度还是会给你提示的,下面是个例子:&lt;br /&gt;输入:静华烟云 提示 京华烟云&lt;br /&gt;输入:静话烟云 提示 京华烟云&lt;br /&gt;输入:静话阎晕 提示 京华烟云&lt;br /&gt;那么更长的词汇是否提 示呢?也提示,比如我输入: "落花世界有风军",这个查询是什么意思,估计读过古诗的都知道,看看百度的提示"落花时节又逢君",这说明什么?说明同音词词典包含不同长度的同音词信 息,另外也说明了百度的核心中文处理技术,也就是那个词典,还真挺大的.&lt;br /&gt;但是,如果用户输入的 查询由两个或者两个以上子字符串构成,那么百度的错误提示功能就***了,比如输入查询"哀体",百度提示"艾提 挨踢",但是.输入为 "我 哀体 ",则没有任何错误提示.&lt;br /&gt;还有一个比较重要的问题:如果汉字是多音字那么怎么处理?百度呢比较偷懒,它根本就没有对多音字做处理.我们来看看百度的一个标注拼音的错误,在看这个 错误前先看看对于多音字百度是怎么提示错误的,我们输入查询"俱长",百度提示"剧场 局长", &amp;ldquo;俱长"的拼音有两个:"ju zhang /ju chang" ,可见如果是多音字则几种情况都提示..现在我们来看看错误的情况, 我们输入查询"剧常",百度 提示":剧场局长",提示为"剧场"当然好解释,因为是同音字,但是为什么 "局长"也会被提示呢?这说明百度的同音字词典有错误,说明在"ju chang"这个词条里面包含"局长"这个错误的同音词.让我们顺藤摸瓜,这个错误又说明什么问题呢?说明百度的同音词典是自动生成的,而且没有人工校 对.还说明在自动生成同音词典的过程中,百度不是根据对一篇文章标注拼音然后在抽取词汇和对应的拼音信息获得的,而是完全按照某个词典的词条来标注音节 的,所以对于多音字造成的错误无法识别出来,如果是对篇章进行拼音标注,可能就不会出现这种很容易发现的错误标注. 当然还有另外一种解释,就是"局长"是故意被百度提示出来可能的正确提示词汇,因为考虑到南方人"zh"和 "ch"等前后鼻音分不清么,那么是这样的么?我们继续测试到底是何种情况.是百度有错误还是这是百度的先进的算法?&lt;br /&gt;我们考虑词汇"长大 ",故意错误输入为"赃大",如果百度考虑到了前后鼻音的问题,那么应该会提示"长大",但是百度提示是"藏大".这说明什么?说明百度并没有考虑前后鼻 音问题,根本就是系统错 误. 我们输入查询"悬赏",故意将之错误输入为"悬桑",没有错误提示,说明确实没有考虑这种情况.前鼻音没有考虑,那么后鼻音考虑了么,我们输入":经常 ",故意改为后鼻音 "经缠",百度提示为"经产 经忏",还是没有考虑后鼻音.这基本可以确定是百度系统的错误导致.&lt;br /&gt;根据以上推导, 我们可以得出如下结论:百度是将分词词典里面每个词条利用拼音标注程序标注成拼音,然后形成同音词词典,所以两个词典是同样大的 ,而且这个词典也随着分词词典的增长而在不断增长. 至于标注过程中多音字百度没有考虑,如果是多音字就标注成多个发音组合,通过这种方式形成同音词词典.这样的同音词词典显然包含着很多错误.&lt;br /&gt;最后一个问题:百度对于英文进行拼写检查么?让我们试试看,输入查询"china",不错,搜到不少结果,专注中文搜索的百度还能搜索到英文,真是意外的 惊喜.变换一下查询"chine",会更加意外惊喜的给我们提示"china"吗?百度提示的是: 吃呢持呢,原来是不小心触发了百度的拼音搜索功能了.那么拼音搜索和中文检查错误是否采用同一套同音词词典呢,让我们来实验一下,搜索"rongji", 百度提示" 榕基 溶剂 容积",OK,换个中文查询"容机",百度提示" 榕基溶剂容积",看来使用的是同一套同音词词典.也就是说百度的中文纠错和拼音检索使用的机制相同,中文纠错多了一道拼音注音的过程而已.难道这就是传说 中那个百度的"事实上是一个无比强大的拼音输入法"的拼音提示功能么?&lt;br /&gt;最后让我们总结归纳一下百度的拼写检查系统:&lt;br /&gt;后台作业: (1)前面的文章我们说过,百度分词使用的词典至少包含两个词典一个是普通词典,另外一个是专用词典(专名等),百度利用拼音标注程序依次扫描所有词典中 的每个词条,然后标注拼音,如果是多音字则把多个音都标上,比如"长大",会被标注为"zhang da/chang da"两个词条.&lt;br /&gt;(2)通过标注完的 词条,建立同音词词典,比如上面的"长大",会有两个词条: zhang da&amp;agrave;长大" , chang da&amp;agrave;长大.&lt;br /&gt;(3)利用用户查询LOG频率信息给予每个 中文词条一个权重;&lt;br /&gt;(4)OK,同音词词典建立完成了,当然随着分词词典的逐步扩大,同音词词典也跟着同步扩大;&lt;/p&gt;&lt;p&gt;拼写 检查:&lt;br /&gt;(1)用户输入查询,如果是多个子字符串,不作拼写检查;&lt;br /&gt;(2)对于用户查询,先查分词词典,如果发现有这个单词词条,OK, 不作拼写检查;&lt;br /&gt;(3)如果发现词典里面不包含用户查询,启动拼写检查系统;首先利用拼音标注程序对用户输入进行拼音标注;&lt;br /&gt;(4)对于标注好的拼音在同音词词典里面扫描,如果没有发现则不作任何提示;&lt;br /&gt;(5)如果发现有词条,则按照顺序输出权重比较大的几个提 示结果;&lt;/p&gt;&lt;p&gt;拼音提示:&lt;br /&gt;(1)对于用户输入的拼音在同音词词典里面扫描,如果没有发现则不作任何提示;&lt;br /&gt;(2)如果 发现有词条,则按照顺序输出权重比较大的几个提示结果;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;百度分词算法分析之三&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;对百度分词算法的进一步分析&lt;/p&gt;&lt;p&gt;上面说过,经过分析得出百度的分词系统采用双向最大匹配分词,但是后来发现推理过程中存在一个漏洞,而且推导出来的百度分词算法步骤还是过于繁琐,所以进一步进行分析,看看是否前面的推导有错误.&lt;/p&gt;&lt;p&gt;那 么以前的分析有什么漏洞呢?我们推导百度分词有反向最大匹配的依据是百度将"北京华烟云"分词为&amp;lt;北,京华烟云&amp;gt;,从这里看好像采用了反向最 大匹配,因为正向最大匹配的结果应该是&amp;lt;北京,华,烟云&amp;gt;,但是由此就推论说百度采用了双向最大匹配还是太仓促了,前面文章我们也讲过,百度 有两个词典,一个普通词典,一个专有词典,而且是专有词典的词汇先切分,然后将剩余片断交给普通词典去切分.所以上面的"北京华烟云"之所以被切分成 &amp;lt;北,京华烟云&amp;gt;,另外一个可能是:京华烟云这个词汇是在专有词典里面存储的,所以先分析,这样得出"京华烟云",剩下"北",没什么好切分 的,所以输出&amp;lt;北,京华烟云&amp;gt;.&lt;/p&gt;&lt;p&gt;这里只是假设,那么是否确实"京华烟云"在专有词典呢?我们再看一个例子"山东北京华烟云 ",百度切分的结果是&amp;lt;山东,北,京华烟云&amp;gt;,如果"京华烟云"在普通词典,如果是反向切分,那么结果应该是&amp;lt;山,东北,京华烟云&amp;gt;,如果是正向切分应该是&amp;lt;山东,北京,华,烟云&amp;gt;,无论如何都分不出&amp;lt;山东,北,京华烟云&amp;gt;.这说明什么?说明"京华烟 云"是在那个专有词典,所以先切分出"京华烟云",然后剩下的"山东北"交由普通词典切分,明显是正向最大匹配的结果输出&amp;lt;山东,北&amp;gt;.当然 按照我们在第一篇文章的算法推导"山东北"的切分也会得出&amp;lt;山东,北&amp;gt;的结论,但是明显比正向最大匹配多几个判断步骤,既然效果一样,另外一 个更加简洁的方法也能说得通,那当然选择简便的方法了.所以初步判断百度采取的是正向最大匹配.&lt;/p&gt;&lt;p&gt;我们继续测试采用何种分词算法,为了减少 专有词典首先分词造成的影响,那么查询里面不能出现相对特殊的词汇,构筑查询"天才能量级",这里应该没有专有词典出现过的词汇,百度切分为&amp;lt;天 才,能量,级&amp;gt;,看来是正向最大匹配的结果.另外,如果所有查询词汇都出现在专有词典,那么采取的是何种方法?这样首先就得保证词汇都出现在专有词 典,这么保证这一点呢?我们构造查询"铺陈晓东方",百度切分为&amp;lt;铺,陈晓东,方&amp;gt;,可以看出"陈晓东"是在专有词典的所以先切分出来.另外 一个例子 "山东京城",百度切分为&amp;lt;山东,京城&amp;gt;,说明"东京"是在普通词典的.OK,构造查询"陈晓东京华烟云",通过前面分析可以看出两个词汇都 在专有词典里面,百度切分为&amp;lt;陈晓东,京华烟云&amp;gt;,说明对于专有词典词汇也是采取正向最大匹配或者双向最大匹配.那么使用反向最大匹配了吗? 构造查询例子"陈晓东方不败",首先我们肯定"陈晓东"和"东方不败"都是在专有词典出现的,如果是正向切分,那么应该是&amp;lt;陈晓东,方,不败 &amp;gt;或者&amp;lt;陈晓东,方,不,败&amp;gt;如果是反向切分则是&amp;lt;陈,晓,东方不败&amp;gt;,可以看出百度的切分是&amp;lt;陈晓东,方,不败 &amp;gt;或者&amp;lt;陈晓东,方,不,败&amp;gt;,说明采用的是正向最大匹配.通过分析,百度的词典不包含"不败"这个单词,所以实际上百度的切分结果是 &amp;lt;陈晓东,方,不,败&amp;gt;,很明显这和我们以前推导的算法是有矛盾的,所以以前的分析算法确实有问题,所以结论是百度采取的是正向最大匹配算 法.&lt;/p&gt;&lt;p&gt;重新归纳一下百度的分词系统:首先用专有词典采用最大正向匹配分词,切分出部分结果,剩余没有切分交给普通词典,同样采取正向最大匹配分词,最后输出结果.&lt;/p&gt;&lt;p&gt;另外,GOOGLE也是采用正向最大匹配分词算法,不过好像没有那个专用词典,所以很多专名都被切碎了.&lt;/p&gt;&lt;p&gt;从这点讲,GOOGLE在中文词典构建上比百度差些,还需要加把子力气才行,不过这也不是什么多难的事.&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hcbin/aggbug/2228220.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hcbin/archive/2011/10/28/2228220.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hcbin/archive/2011/10/13/2209649.html</id><title type="text">[网络编程] - MIME格式详细介绍[转]</title><summary type="text">来源：http://www.cnblogs.com/robinhood/articles/540464.htmlQ 什么是MIME？什么是MIME邮件？A MIME, 全称为“Multipurpose Internet Mail Extensions”, 比较确切的中文名称为“多用途互联网邮件扩展”。它是当前广泛应用的一种电子邮件技术规范，基本内容定义于RFC 2045-2049。自然，MIME邮件就是符合MIME规范的电子邮件，或者说根据MIME规范编码而成的电子邮件。在MIME出台之前，使用RFC 822只能发送基本的ASCII码文本信息，邮件内容如果要包括二进制文件、声音和动画等，实现起</summary><published>2011-10-13T01:40:00Z</published><updated>2011-10-13T01:40:00Z</updated><author><name>炎峰森林影</name><uri>http://www.cnblogs.com/hcbin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hcbin/archive/2011/10/13/2209649.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hcbin/archive/2011/10/13/2209649.html"/><content type="html">&lt;p&gt;来源：&lt;a href="http://www.cnblogs.com/robinhood/articles/540464.html"&gt;http://www.cnblogs.com/robinhood/articles/540464.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q 什么是MIME？什么是MIME邮件？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;A MIME, 全称为&amp;ldquo;Multipurpose Internet Mail Extensions&amp;rdquo;, 比较确切的中文名称为&amp;ldquo;多用途互联网邮件扩展&amp;rdquo;。它是当前广泛应用的一种电子邮件技术规范，基本内容定义于RFC 2045-2049。&lt;/p&gt;&lt;p&gt;自然，MIME邮件就是符合MIME规范的电子邮件，或者说根据MIME规范编码而成的电子邮件。&lt;/p&gt;&lt;p&gt;在MIME出台之前，使用RFC 822只能发送基本的ASCII码文本信息，邮件内容如果要包括二进制文件、声音和动画等，实现起来非常困难。MIME提供了一种可以在邮件中附加多种不同编码文件的方法，弥补了原来的信息格式的不足。实际上不仅仅是邮件编码，现在MIME经成为HTTP协议标准的一个部分。&lt;/p&gt;&lt;p&gt;下面举几个MIME邮件的例子，让我们先对MIME编码的格式有个直观的印象。例1是最简单的，只带纯文本正文，基本上就是RFC 822格式；例2复杂一些，包含纯文本和超文本正文；例3是最复杂的，包含纯文本正文、超文本正文、内嵌资源和文件附件。其中，行号和行号后的空格是为了分析方便而另外加的，&amp;ldquo;... ... ... ...&amp;rdquo;表示此处省略了大段编码。&lt;/p&gt;&lt;p&gt;例1&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;Date: Thu, 18 Apr 2002 09:32:45 +0800&lt;br/&gt;From: &amp;lt;bhw98@sina.com&amp;gt;&lt;br/&gt;To: &amp;lt;bhwang@jlonline.com&amp;gt;&lt;br/&gt;Subject: Test&lt;br/&gt;Mime-Version: 1.0&lt;br/&gt;Content-Type: text/plain; charset="iso-8859-1"&lt;br/&gt;&lt;br/&gt;This is a simple mail.&amp;nbsp;&lt;br/&gt; &lt;br/&gt;&lt;/div&gt;&lt;p&gt;例2&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;From: "bhw98" &amp;lt;bhw98@sina.com&amp;gt;&lt;br/&gt;Reply-To: bhw98@sina.com&lt;br/&gt;To: &amp;lt;bluesky7810@163.com&amp;gt;&lt;br/&gt;Subject: Re: help&lt;br/&gt;X-Mailer: Foxmail 4.2 [cn]&lt;br/&gt;Mime-Version: 1.0&lt;br/&gt;Content-Type: multipart/alternative;&lt;br/&gt; boundary="=====002_Dragon307572345230_====="&lt;br/&gt;&lt;br/&gt;This is a multi-part message in MIME format.&lt;br/&gt;&lt;br/&gt;--=====002_Dragon307572345230_=====&lt;br/&gt;Content-Type: text/plain; charset="GB2312"&lt;br/&gt;Content-Transfer-Encoding: quoted-printable&lt;br/&gt;&lt;br/&gt;bluesky7810=A3=AC=C4=FA=BA=C3=A3=A1&lt;br/&gt;&lt;br/&gt;=A1=A1=A1=A1=D4=DA=CF=C2=C6=AA=D7=EE=BA=F3=BF=C9=D2=D4=CF=C2=D4=D8=B0=A1=A3=AC=C4=E3&lt;br/&gt;... ...  ... ...&lt;br/&gt;=A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=A12003-04-07&lt;br/&gt;&lt;br/&gt;--=====002_Dragon307572345230_=====&lt;br/&gt;Content-Type: text/html; charset="GB2312"&lt;br/&gt;Content-Transfer-Encoding: quoted-printable&lt;br/&gt;&lt;br/&gt;&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&amp;gt;&lt;br/&gt;&amp;lt;HTML&amp;gt;&amp;lt;HEAD&amp;gt;&lt;br/&gt;&amp;lt;META content=3D"text/html; charset=3Dgb2312"=&lt;br/&gt; http-equiv=3DContent-Type&amp;gt;&lt;br/&gt;&amp;lt;META content=3D"MSHTML 5.00.2920.0" name=3DGENERATOR&amp;gt;&lt;br/&gt;... ...  ... ...&lt;br/&gt;&amp;lt;/HTML&amp;gt;&lt;br/&gt;&lt;br/&gt;--=====002_Dragon307572345230_=====--&lt;br/&gt; &lt;br/&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;例3&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;Return-Path: &amp;lt;bluesky7810@163.com&amp;gt;&lt;br/&gt;Delivered-To: bhw98@sina.com&lt;br/&gt;Received: (qmail 75513 invoked by alias); 20 May 2002 02:19:53 -0000&lt;br/&gt;Received: from unknown (HELO bluesky) (61.155.118.135)&lt;br/&gt; by 202.106.187.143 with SMTP; 20 May 2002 02:19:53 -0000&lt;br/&gt;Message-ID: &amp;lt;007f01c3111c$742fec00$0100007f@bluesky&amp;gt;&lt;br/&gt;From: "=?gb2312?B?wLbAtrXEzOwNCg==?=" &amp;lt;bluesky7810@163.com&amp;gt;&lt;br/&gt;To: "bhw98" &amp;lt;bhw98@sina.com&amp;gt;&lt;br/&gt;Cc: &amp;lt;bhwang@jlonline.com&amp;gt;&lt;br/&gt;Subject: =?gb2312?B?ztK1xLbgtK6/2rPM0PI=?=&lt;br/&gt;Date: Sat, 20 May 2002 10:03:36 +0800&lt;br/&gt;MIME-Version: 1.0&lt;br/&gt;Content-Type: multipart/mixed;&lt;br/&gt; boundary="----=_NextPart_000_007A_01C3115F.80DFC5E0"&lt;br/&gt;X-Priority: 3&lt;br/&gt;X-MSMail-Priority: Normal&lt;br/&gt;X-Mailer: Microsoft Outlook Express 5.00.2919.6700&lt;br/&gt;X-MimeOLE: Produced By Microsoft MimeOLE V5.00.2919.6700&lt;br/&gt;&lt;br/&gt;This is a multi-part message in MIME format.&lt;br/&gt;&lt;br/&gt;------=_NextPart_000_007A_01C3115F.80DFC5E0&lt;br/&gt;Content-Type: multipart/related; type="multipart/alternative";&lt;br/&gt; boundary="----=_NextPart_001_007B_01C3115F.80DFC5E0"&lt;br/&gt;&lt;br/&gt;------=_NextPart_001_007B_01C3115F.80DFC5E0&lt;br/&gt;Content-Type: multipart/alternative;&lt;br/&gt; boundary="----=_NextPart_002_007C_01C3115F.80DFC5E0"&lt;br/&gt;&lt;br/&gt;------=_NextPart_002_007C_01C3115F.80DFC5E0&lt;br/&gt;Content-Type: text/plain; charset="gb2312"&lt;br/&gt;Content-Transfer-Encoding: quoted-printable&lt;br/&gt;&lt;br/&gt;bhw98, =C4=E3=BA=C3!&lt;br/&gt;&lt;br/&gt;=D5=E2=CA=C7=CE=D2=D0=B4=B5=C4=B6=E0=B4=AE=BF=DA=CD=A8=D0=C5=B5=C4=B3=CC=D0=&lt;br/&gt;=F2, =C7=EB=D6=B8=BD=CC!&lt;br/&gt;&lt;br/&gt;------=_NextPart_002_007C_01C3115F.80DFC5E0&lt;br/&gt;Content-Type: text/html; charset="gb2312"&lt;br/&gt;Content-Transfer-Encoding: quoted-printable&lt;br/&gt;&lt;br/&gt;&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&amp;gt;&lt;br/&gt;&amp;lt;HTML&amp;gt;&amp;lt;HEAD&amp;gt;&amp;lt;TITLE&amp;gt;=C7=E7=C0=CA&amp;lt;/TITLE&amp;gt;&lt;br/&gt;&amp;lt;META content=3D"text/html; charset=3Dgb2312" http-equiv=3DContent-Type&amp;gt;&lt;br/&gt;&amp;lt;STYLE&amp;gt;&lt;br/&gt;BODY {&lt;br/&gt;     COLOR: #0033cc; FONT-FAMILY: =CB=CE=CC=E5, Arial, Helvetica; FONT-SIZE: =49 9pt; MARGIN-LEFT: 10px; MARGIN-TOP: 25px 50 }&lt;br/&gt;&amp;lt;/STYLE&amp;gt;&lt;br/&gt;&amp;lt;META content=3D"MSHTML 5.00.2920.0" name=3DGENERATOR&amp;gt;&amp;lt;/HEAD&amp;gt;&lt;br/&gt;&amp;lt;BODY background=3Dcid:007901c3111c$72b978a0$0100007f@bluesky =&lt;br/&gt;bgColor=3D#ffffff&amp;gt;&lt;br/&gt;&amp;lt;DIV&amp;gt;&lt;br/&gt;&amp;lt;DIV&amp;gt;bhw98, =C4=E3=BA=C3!&amp;lt;/DIV&amp;gt;&lt;br/&gt;&amp;lt;P&amp;gt;=D5=E2=CA=C7=CE=D2=D0=B4=B5=C4=B6=E0=B4=AE=BF=DA=CD=A8=D0=C5=B5=C4=B3=CC=58 =D0=F2, =C7=EB=D6=B8=BD=CC!&amp;lt;/P&amp;gt;&amp;lt;/DIV&amp;gt;&lt;br/&gt;&amp;lt;P&amp;gt; &amp;lt;/P&amp;gt;&amp;lt;/BODY&amp;gt;&amp;lt;/HTML&amp;gt;&lt;br/&gt;&lt;br/&gt;------=_NextPart_002_007C_01C3115F.80DFC5E0--&lt;br/&gt;&lt;br/&gt;------=_NextPart_001_007B_01C3115F.80DFC5E0&lt;br/&gt;Content-Type: image/jpeg; name="=?gb2312?B?x+fAyrGzvrAuSlBH?="&lt;br/&gt;Content-Transfer-Encoding: base64&lt;br/&gt;Content-ID: &amp;lt;007901c3111c$72b978a0$0100007f@bluesky&amp;gt;&lt;br/&gt;&lt;br/&gt;/9j/4AAQSkZJRgABAgEASABIAAD/7QVoUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA&lt;br/&gt;AQBIAAAAAQABOEJJTQPzAAAAAAAIAAAAAAAAAAA4QklNBAoAAAAAAAEAADhCSU0nEAAAAAAACgAB&lt;br/&gt;AAAAAAAAAAI4QklNA/UAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEA&lt;br/&gt;... ...  ... ...&lt;br/&gt;RxVw98Vawq12xQ44q0cKtHFDWKGsKt4EtiuKt4q//9k=&lt;br/&gt;&lt;br/&gt;------=_NextPart_001_007B_01C3115F.80DFC5E0--&lt;br/&gt;&lt;br/&gt;------=_NextPart_000_007A_01C3115F.80DFC5E0&lt;br/&gt;Content-Type: application/msword; name="readme.doc"&lt;br/&gt;Content-Transfer-Encoding: base64&lt;br/&gt;Content-Disposition: attachment; filename="readme.doc"&lt;br/&gt;&lt;br/&gt;0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAABAAAAJgAAAAAAAAAA&lt;br/&gt;EAAAKAAAAAEAAAD+////AAAAACUAAAD/////////////////////////////////////////////&lt;br/&gt;180 ////////////////////////////////////////////////////////////////////////////&lt;br/&gt;... ...  ... ...&lt;br/&gt;AAAAAAAAAAAAAAAAAAA=&lt;br/&gt;&lt;br/&gt;------=_NextPart_000_007A_01C3115F.80DFC5E0&lt;br/&gt;Content-Type: application/x-zip-compressed;&lt;br/&gt; name="=?gb2312?B?tuC0rr/azajQxbXE1LTC6y56aXA=?="&lt;br/&gt;Content-Transfer-Encoding: base64&lt;br/&gt;Content-Disposition: attachment;&lt;br/&gt; filename="=?gb2312?B?tuC0rr/azajQxbXE1LTC6y56aXA=?="&lt;br/&gt;&lt;br/&gt;UEsDBBQAAAAIAFKAoi7qOMOvLw0AAABWAAAUAAAAtuC0rr/azajQxbXE1LTC6y5kb2PtXHtwVNUZ&lt;br/&gt;/+4+kk3IQoAkBkRYQkSgbrKb7IYNEMwmm6ckG0jCI0boZneTbJJ9sNlAEsdOtFqd8Z846tQ6PhB1&lt;br/&gt;hrZTJoK0Vhgf1aGt4rMy6D8tdugfTjuOpcBIR9j+vvsIy4YkRNTRen87v/ud53cee+6557vn7L73&lt;br/&gt;... ...  ... ...&lt;br/&gt;zajQxbXE1LTC6y5kb2NQSwUGAAAAAAEAAQBCAAAAYQ0AAA==&lt;br/&gt;&lt;br/&gt;------=_NextPart_000_007A_01C3115F.80DFC5E0--&lt;br/&gt; &lt;br/&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q 在开始研究MIME邮件的时候，如何得到这样的源码？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;A 一些功能比较完善的邮件客户端软件，如微软的Outlook Express，国产的Foxmail等，都提供了查看和保存邮件源码(原始信息)的功能。在Foxmail中，选择邮件列表右键菜单的&amp;ldquo;原始信息&amp;rdquo;进行查看，主菜单的&amp;ldquo;文件-导出&amp;rdquo;进行保存。在Outlook Express中，对应的操作分别是&amp;ldquo;属性&amp;rdquo;和&amp;ldquo;另存为&amp;rdquo;。所保存的.eml文件，可以调用这些程序打开。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q 请介绍一下MIME邮件的组成？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;A 总体来说，MIME消息由消息头和消息体两大部分组成。现在我们关注的是MIME邮件，因此在以下的讨论中姑且称&amp;ldquo;消息&amp;rdquo;为&amp;ldquo;邮件&amp;rdquo;。在上面的例子中，例1的1-6行，例2的1&amp;mdash;8行，例3的1-18行，是邮件头；例1的8&amp;mdash;9行，例2的10&amp;mdash;82行，例3的20&amp;mdash;3128行，是邮件体。邮件头与邮件体之间以空行进行分隔，如例1的第7行，例2的第9行，例3的第19行。邮件头中不允许出现空行。有一些邮件不能被邮件客户端软件识别，显示的是原始码，就是因为首行是空行。&lt;/p&gt;&lt;p&gt;邮件头包含了发件人、收件人、主题、时间、MIME版本、邮件内容的类型等重要信息。每条信息称为一个域，由域名后加&amp;ldquo;: &amp;rdquo;和信息内容构成，可以是一行，较长的也可以占用多行。域的首行必须&amp;ldquo;顶头&amp;rdquo;写，即左边不能有空白字符（空格和制表符）；续行则必须以空白字符打头，且第一个空白字符不是信息本身固有的，解码时要过滤掉。如例2的7-8行，例3的4-5行，13-14行，分别属于一个域。&lt;/p&gt;&lt;p&gt;邮件体包含邮件的内容，它的类型由邮件头的&amp;ldquo;Content-Type&amp;rdquo;域指出。常见的简单类型有text/plain(纯文本)和text/html(超文本)。&lt;/p&gt;&lt;p&gt;例2和例3中出现的multipart类型，是MIME邮件的精髓。邮件体被分为多个段，每个段又包含段头和段体两部分，这两部分之间也以空行分隔。常见的multipart类型有三种：multipart/mixed, multipart/related和multipart/alternative。从它们的名称，不难推知这些类型各自的含义和用处。它们之间的层次关系可归纳为下图所示：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;+------------------------- multipart/mixed ----------------------------+&lt;br/&gt;|                                                                      |&lt;br/&gt;|  +----------------- multipart/related ------------------+            |&lt;br/&gt;|  |                                                      |            |&lt;br/&gt;|  |  +----- multipart/alternative ------+  +----------+  |  +------+  |&lt;br/&gt;|  |  |                                  |  | 内嵌资源 |  |  | 附件 |  |&lt;br/&gt;|  |  |  +------------+  +------------+  |  +----------+  |  +------+  |&lt;br/&gt;|  |  |  | 纯文本正文 |  | 超文本正文 |  |                |            |&lt;br/&gt;|  |  |  +------------+  +------------+  |  +----------+  |  +------+  |&lt;br/&gt;|  |  |                                  |  | 内嵌资源 |  |  | 附件 |  |&lt;br/&gt;|  |  +----------------------------------+  +----------+  |  +------+  |&lt;br/&gt;|  |                                                      |            |&lt;br/&gt;|  +------------------------------------------------------+            |&lt;br/&gt;|                                                                      |&lt;br/&gt;+----------------------------------------------------------------------+&lt;br/&gt;&lt;/div&gt;&lt;p&gt;可以看出，如果在邮件中要添加附件，必须定义multipart/mixed段；如果存在内嵌资源，至少要定义multipart/related段；如果纯文本与超文本共存，至少要定义multipart/alternative段。什么是&amp;ldquo;至少&amp;rdquo;？举个例子说，如果只有纯文本与超文本正文，那么在邮件头中将类型扩大化，定义为multipart/related，甚至multipart/mixed，都是允许的。&lt;/p&gt;&lt;p&gt;multipart诸类型的共同特征是，在段头指定&amp;ldquo;boundary&amp;rdquo;参数字符串，段体内的每个子段以此串定界。所有的子段都以&amp;ldquo;--&amp;rdquo;+boundary行开始，父段则以&amp;ldquo;--&amp;rdquo;+boundary+&amp;ldquo;--&amp;rdquo;行结束。段与段之间也以空行分隔。在邮件体是multipart类型的情况下，邮件体的开始部分(第一个&amp;ldquo;--&amp;rdquo;+boundary行之前)可以有一些附加的文本行，相当于注释，解码时应忽略。段间也可以有一些附加的文本行，不会显示出来，如果有兴趣，不妨验证一下。&lt;/p&gt;&lt;p&gt;结合boundary定界和multipart层次关系图，我们分析一下例2和例3的邮件体层次与段嵌套关系。&lt;/p&gt;&lt;p&gt;在例2中，10-12行是附加文本行，13-82行是multipart/alternative型的段，包含两个子段：13-30行是纯文本正文，32-79行是超文本正文。&lt;/p&gt;&lt;p&gt;在例3中，20-21行是附加文本行，22-3127行是multipart/mixed型的段，包含3个子段：22-171行是multipart/related段，173-1688行与1690-3125行是两个附件。multipart/related段又包含两个子段：27-61行是multipart/alternative段，63-169行是一个内嵌资源(图片)。multipart/alternative段又包含两个子段：31-48行是纯文本正文，40-59行是超文本正文。&lt;/p&gt;&lt;p&gt;例1只有纯文本正文，实际上属于multipart层次关系图中的一个特殊情况。如果非要避简就繁，写成下面的形式，也是完全符合MIME精神的。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;Date: Thu, 18 Apr 2002 09:32:45 +0800&lt;br/&gt;From: &amp;lt;bhw98@sina.com&amp;gt;&lt;br/&gt;To: &amp;lt;bhwang@jlonline.com&amp;gt;&lt;br/&gt;Subject: Test&lt;br/&gt;Mime-Version: 1.0&lt;br/&gt;Content-Type: multipart/alternative; boundary="{[(^_^)]}"&lt;br/&gt;--{[(^_^)]}&lt;br/&gt;Content-Type: text/plain; charset="iso-8859-1"&lt;br/&gt;Content-Transfer-Encoding: 7bit&lt;br /&gt;This is a simple mail.&lt;br /&gt;--{[(^_^)]}--&lt;br/&gt; &lt;br/&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q 在邮件头和段头中，有哪一些常见的域？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;A 在邮件头中，有很多从RFC 822沿用的域名，MIME也增加了一些。常见的标准域名和含义如下&lt;/p&gt;&lt;table cellpadding="1" cellspacing="0" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;域名&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;含义&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;添加者&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Received&lt;/td&gt;&lt;td&gt;传输路径&lt;/td&gt;&lt;td&gt;各级邮件服务器&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Return-Path&lt;/td&gt;&lt;td&gt;回复地址&lt;/td&gt;&lt;td&gt;目标邮件服务器&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Delivered-To&lt;/td&gt;&lt;td&gt;发送地址&lt;/td&gt;&lt;td&gt;目标邮件服务器&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Reply-To&lt;/td&gt;&lt;td&gt;回复地址&lt;/td&gt;&lt;td&gt;邮件的创建者&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;From&lt;/td&gt;&lt;td&gt;发件人地址&lt;/td&gt;&lt;td&gt;邮件的创建者&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;To&lt;/td&gt;&lt;td&gt;收件人地址&lt;/td&gt;&lt;td&gt;邮件的创建者&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cc&lt;/td&gt;&lt;td&gt;抄送地址&lt;/td&gt;&lt;td&gt;邮件的创建者&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Bcc&lt;/td&gt;&lt;td&gt;暗送地址&lt;/td&gt;&lt;td&gt;邮件的创建者&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Date&lt;/td&gt;&lt;td&gt;日期和时间&lt;/td&gt;&lt;td&gt;邮件的创建者&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Subject&lt;/td&gt;&lt;td&gt;主题&lt;/td&gt;&lt;td&gt;邮件的创建者&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Message-ID&lt;/td&gt;&lt;td&gt;消息ID&lt;/td&gt;&lt;td&gt;邮件的创建者&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;MIME-Version&lt;/td&gt;&lt;td&gt;MIME版本&lt;/td&gt;&lt;td&gt;邮件的创建者&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Content-Type&lt;/td&gt;&lt;td&gt;内容的类型&lt;/td&gt;&lt;td&gt;邮件的创建者&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Content-Transfer-Encoding&lt;/td&gt;&lt;td&gt;内容的传输编码方式&lt;/td&gt;&lt;td&gt;邮件的创建者&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;非标准的、自定义域名都以X-开头，例如X-Mailer, X-MSMail-Priority等，通常在接收和发送邮件的是同一程序时才能理解它们的意义。&lt;/p&gt;&lt;p&gt;在段头中，大致有如下一些域&lt;/p&gt;&lt;table cellpadding="1" cellspacing="0" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;域名&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;含义&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Content-Type&lt;/td&gt;&lt;td&gt;段体的类型&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Content-Transfer-Encoding&lt;/td&gt;&lt;td&gt;段体的传输编码方式&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Content-Disposition&lt;/td&gt;&lt;td&gt;段体的安排方式&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Content-ID&lt;/td&gt;&lt;td&gt;段体的ID&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Content-Location&lt;/td&gt;&lt;td&gt;段体的位置(路径)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Content-Base&lt;/td&gt;&lt;td&gt;段体的基位置&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;有的域除了值之外，还带有参数。值与参数、参数与参数之间以&amp;ldquo;;&amp;rdquo;分隔。参数名与参数值之间以&amp;ldquo;=&amp;rdquo;分隔。如例3的28-29行，Content-Type域的值为&amp;ldquo;multipart/alternative&amp;rdquo;，此外有一个参数boundary，值为"----=_NextPart_002_007C_01C3115F.80DFC5E0"。又如例3的第176行，Content-Disposition域的值为&amp;ldquo;attachment&amp;rdquo;，此外有一个参数filename，值为&amp;ldquo;readme.doc&amp;rdquo;。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span face="verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif" style="font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif;"&gt;Q Content-Type以及它们的参数有哪些形式？&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span face="verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif" style="font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif;"&gt;A Content-Type都是&amp;ldquo;主类型/子类型&amp;rdquo;的形式。主类型有text, image, audio, video, application, multipart, message等，分别表示文本、图片、音频、视频、应用、分段、消息等。每个主类型都可能有多个子类型，如text类型就包含plain, html, xml, css等子类型。以X-开头的主类型和子类型，同样表示自定义的类型，未向IANA正式注册，但大多已经约定成俗了。如application/x-zip-compressed是ZIP文件类型。在Windows中，注册表的&amp;ldquo;HKEY_CLASSES_ROOT\MIME\Database\Content Type&amp;rdquo;内列举了除multipart之外大部分已知的Content-Type。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span face="verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif" style="font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif;"&gt;关于参数的形式，RFC里有很多补充规定，有的允许带几个参数，较为常见的有&lt;/span&gt;&lt;/p&gt;&lt;table cellpadding="1" cellspacing="0" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;主类型&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;参数名&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;含义&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;text&lt;/td&gt;&lt;td&gt;charset&lt;/td&gt;&lt;td&gt;字符集&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;image&lt;/td&gt;&lt;td&gt;name&lt;/td&gt;&lt;td&gt;名称&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;application&lt;/td&gt;&lt;td&gt;name&lt;/td&gt;&lt;td&gt;名称&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;multipart&lt;/td&gt;&lt;td&gt;boundary&lt;/td&gt;&lt;td&gt;边界&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;其中字符集也能在Windows注册表的&amp;ldquo;HKEY_CLASSES_ROOT\MIME\Database\Charset&amp;rdquo;内见到。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q Content-Transfer-Encoding有哪些？有什么特点？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;A Content-Transfer-Encoding共有Base64, Quoted-printable, 7bit, 8bit, Binary等几种。其中7bit是缺省的编码方式。电子邮件源码最初设计为全部是可打印的ASCII码的形式。非ASCII码的文本或数据要编码成要求的格式，如上面的三个例子。Base64, Quoted-Printable是在非英语国家使用最广使的编码方式。Binary方式只具有象征意义，而没有任何实用价值。&lt;/p&gt;&lt;p&gt;Base64将输入的字符串或一段数据编码成只含有{'A'-'Z', 'a'-'z', '0'-'9', '+', '/'}这64个字符的串，'='用于填充。其编码的方法是，将输入数据流每次取6 bit，用此6 bit的值(0-63)作为索引去查表，输出相应字符。这样，每3个字节将编码为4个字符(3&amp;times;8 &amp;rarr; 4&amp;times;6)；不满4个字符的以'='填充。有的场合，以&amp;ldquo;=?charset?B?xxxxxxxx?=&amp;rdquo;表示xxxxxxxx是Base64编码，且原文的字符集是charset。如例3第7行"=?gb2312?B?wLbAtrXEzOwNCg==?="是由简体中文&amp;ldquo;蓝蓝的天&amp;rdquo;编码而成的。在段体内则直接编码，适当时机换行，MIME建议每行最多76个字符。如例3的1697-3125行，是一个ZIP文件的Base64编码。&lt;/p&gt;&lt;p&gt;Quoted-printable根据输入的字符串或字节范围进行编码，若是不需编码的字符，直接输出；若需要编码，则先输出'='，后面跟着以2个字符表示的十六进制字节值。有的场合，以&amp;ldquo;=?charset?Q?xxxxxxxx?=&amp;rdquo;表示xxxxxxxx是Quoted-printable编码，且原文的字符集是charset。在段体内则直接编码，适当时机换行，换行前额外输出一个'='。如例3的44-59行，是HTML文本的Quoted-printable编码。其中第45行&amp;ldquo;=C7=E7=C0=CA&amp;rdquo;原文是&amp;ldquo;晴朗&amp;rdquo;，因为&amp;ldquo;晴&amp;rdquo;的GB2312码是C7E7，&amp;ldquo;朗&amp;rdquo;的GB2312码是C0CA。第48、53、57行末尾只有孤零零的'='，表示这是由编码造成的软回车，而非原文固有的。&lt;/p&gt;&lt;p&gt;近年来，国内多数邮件服务器已经支持8bit方式，因此只在国内传输的邮件，特别是在邮件头中，可直接使用8bit编码，对汉字不做处理。如果邮件要出国，还是老老实实地按Base64或Quoted-printable编码才行。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q 什么是内嵌资源？它有哪些形式？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;A 内嵌资源也是MIME的一个发光点，它能使邮件内容变得生动活泼、丰富多彩。可在邮件的multipart/related框架内定义一些与正文关联的图片、动画、声音甚至CSS样式和脚本的段。通常在HTML正文内，使用超级链接与内嵌资源相联系。如在例3中，HTML正文53-54行，解码后为&lt;/p&gt;&lt;p&gt;&amp;lt;BODY background=cid:007901c3111c$72b978a0$0100007f@bluesky bgColor=#ffffff&amp;gt;&lt;/p&gt;&lt;p&gt;它指出用一个Content-ID为007901c3111c$72b978a0$0100007f@bluesky的图片作为背景(cid:xxxxxxxx也是一种超级链接)。而64-169行恰好就是这样一个内嵌资源。&lt;/p&gt;&lt;p&gt;除了用Content-ID进行联系外，还有另外一种常用形式：用普通超级连接和Content-Location。例如：&lt;/p&gt;&lt;p&gt;在HTML正文中，&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;... ...  ... ...&lt;br/&gt;&amp;lt;IMG SRC="http://www.dangdang.com/images/all/anti_joyo_dm_book.gif"&amp;gt;&lt;br/&gt;... ...  ... ...&lt;br/&gt;&amp;lt;IMG SRC="http://www.dangdang.com/dd2001/getimage_small.asp?id=486341"&amp;gt;&lt;br/&gt;... ...  ... ...&lt;br/&gt;&lt;/div&gt;&lt;p&gt;对应的内嵌资源为&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;Content-Type: image/gif; name="anti_joyo_dm_book.gif"&lt;br/&gt;Content-Transfer-Encoding: base64&lt;br/&gt;Content-Location: http://www.dangdang.com/images/all/anti_joyo_dm_book.gif&lt;br/&gt;... ... ... ...&lt;br/&gt;Content-Type: application/octet-stream; name="getimage_small.asp?id=486341"&lt;br/&gt;Content-Transfer-Encoding: base64&lt;br/&gt;Content-Location: http://www.dangdang.com/dd2001/getimage_small.asp?id=486341&lt;br/&gt;... ... ... ...&lt;br/&gt;&lt;/div&gt;&lt;p&gt;另外，下面两行是等效的&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;Content-Location: http://www.dangdang.com/images/all/anti_joyo_dm_book.gif&lt;br/&gt;&lt;/div&gt;&lt;p&gt;与&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;Content-Location: anti_joyo_dm_book.gif&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q 邮件病毒如何利用附件和内嵌资源传播？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;A 有的邮件附件可能带有病毒，容易理解。附件毕竟是文件，也好预防，不轻易打开就是了。但内嵌资源是在浏览邮件内容时就要访问的，若其中藏有病毒或恶意代码，你在不知不觉中就中招了。如前两年曾经在全球范围内流行的Nimda病毒，功能性源码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;MIME-Version: 1.0&lt;br/&gt;Content-Type: multipart/related;&lt;br/&gt; type="multipart/alternative";&lt;br/&gt; boundary="====_ABC1234567890DEF_===="&lt;br/&gt;&lt;br/&gt;--====_ABC1234567890DEF_====&lt;br/&gt;Content-Type: multipart/alternative;&lt;br/&gt; boundary="====_ABC0987654321DEF_===="&lt;br/&gt;&lt;br/&gt;--====_ABC0987654321DEF_====&lt;br/&gt;Content-Type: text/html;&lt;br/&gt; charset="iso-8859-1"&lt;br/&gt;Content-Transfer-Encoding: 7bit&lt;br/&gt;&lt;br/&gt;&amp;lt;HTML&amp;gt;&lt;br/&gt;&amp;lt;HEAD&amp;gt;&amp;lt;/HEAD&amp;gt;&lt;br/&gt;&amp;lt;BODY bgColor=#ffffff&amp;gt;&lt;br/&gt;&amp;lt;iframe src=cid:EA4DMGBP9p height=0 width=0&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br/&gt;&amp;lt;/BODY&amp;gt;&amp;lt;/HTML&amp;gt;&lt;br/&gt;&lt;br/&gt;--====_ABC0987654321DEF_====--&lt;br/&gt;&lt;br/&gt;--====_ABC1234567890DEF_====&lt;br/&gt;Content-Type: audio/x-wav; name="readme.exe"&lt;br/&gt;Content-Transfer-Encoding: base64&lt;br/&gt;Content-ID: &amp;lt;EA4DMGBP9p&amp;gt;&lt;br/&gt;&lt;br/&gt;TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA&lt;br/&gt;AAAA2AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1v&lt;br/&gt;ZGUuDQ0KJAAAAAAAAAA11CFvcbVPPHG1TzxxtU88E6pcPHW1TzyZqkU8dbVPPJmqSzxytU88cbVO&lt;br/&gt;... ...  ... ...  ... ...  ... ...&lt;br/&gt;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=&lt;br/&gt;&lt;br/&gt;--====_ABC1234567890DEF_====&lt;br/&gt; &lt;br/&gt;&lt;/div&gt;&lt;p&gt;它将一个可执行文件作为资源嵌入了框架型页面，却声明这段可执行代码是波形声音类型。由于当时微软的IE(版本5.0及以下)存在重大安全漏洞，没有检查Content-Type与name的扩展名是否匹配，于是就被轻易骗过了，致使点选或打开邮件时自动运行了这个&amp;ldquo;readme.exe&amp;rdquo;，机器就感染上病毒。带毒的机器利用地址簿向别人发送带毒的邮件，一传十，十传百，Nimda蠕虫大行其道。&lt;/p&gt;&lt;p&gt;纵观历史，病毒刚出来时是厉害，但没有任何一种能够持续肆虐下去。Nimda如此，SARS亦当如此。曰：&amp;ldquo;多难兴邦，众志成城&amp;rdquo;，又曰：&amp;ldquo;非典终将倒下，城市精神永存&amp;rdquo;，相信我们定能很快战胜&amp;ldquo;非典&amp;rdquo;!&lt;/p&gt;&lt;p&gt;病毒库升级是跟在新病毒屁股后进行的，不要过分依赖杀毒软件。一个良好的习惯是关闭邮件预览功能，或者设定预览纯文本部分，先查看邮件源码，确信排除病毒嫌疑后再打开。对陌生人发来的带超文本正文的邮件，尤其要当心。永远不要在邮件客户端软件内直接打开附件。&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;strong&gt;Q 一些垃圾邮件采取隐藏发件人的方式，如何追查它们来自哪里？&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;A 从上面的邮件头域名表中可以看出，邮件的创建者可以掌握大部分的域的内容，但Received等域由各级服务器自动添加，发件人是鞭长莫及。垃圾邮件一般采用了群发软件发送，邮件头的From域(发件人地址)可以任意伪造，甚至写成收件人地址(收到了自己并没有发过的垃圾邮件，气愤吧？)。查看Received域(传输路径)链可以找到真正的出处。每个服务器添加的Received语句都在邮件首，故最下面一个Received就包含了发件人所用的SMTP或HTTP服务器，及最初的网关外部IP地址。&lt;/div&gt;&lt;div&gt;Receive语句的基本格式是：from A by B。A为发送方，B为接收方。例如：&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;Received: (qmail 45304 invoked from network); 4 May 2003 17:05:47 -0000&lt;br/&gt;Received: from unknown (HELO bjapp9.163.net) (202.108.255.197)&lt;br/&gt; by 202.106.182.244 with SMTP; 4 May 2003 17:05:47 -0000&lt;br/&gt;Received: from localhost (localhost [127.0.0.1])&lt;br/&gt; by bjapp9.163.net (Postfix) with SMTP id E1C761D84C631&lt;br/&gt; for &amp;lt;bhw98@sina.com&amp;gt;; Mon,  5 May 2003 01:07:26 +0800 (CST)&lt;br/&gt;Received: from fanyingxxxx@tom.com (unknown [211.99.162.194])&lt;br/&gt; by bjapp9.163.net (Coremail) with SMTP id OgEAAM1ItT7MNaLC.1&lt;br/&gt; for &amp;lt;bhw98@sina.com&amp;gt;; Mon, 05 May 2003 01:07:26 +0800 (CST)&lt;br/&gt;&lt;/div&gt;&lt;p&gt;3.net (Coremail 202.108.255.197?) &amp;rarr; bjapp9.163.net (Postfix, 202.108.255.197?) &amp;rarr; 202.106.182.244。恰好出现了发件人邮箱fanyingxxxx@tom.com，但多数情况不一定能列出来。&lt;/p&gt;&lt;p&gt;此例的localhost [127.0.0.1]，意味着bjapp9.163.net上安装了邮件服务代理性质的软件。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/hcbin/aggbug/2209649.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hcbin/archive/2011/10/13/2209649.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hcbin/archive/2011/09/18/2180352.html</id><title type="text">[其它] - 为什么中国的程序员技术偏低</title><summary type="text">来源：http://www.cnbeta.com/articles/155374.htm作者:飘飘渺渺首先来说一个高级程序员并非靠自己读几本书写几万行代码就能练就的，我更关注于低层的环境，也就是程序员实实在在的工作环境。因为程序员的高低还得从实际的工作来衡量，而非其它。所以我想说的是，中国的软件公司的性质直接导致程序员的水平的高低。而我所说的软件公司，不是指某个或者某几个，而是指主流的软件公司，大众型的软件公司。所以我希望那些已经步入一个理想的公司的程序员理解我这篇文章的定位。软件公司的无偿加班对程序员的影响：国内的软件公司中程序员是常常加班的，每日加，周未也常加。基于这种性质，出现了一种很莫</summary><published>2011-09-18T05:10:00Z</published><updated>2011-09-18T05:10:00Z</updated><author><name>炎峰森林影</name><uri>http://www.cnblogs.com/hcbin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hcbin/archive/2011/09/18/2180352.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hcbin/archive/2011/09/18/2180352.html"/><content type="html">&lt;p&gt;来源：&lt;a href="http://www.cnbeta.com/articles/155374.htm"&gt;http://www.cnbeta.com/articles/155374.htm&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;作者:&lt;a id="Header1_HeaderTitle" class="headermaintitle" href="http://www.cnblogs.com/shiyuxinglan/" style="color: #003366; text-decoration: none; padding: 0px; margin: 0px;"&gt;飘飘渺渺&lt;/a&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;首先来说一个高级程序员并非靠自己读几本书写几万行代码就能练就的，我更关注于低层的环境，也就是程序员实实在在的工作环境。因为程序员的高低还得从实际的工作来衡量，而非其它。所以我想说的是，中国的软件公司的性质直接导致程序员的水平的高低。而我所说的软件公司，不是指某个或者某几个，而是指主流的软件公司，大众型的软件公司。所以我希望那些已经步入一个理想的公司的程序员理解我这篇文章的定位。&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight: bold; padding: 0px; margin: 0px;"&gt;软件公司的无偿加班对程序员的影响：&lt;/span&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;国内的软件公司中程序员是常常加班的，每日加，周未也常加。基于这种性质，出现了一种很莫名其妙的现象：每天程序员的实际下班时间总是要晚于规定下班时间，至于晚一个小时还是两个小时还是更多这就另说，总之，程序员这份工作，如果按时下班反而自己感觉自己像是做贼似的。表面上公司并没有强迫谁加班，但实际上在潜移默化中有一种威慑力，要求你要多为公司工作几个小时，而且表面上你所工作的这几个小时还是你自己愿意的。正因为是&amp;ldquo;自己愿意的&amp;rdquo;，所以公司更有理由认为是无偿的。&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;还有就是周未加班，一般周未加班是因为&amp;ldquo;忙&amp;rdquo;（关于这个带引号的&amp;ldquo;忙&amp;rdquo;，见&amp;ldquo;软件公司的&amp;lsquo;忙&amp;rsquo;对程序员的影响&amp;rdquo;）。但周未加班一般是无偿的，至于法律所规定的那种&amp;ldquo;偿&amp;rdquo;就更尝不上了。不过一般公司是这样规定的：周未加班可以倒休。关于倒休，一般是周未的班真的加了，倒休却遥遥无期，原因很简单，公司&amp;ldquo;忙&amp;rdquo;&amp;nbsp;嘛！&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;这种情况对程序员的影响：消极、软弱无主见、虚伪、对前途渺茫。&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;span style="font-weight: bold; padding: 0px; margin: 0px;"&gt;软件公司的&amp;ldquo;忙&amp;rdquo;对程序员的影响：&lt;/span&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;软件公司的&amp;ldquo;忙&amp;rdquo;其实有时也是真忙，从原因来说，软件公司认为是程序员（其实也有其他员工，但本文不涉及讨论）造成的，程序员认为公司造成的。而根据&amp;ldquo;一个巴掌拍不响&amp;rdquo;原则来看，应该是公司与程序员合作不协调出现的恶性循环造成的。深层原因大家自己研究去吧。不过从我这里的表象来看，这种&amp;ldquo;忙&amp;rdquo;有这么几点，这几点如果不代表大家的意见，大家可以补充：&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;**项目开发与计划脱节，表现为项目开发慢于计划。&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;**突如其来的事件。&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;**为某种说不清道不明的原因，像是作秀。&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;**假忙。&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;**真忙。&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;上面说的第一种情况最常见，这涉及到软件工程的话题，其实也是软件公司做不大，程序员水平提不高的核心。而&amp;ldquo;软件公司做不大&amp;rdquo;已有前辈文章《浅谈:国内软件公司为何无法做大做强?》中说过了，而&amp;ldquo;程序员水平提不高&amp;rdquo;本文所言即是，所以这个原因大家读完这两篇自己体会吧。&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;上面说的第二种情况也常有，比如偶尔赶个标书，比如客户那里突然出现了BUG，急着去改等等。&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;第三种情况就很让人晕菜了，有点无病呻吟的感觉，比如不知道从哪里冒出一个会议，开到个七八点；&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;第四种情况很特别，也比较常见，大家同室坐、彼此各自心。一片共同耕作的美好景象，但果实见不到两颗豆呢。这可是大家齐心虚度时光。程序员可以拿出这个时间提高自己吗？当然不可以了，你表面上还是得干活呢。&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;第五种情况就不说了，因为这是正根。&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;总之软件公司是&amp;ldquo;忙&amp;rdquo;的，一般是以上三种&amp;ldquo;忙&amp;rdquo;，偶尔这三种都没有了，第四种就马上出来的。&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;这种情况对程序员的影响：混乱无序、怨由心生、虚伪做作、学习时间少。&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;span style="font-weight: bold; padding: 0px; margin: 0px;"&gt;软件公司的流程不规范对程序员的影响：&lt;/span&gt;&lt;br style="font-weight: bold; padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;无像样的需求、无像样的设计、没有测试、没有文档、没有维护（所谓维护也大都是客户测试出BUG来改一改）。&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;其实说到需求这一块也并非完全是软件公司的问题，大多数情况下，客户也是根据程序员直接上来编码后暴露出来的问题才渐渐明白自己的需求是什么的。&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;ldquo;什么都没有&amp;rdquo;的问题在于，什么也不清楚，如果写一堆以不变应万变的代码，第一，时间不允许，第二，难度太大。要是稀里糊涂去实现，扩展与维护性又差，整个一堆豆腐渣工程，总之是没法下手。长了一堆&amp;ldquo;打铁&amp;rdquo;技巧，神不像神，程序员不像程序员的。&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;这种情况对程序员的影响：无规划性、代码质量低、手忙脚乱、技术永远停留在&amp;ldquo;打铁&amp;rdquo;水平。&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;软件公司对程序员员工的&amp;ldquo;全能型&amp;rdquo;要求对程序的影响：&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;装系统、修打印机、写文档、编代码、见客户、扫地搬桌子、接网线，在国内软件公司中程序员做什么事都有可能。单单说技术方面，也是要求事事能做，看一下招聘要求就知道了。&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;这种情况对程序员影响：术业无专攻&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;span style="font-weight: bold; padding: 0px; margin: 0px;"&gt;软件公司的工资拖欠对程序员的影响：&lt;/span&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;很悲哀，这是存在的。我向来认为一个员工与公司合作的最底线应该是按时按量发工资。但很多公司打破了这个底线。一个朋友开玩笑地说过：&amp;ldquo;家庭有钱，谁干程序员呀！&amp;rdquo;这话虽只可信一半，但是从国内情况来看，程序员的生活质量还是不高的，工资的拖欠直接影响到程序员的心态，甚至影响到程序员的生活。&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;这种情况对程序员影响：低调、迷茫、心态不稳、思想徘徊、生活困难。&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;span style="font-weight: bold; padding: 0px; margin: 0px;"&gt;软件公司对软件开发的要求对程序员的影响：&lt;/span&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;软件公司对软件开发的要求一般是实现即可。如果说写一个和记事本一样的程序，公司感觉程序员应该在一天内搞定；如果写一个WPS，公司也就感觉程序员应该在两到三个月搞定。这不是浮夸，事实就是这样的。公司所着眼的点在于&amp;ldquo;就这么一点功能&amp;rdquo;，而非在于&amp;ldquo;怎么实现这&amp;lsquo;一点&amp;rsquo;功能。&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;这种情况对程序员的影响：开发难度大、维护难度大、压力大、难沟通。&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;span style="font-weight: bold; padding: 0px; margin: 0px;"&gt;软件公司的承诺对程序员的影响：&lt;/span&gt;&lt;br style="font-weight: bold; padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;国内软件公司一般实际行动能力差，但没理难说话，他们也知道自己没理，所以比较爱承诺，把实际问题抛向以后解决。然而承诺也只是口头的，有一点&amp;ldquo;我以人格担保&amp;rdquo;的意思。不过一般情况下，国内的程序员还是比较有忍耐能力的（从上文来看不忍耐还能混吗），但公司层面的&amp;ldquo;人格&amp;rdquo;却是不可信，多承诺少兑现，员工面试时听到的说话到干了两年走了都没做到的事根本不少见。然而路遥马乏力，日久人变心，这样的结果往往是使公司与员工走入恶性循环。&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;这种情况对程序员的影响：不满、被动、拿不起放不下、进退两难。&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;span style="font-weight: bold; padding: 0px; margin: 0px;"&gt;结论：&lt;/span&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;消极、软弱无主见、虚伪、对前途渺茫、混乱无序、怨由心生、虚伪做作、学习时间少、无规划性、代码质量低、手忙脚乱、技术永远停留在&amp;ldquo;打铁&amp;rdquo;水平、术业无专攻、低调、迷茫、心态不稳、思想徘徊、生活困难、开发难度大、维护难度大、压力大、难沟通、不满、被动、拿不起放不下、进退两难。&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;上面这些短语概括了程序员的性格、心态、生活环境、工作环境等方面，它们就像毒素一样，日久能把一个健康的程序员毁掉。在这样的环境下，还问为什么你的技术这么低？太搞笑了。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hcbin/aggbug/2180352.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hcbin/archive/2011/09/18/2180352.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hcbin/archive/2011/08/20/2146902.html</id><title type="text">[HTML5] - 让IE浏览器支持HTML5标准的方法</title><summary type="text">来源：http://www.iefans.net/ieliulanqi-zhichi-html5-fangfa/自HTML5标准的提出就得到非常多的关注，而作为全球使用用户最多的IE浏览器能够支持HTML5标准也是大家备受关注一个问题，上周微软在技术大会上就表示目前微软正在开发的IE9将更加支持HTML5标准，但对于IE9是否将完全支持HTML5所有的标准，微软却表现的有点含糊其辞。HTML5标准能为网页带来更高效更洁净的代码，只有微软参与HTML5的设计工作，才能让IE浏览器识别更多的新元素。HTML5标准预计是在2022年向全世界发布，虽然目前距他发布的日期还有3年左右的时间，但是我认为它</summary><published>2011-08-20T00:35:00Z</published><updated>2011-08-20T00:35:00Z</updated><author><name>炎峰森林影</name><uri>http://www.cnblogs.com/hcbin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hcbin/archive/2011/08/20/2146902.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hcbin/archive/2011/08/20/2146902.html"/><content type="html">&lt;p&gt;来源：&lt;a href="http://www.iefans.net/ieliulanqi-zhichi-html5-fangfa/"&gt;http://www.iefans.net/ieliulanqi-zhichi-html5-fangfa/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;自HTML5标准的提出就得到非常多的关注，而作为全球使用用户最多的IE浏览器能够支持HTML5标准也是大家备受关注一个问题，上周微软在技术大会上就表示目前微软正在开发的IE9将更加支持HTML5标准，但对于IE9是否将完全支持HTML5所有的标准，微软却表现的有点含糊其辞。HTML5标准能为网页带来更高效更洁净的代码，只有微软参与HTML5的设计工作，才能让IE浏览器识别更多的新元素。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;HTML5标准预计是在2022年向全世界发布，虽然目前距他发布的日期还有3年左右的时间，但是我认为它距离我们并不是那么遥远，目前很多网站的设计和开发都是在采用HTML5的标准。在HTML5标准的制定和推广方面，苹果、Google、Opera和Mozilla等知名的浏览器厂商都表现的比较积极，微软现在也开始付出行动了，从上周微软在技术大会公布的IE9细节来看，微软将采取一种谨慎的态度涉足网页标准。微软也曾表示：IE浏览器将以标准HTML5为核心。但是微软的最新浏览器IE8及以下IE版本对HTML5标签的支持是有限的，我们可以通过在网页中添加脚本的方式来解决目前IE浏览器对HTML5支持的问题。&lt;/p&gt;&lt;p&gt;让IE(包括IE6)支持HTML5元素，我们需要在HTML头部添加以下JavaScript，这是一个简单的document.createElement声明，利用条件注释针对IE来调用这个js文件。Opera，FireFox等其他非IE浏览器就会忽视这段代码，也不会存在http请求。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;&amp;ndash;[if IE]&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;script &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;src&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;=&amp;rdquo;http://html5shiv.googlecode.com/svn/trunk/html5.js&amp;rdquo;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;[endif]&amp;ndash;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;上面这段代码仅会在IE浏览器下运行，还有一点需要注意，在页面中调用html5.js文件必须添加在页面的head元素内，因为IE浏览器必须在元素解析前知道这个元素，所以这个js文件不能在页面底部调用。&lt;/p&gt;&lt;p&gt;这个html5的js文件是作者把他放在Google code project上提供给大家可以直接调用的，当然，如果觉得这样会影响你的网页打开速度，你可以把html5的js文件直接下载下来让后上传到自己的服务器单独调用。&lt;/p&gt;&lt;p&gt;以下是html5的js文件中的代码:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(){&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;@cc_on!@&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; e &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &amp;ldquo;abbr,article,aside,audio,canvas,datalist,details,dialog,eventsource,figure,footer,header,hgroup,mark,menu,meter,nav,output,progress,section,time,video&amp;rdquo;.split(&amp;rsquo;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;),i=e.length;while(i&amp;ndash;){document.createElement(e[i])}})()&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;除了在网页中调用包含以上代码的js文件来让IE浏览器支持HTML5元素以外，你也可以以下面这种方式把代码直接添加到网页中。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;&amp;ndash;[if IE]&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&lt;br /&gt;(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;(){&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;!&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;@cc_on!@&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;0&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;)&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; e &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; &amp;ldquo;abbr,article,aside,audio,canvas,datalist,details,dialog,eventsource,figure,footer,header,hgroup,mark,menu,meter,nav,output,progress,section,time,video&amp;rdquo;.split(&amp;rsquo;,&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;),i=e.length;while(i&amp;ndash;){document.createElement(e[i])}})()&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;![endif]&amp;ndash;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;IE开发经理艾德里安巴特曼（Adrian Bateman ）就曾表示，IE团队希望分享自己对HTML5的看法，并参与制定该标准的讨论。巴特曼表示，尽管目前IE团队更多是提出问题，而非给出解决办法，但是公开讨论正是推动HTML5发展的最佳方式。相信无论IE浏览器是否能够继续支持HTML5标准，HTML5标准在全球广泛的使用已经是大势所趋。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hcbin/aggbug/2146902.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hcbin/archive/2011/08/20/2146902.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hcbin/archive/2011/08/09/2132190.html</id><title type="text">[现实] - 什么叫做现实</title><summary type="text">来源：网络</summary><published>2011-08-09T05:52:00Z</published><updated>2011-08-09T05:52:00Z</updated><author><name>炎峰森林影</name><uri>http://www.cnblogs.com/hcbin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hcbin/archive/2011/08/09/2132190.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hcbin/archive/2011/08/09/2132190.html"/><content type="html">&lt;p&gt;来源：网络&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/115203/2011080913513481.gif" alt="" style="display: block; margin-left: auto; margin-right: auto;" /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hcbin/aggbug/2132190.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hcbin/archive/2011/08/09/2132190.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
