<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_沉于思考，默默学习！</title><subtitle type="text">你不能预知明天，但你可以利用今天。你不能样样顺利，但你可以事事尽力!</subtitle><id>http://feed.cnblogs.com/blog/u/71819/rss</id><updated>2012-05-15T06:27:20Z</updated><author><name>程默</name><uri>http://www.cnblogs.com/chengmo/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chengmo/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/71819/rss"/><entry><id>http://www.cnblogs.com/chengmo/archive/2011/02/19/1958657.html</id><title type="text">由编码识别遇到问题，思考utf8编码正则表达式（php版本）</title><summary type="text">起因：最近遇到一件事情，一个接口能够接收传入编码可能是utf-8,gbk 两种。 做过编码方面转换的同学应该知道的，是什么编码不会在字符串里面有什么标记位的。不过utf-8编码有特殊性，因此可以通过正则表达式来检查。只要发现是utf-8编码。就转换，不是utf-8就当gbk处理。 编码一些常见问题可以查看：由web程序出现乱码开始挖掘(Bom头、字符集与乱码）行动：知道这个原理，马上领任务，开始工作。 想到php版本有个mbstring模块可以进行编码检测转换：问题：问题： 目前编码集合只有这样6个维度：php得到维度代码运行结果： 通过上面6个维度得到得到对应的正则表达式：[\x01-\x7</summary><published>2011-02-19T13:59:00Z</published><updated>2011-02-19T13:59:00Z</updated><author><name>程默</name><uri>http://www.cnblogs.com/chengmo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chengmo/archive/2011/02/19/1958657.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chengmo/archive/2011/02/19/1958657.html"/><content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;起因：&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;最近遇到一件事情，一个接口能够接收传入编码可能是utf-8,gbk 两种。 做过编码方面转换的同学应该知道的，是什么编码不会在字符串里面有什么标记位的。不过utf-8编码有特殊性，因此可以通过正则表达式来检查。只要发现是utf-8编码。就转换，不是utf-8就当gbk处理。 编码一些常见问题可以查看：&lt;a href="http://www.cnblogs.com/chengmo/archive/2010/10/30/1864004.html"&gt;由web程序出现乱码开始挖掘(Bom头、字符集与乱码）&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;行动：&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;知道这个原理，马上领任务，开始工作。 想到php版本有个mbstring模块可以进行编码检测转换：&lt;/p&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;?&lt;/span&gt;php&lt;br/&gt;&lt;span style="color: #008000;"&gt;//当前编码是gbk&lt;/span&gt;&lt;br/&gt;$str="&lt;span style="color: #8b0000;"&gt;中国&lt;/span&gt;";&lt;br/&gt;$aStrList=&lt;a href="http://www.php.net/array" style="color: #ffa500;"&gt;array&lt;/a&gt;($str,iconv('&lt;span style="color: #8b0000;"&gt;gbk&lt;/span&gt;','&lt;span style="color: #8b0000;"&gt;utf-8&lt;/span&gt;',$str));&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.php.net/foreach" style="color: #0000ff;"&gt;foreach&lt;/a&gt; ($aStrList &lt;a href="http://www.php.net/as" style="color: #0000ff;"&gt;as&lt;/a&gt; $v)&lt;br/&gt;{&lt;br/&gt;&lt;a href="http://www.php.net/echo" style="color: #0000ff;"&gt;echo&lt;/a&gt; mb_convert_encoding($v,'&lt;span style="color: #8b0000;"&gt;gbk&lt;/span&gt;','&lt;span style="color: #8b0000;"&gt;utf-8,gbk&lt;/span&gt;'),"&lt;span style="color: #8b0000;"&gt;\r\n&lt;/span&gt;";&lt;br/&gt;}&amp;nbsp;运行结果：&lt;a href="http://images.cnblogs.com/cnblogs_com/chengmo/201102/201102192014079712.png"&gt;&lt;img height="166" width="255" src="http://images.cnblogs.com/cnblogs_com/chengmo/201102/201102192014073824.png" alt="image" border="0" title="image" style="display: inline; border: 0px;" /&gt;&lt;/a&gt; &amp;nbsp;两个不同编码的&amp;ldquo;中国&amp;rdquo;，用一个函数mb_convert_encoding就可以自动转换成gbk编码。首页，尝试用utf-8解码，如果出现问题，就会用gbk转码。看来问题解决了，哈哈，可以交差了&amp;hellip;&amp;hellip;&amp;nbsp;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;问题：&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;发布后，平静了几天，突然接到反馈：有中文：&amp;rdquo;袁小&amp;rdquo;解码出错。⊙﹏⊙b汗 &amp;hellip;&amp;hellip; ,想&amp;hellip;&amp;hellip;(难道php内置检测模块有问题，或是我哪里欠缺&amp;hellip;&amp;hellip;)&lt;a href="http://images.cnblogs.com/cnblogs_com/chengmo/201102/201102192014077171.png"&gt;&lt;img height="356" width="490" src="http://images.cnblogs.com/cnblogs_com/chengmo/201102/201102192014074107.png" alt="image" border="0" title="image" style="display: inline; border: 0px;" /&gt;&lt;/a&gt; ⊙﹏⊙b汗&amp;hellip;&amp;hellip;  看来果然有问题，查询手册：&lt;strong&gt;mbstring 模块编码检查，只是识别字符串部分编码，发现与某个字符集匹配上，就认为它属于那种编码。 这不属于它的bug,因为字符串本身没有编码信息标识，没有那个语言能够完全检测通过。 &lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;问题：&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;能不能自己写一个检查正则表达式看下到底怎么样呢？要写正则表达式，首先须了解utf8编码规范，查看：&lt;a href="http://zh.wikipedia.org/zh/UTF-8"&gt;http://zh.wikipedia.org/zh/UTF-8&lt;/a&gt;&amp;nbsp;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chengmo/201102/201102192014081250.png"&gt;&lt;img height="246" width="656" src="http://images.cnblogs.com/cnblogs_com/chengmo/201102/201102192014084597.png" alt="image" border="0" title="image" style="display: inline; border: 0px;" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;目前编码集合只有这样6个维度：php得到维度代码&lt;/p&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;?&lt;/span&gt;php&lt;br/&gt;&lt;span style="color: #008000;"&gt;//得到utf8字编码各个维度的范围 &lt;/span&gt;&lt;br/&gt;&lt;a href="http://www.php.net/echo" style="color: #0000ff;"&gt;echo&lt;/a&gt; &lt;a href="http://www.php.net/base_convert" style="color: #ffa500;"&gt;base_convert&lt;/a&gt;('&lt;span style="color: #8b0000;"&gt;1111111&lt;/span&gt;',2,16),"&lt;span style="color: #8b0000;"&gt;\r\n&lt;/span&gt;";&lt;span style="color: #008000;"&gt;//维度1&lt;/span&gt;&lt;br/&gt;&lt;a href="http://www.php.net/echo" style="color: #0000ff;"&gt;echo&lt;/a&gt; &lt;a href="http://www.php.net/base_convert" style="color: #ffa500;"&gt;base_convert&lt;/a&gt;('&lt;span style="color: #8b0000;"&gt;10000000&lt;/span&gt;',2,16),&lt;a href="http://www.php.net/base_convert" style="color: #ffa500;"&gt;base_convert&lt;/a&gt;('&lt;span style="color: #8b0000;"&gt;10111111&lt;/span&gt;',2,16),"&lt;span style="color: #8b0000;"&gt;\r\n&lt;/span&gt;";&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.php.net/echo" style="color: #0000ff;"&gt;echo&lt;/a&gt; &lt;a href="http://www.php.net/base_convert" style="color: #ffa500;"&gt;base_convert&lt;/a&gt;('&lt;span style="color: #8b0000;"&gt;11000000&lt;/span&gt;',2,16),&lt;a href="http://www.php.net/base_convert" style="color: #ffa500;"&gt;base_convert&lt;/a&gt;('&lt;span style="color: #8b0000;"&gt;11011111&lt;/span&gt;',2,16),"&lt;span style="color: #8b0000;"&gt;\r\n&lt;/span&gt;";&lt;span style="color: #008000;"&gt;//维度2&lt;/span&gt;&lt;br/&gt;&lt;a href="http://www.php.net/echo" style="color: #0000ff;"&gt;echo&lt;/a&gt; &lt;a href="http://www.php.net/base_convert" style="color: #ffa500;"&gt;base_convert&lt;/a&gt;('&lt;span style="color: #8b0000;"&gt;11100000&lt;/span&gt;',2,16),&lt;a href="http://www.php.net/base_convert" style="color: #ffa500;"&gt;base_convert&lt;/a&gt;('&lt;span style="color: #8b0000;"&gt;11101111&lt;/span&gt;',2,16),"&lt;span style="color: #8b0000;"&gt;\r\n&lt;/span&gt;";&lt;span style="color: #008000;"&gt;//维度3&lt;/span&gt;&lt;br/&gt;&lt;a href="http://www.php.net/echo" style="color: #0000ff;"&gt;echo&lt;/a&gt; &lt;a href="http://www.php.net/base_convert" style="color: #ffa500;"&gt;base_convert&lt;/a&gt;('&lt;span style="color: #8b0000;"&gt;11110000&lt;/span&gt;',2,16),&lt;a href="http://www.php.net/base_convert" style="color: #ffa500;"&gt;base_convert&lt;/a&gt;('&lt;span style="color: #8b0000;"&gt;11110111&lt;/span&gt;',2,16),"&lt;span style="color: #8b0000;"&gt;\r\n&lt;/span&gt;";&lt;span style="color: #008000;"&gt;//维度4&lt;/span&gt;&lt;br/&gt;&lt;a href="http://www.php.net/echo" style="color: #0000ff;"&gt;echo&lt;/a&gt; &lt;a href="http://www.php.net/base_convert" style="color: #ffa500;"&gt;base_convert&lt;/a&gt;('&lt;span style="color: #8b0000;"&gt;11111000&lt;/span&gt;',2,16),&lt;a href="http://www.php.net/base_convert" style="color: #ffa500;"&gt;base_convert&lt;/a&gt;('&lt;span style="color: #8b0000;"&gt;11111011&lt;/span&gt;',2,16),"&lt;span style="color: #8b0000;"&gt;\r\n&lt;/span&gt;";&lt;span style="color: #008000;"&gt;//维度5&lt;/span&gt;&lt;br/&gt;&lt;a href="http://www.php.net/echo" style="color: #0000ff;"&gt;echo&lt;/a&gt; &lt;a href="http://www.php.net/base_convert" style="color: #ffa500;"&gt;base_convert&lt;/a&gt;('&lt;span style="color: #8b0000;"&gt;11111100&lt;/span&gt;',2,16),&lt;a href="http://www.php.net/base_convert" style="color: #ffa500;"&gt;base_convert&lt;/a&gt;('&lt;span style="color: #8b0000;"&gt;11111101&lt;/span&gt;',2,16),"&lt;span style="color: #8b0000;"&gt;\r\n&lt;/span&gt;";&lt;span style="color: #008000;"&gt;//维度6&lt;/span&gt;&lt;p&gt;&lt;strong&gt;运行结果：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chengmo/201102/201102192014083168.png"&gt;&lt;img height="326" width="550" src="http://images.cnblogs.com/cnblogs_com/chengmo/201102/201102192014088152.png" alt="image" border="0" title="image" style="display: inline; border: 0px;" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;通过上面6个维度得到得到对应的正则表达式：&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;[\x01-\x7f]|[\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3}|[\xf8-\xfb][\x80-\xbf]{4}|[\xfc-\xfd][\x80-\xbf]{5}&lt;/p&gt;&lt;p&gt;以上分别是各个维度范围&lt;/p&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;?&lt;/span&gt;php&lt;br/&gt;&lt;span style="color: #008000;"&gt;//当前编码是gbk&lt;/span&gt;&lt;br/&gt;$str="&lt;span style="color: #8b0000;"&gt;袁&lt;/span&gt;";&lt;br/&gt;&lt;a href="http://www.php.net/echo" style="color: #0000ff;"&gt;echo&lt;/a&gt; &lt;a href="http://www.php.net/urlencode" style="color: #ffa500;"&gt;urlencode&lt;/a&gt;($str);&lt;br/&gt;&lt;a href="http://www.php.net/echo" style="color: #0000ff;"&gt;echo&lt;/a&gt; is_utf8($str);&lt;br/&gt;&lt;a href="http://www.php.net/function" style="color: #0000ff;"&gt;function&lt;/a&gt; is_utf8($str)&lt;br/&gt;{&lt;br/&gt;&lt;span style="color: #008000;"&gt;///utf8编码正则检测函数&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008000;"&gt;///copyright qq:8292669  http://www.cnblogs.com/chengmo&lt;/span&gt;&lt;br/&gt;$re='&lt;span style="color: #8b0000;"&gt;/^([\x01-\x7f]|[\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3}|[\xf8-\xfb][\x80-\xbf]{4}|[\xfc-\xfd][\x80-\xbf]{5})+$/&lt;/span&gt;';&lt;br/&gt;&lt;a href="http://www.cnblogs.com/chengmo$re='/^([\x01-\x7f]|[\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3}|[\xf8-\xfb][\x80-\xbf]{4}|[\xfc-\xfd][\x80-\xbf]{5})+$/';return" style="color: #0000ff;"&gt;return&lt;/a&gt; &lt;a href="http://www.php.net/preg_match" style="color: #ffa500;"&gt;preg_match&lt;/a&gt;($re,$str);&lt;br/&gt;}&lt;strong&gt;&lt;span color="#ff0000" style="color: #ff0000;"&gt;上面执行结果返回为1，然后&amp;rdquo;袁&amp;ldquo;本身应该是gbk编码。看来上面函数还是不能彻底检查utf8编码。分析原因，从上面正则可以看到，utf8的6个维度对应字节长度从1-6字节。 而gbk是1-2个字节。因此他们之间会在1-2个字节长度地方检查出现重合。1个字节的时候gbk与utf8的 编码与字符对应关系都一样，但是2个字节时候，对应编码与字符各不相同。&lt;/span&gt;&lt;/strong&gt;&amp;nbsp;通过查询gbk编码表：&lt;a href="http://www.knowsky.com/resource/gb2312tbl.htm"&gt;http://www.knowsky.com/resource/gb2312tbl.htm&lt;/a&gt; 进一步确认，范围会在：[c0-df][a0-bf]  之内汉字都会有问题了。 &lt;strong&gt;如果纯这个范围的汉字组合为字符串就会出现判断不了情况。如果它与其它范围字符组合都可以正确的判断出来。&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;p&gt;&lt;strong&gt;&lt;strong&gt;&lt;span color="#ff0000" style="color: #ff0000;"&gt;GBK与UTF8字符集重叠对应的字符是：（gbk编码表）&lt;/span&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&amp;nbsp;code  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F&lt;br/&gt;C0A0     馈 愧 溃 坤 昆 捆 困 括 扩 廓 阔 垃 拉 喇 蜡&lt;br/&gt;C0B0  腊 辣 啦 莱 来 赖 蓝 婪 栏 拦 篮 阑 兰 澜 谰 揽&lt;br/&gt;C1A0     痢 立 粒 沥 隶 力 璃 哩 俩 联 莲 连 镰 廉 怜&lt;br/&gt;C1B0  涟 帘 敛 脸 链 恋 炼 练 粮 凉 梁 粱 良 两 辆 量&lt;br/&gt;C2A0     隆 垄 拢 陇 楼 娄 搂 篓 漏 陋 芦 卢 颅 庐 炉&lt;br/&gt;C2B0  掳 卤 虏 鲁 麓 碌 露 路 赂 鹿 潞 禄 录 陆 戮 驴&lt;br/&gt;C3A0     谩 芒 茫 盲 氓 忙 莽 猫 茅 锚 毛 矛 铆 卯 茂&lt;br/&gt;C3B0  冒 帽 貌 贸 么 玫 枚 梅 酶 霉 煤 没 眉 媒 镁 每&lt;br/&gt;C4A0     摹 蘑 模 膜 磨 摩 魔 抹 末 莫 墨 默 沫 漠 寞&lt;br/&gt;C4B0  陌 谋 牟 某 拇 牡 亩 姆 母 墓 暮 幕 募 慕 木 目&lt;br/&gt;C5A0     拧 泞 牛 扭 钮 纽 脓 浓 农 弄 奴 努 怒 女 暖&lt;br/&gt;C5B0  虐 疟 挪 懦 糯 诺 哦 欧 鸥 殴 藕 呕 偶 沤 啪 趴&lt;br/&gt;C6A0     啤 脾 疲 皮 匹 痞 僻 屁 譬 篇 偏 片 骗 飘 漂&lt;br/&gt;C6B0  瓢 票 撇 瞥 拼 频 贫 品 聘 乒 坪 苹 萍 平 凭 瓶&lt;br/&gt;C7A0     恰 洽 牵 扦 钎 铅 千 迁 签 仟 谦 乾 黔 钱 钳&lt;br/&gt;C7B0  前 潜 遣 浅 谴 堑 嵌 欠 歉 枪 呛 腔 羌 墙 蔷 强&lt;br/&gt;C8A0     取 娶 龋 趣 去 圈 颧 权 醛 泉 全 痊 拳 犬 券&lt;br/&gt;C8B0  劝 缺 炔 瘸 却 鹊 榷 确 雀 裙 群 然 燃 冉 染 瓤&lt;br/&gt;C9A0     伞 散 桑 嗓 丧 搔 骚 扫 嫂 瑟 色 涩 森 僧 莎&lt;br/&gt;C9B0  砂 杀 刹 沙 纱 傻 啥 煞 筛 晒 珊 苫 杉 山 删 煽&lt;br/&gt;CAA0     省 盛 剩 胜 圣 师 失 狮 施 湿 诗 尸 虱 十 石&lt;br/&gt;CAB0  拾 时 什 食 蚀 实 识 史 矢 使 屎 驶 始 式 示 士&lt;br/&gt;CBA0     恕 刷 耍 摔 衰 甩 帅 栓 拴 霜 双 爽 谁 水 睡&lt;br/&gt;CBB0  税 吮 瞬 顺 舜 说 硕 朔 烁 斯 撕 嘶 思 私 司 丝&lt;br/&gt;CCA0     獭 挞 蹋 踏 胎 苔 抬 台 泰 酞 太 态 汰 坍 摊&lt;br/&gt;CCB0  贪 瘫 滩 坛 檀 痰 潭 谭 谈 坦 毯 袒 碳 探 叹 炭&lt;br/&gt;CDA0     汀 廷 停 亭 庭 挺 艇 通 桐 酮 瞳 同 铜 彤 童&lt;br/&gt;CDB0  桶 捅 筒 统 痛 偷 投 头 透 凸 秃 突 图 徒 途 涂&lt;br/&gt;CEA0     巍 微 危 韦 违 桅 围 唯 惟 为 潍 维 苇 萎 委&lt;br/&gt;CEB0  伟 伪 尾 纬 未 蔚 味 畏 胃 喂 魏 位 渭 谓 尉 慰&lt;br/&gt;CFA0     稀 息 希 悉 膝 夕 惜 熄 烯 溪 汐 犀 檄 袭 席&lt;br/&gt;CFB0  习 媳 喜 铣 洗 系 隙 戏 细 瞎 虾 匣 霞 辖 暇 峡&lt;br/&gt;D0A0     小 孝 校 肖 啸 笑 效 楔 些 歇 蝎 鞋 协 挟 携&lt;br/&gt;D0B0  邪 斜 胁 谐 写 械 卸 蟹 懈 泄 泻 谢 屑 薪 芯 锌&lt;br/&gt;D1A0     选 癣 眩 绚 靴 薛 学 穴 雪 血 勋 熏 循 旬 询&lt;br/&gt;D1B0  寻 驯 巡 殉 汛 训 讯 逊 迅 压 押 鸦 鸭 呀 丫 芽&lt;br/&gt;D2A0     摇 尧 遥 窑 谣 姚 咬 舀 药 要 耀 椰 噎 耶 爷&lt;br/&gt;D2B0  野 冶 也 页 掖 业 叶 曳 腋 夜 液 一 壹 医 揖 铱&lt;br/&gt;D3A0     印 英 樱 婴 鹰 应 缨 莹 萤 营 荧 蝇 迎 赢 盈&lt;br/&gt;D3B0  影 颖 硬 映 哟 拥 佣 臃 痈 庸 雍 踊 蛹 咏 泳 涌&lt;br/&gt;D4A0     浴 寓 裕 预 豫 驭 鸳 渊 冤 元 垣 袁 原 援 辕&lt;br/&gt;D4B0  园 员 圆 猿 源 缘 远 苑 愿 怨 院 曰 约 越 跃 钥&lt;br/&gt;D5A0     铡 闸 眨 栅 榨 咋 乍 炸 诈 摘 斋 宅 窄 债 寨&lt;br/&gt;D5B0  瞻 毡 詹 粘 沾 盏 斩 辗 崭 展 蘸 栈 占 战 站 湛&lt;br/&gt;D6A0     帧 症 郑 证 芝 枝 支 吱 蜘 知 肢 脂 汁 之 织&lt;br/&gt;D6B0  职 直 植 殖 执 值 侄 址 指 止 趾 只 旨 纸 志 挚&lt;br/&gt;D7A0     住 注 祝 驻 抓 爪 拽 专 砖 转 撰 赚 篆 桩 庄&lt;br/&gt;D7B0  装 妆 撞 壮 状 椎 锥 追 赘 坠 缀 谆 准 捉 拙 卓&lt;br/&gt;D8A0     亍 丌 兀 丐 廿 卅 丕 亘 丞 鬲 孬 噩 丨 禺 丿&lt;br/&gt;D8B0  匕 乇 夭 爻 卮 氐 囟 胤 馗 毓 睾 鼗 丶 亟 鼐 乜&lt;br/&gt;D9A0     佟 佗 伲 伽 佶 佴 侑 侉 侃 侏 佾 佻 侪 佼 侬&lt;br/&gt;D9B0  侔 俦 俨 俪 俅 俚 俣 俜 俑 俟 俸 倩 偌 俳 倬 倏&lt;br/&gt;DAA0     凇 冖 冢 冥 讠 讦 讧 讪 讴 讵 讷 诂 诃 诋 诏&lt;br/&gt;DAB0  诎 诒 诓 诔 诖 诘 诙 诜 诟 诠 诤 诨 诩 诮 诰 诳&lt;br/&gt;DBA0     邸 邰 郏 郅 邾 郐 郄 郇 郓 郦 郢 郜 郗 郛 郫&lt;br/&gt;DBB0  郯 郾 鄄 鄢 鄞 鄣 鄱 鄯 鄹 酃 酆 刍 奂 劢 劬 劭&lt;br/&gt;DCA0     堋 堍 埽 埭 堀 堞 堙 塄 堠 塥 塬 墁 墉 墚 墀&lt;br/&gt;DCB0  馨 鼙 懿 艹 艽 艿 芏 芊 芨 芄 芎 芑 芗 芙 芫 芸&lt;br/&gt;DDA0     荨 茛 荩 荬 荪 荭 荮 莰 荸 莳 莴 莠 莪 莓 莜&lt;br/&gt;DDB0  莅 荼 莶 莩 荽 莸 荻 莘 莞 莨 莺 莼 菁 萁 菥 菘&lt;br/&gt;DEA0     蕖 蔻 蓿 蓼 蕙 蕈 蕨 蕤 蕞 蕺 瞢 蕃 蕲 蕻 薤&lt;br/&gt;DEB0  薨 薇 薏 蕹 薮 薜 薅 薹 薷 薰 藓 藁 藜 藿 蘧 蘅&lt;br/&gt;DFA0     摺 撷 撸 撙 撺 擀 擐 擗 擤 擢 攉 攥 攮 弋 忒&lt;br/&gt;DFB0  甙 弑 卟 叱 叽 叩 叨 叻 吒 吖 吆 呋 呒 呓 呔 呖&lt;strong&gt;只要在这些范围的任意汉字组合一起，都会别解码为utf8,这个也就是utf8编码不能完全识别根本原因。&lt;/strong&gt;&lt;strong&gt;因此需要彻底检查utf8编码，需要排除这些干扰.&lt;/strong&gt; &lt;ol&gt;&lt;li&gt;&lt;strong&gt;整理后的PHP&lt;/strong&gt; &lt;/li&gt;&lt;li&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;?&lt;/span&gt;php&lt;br/&gt;&lt;span style="color: #008000;"&gt;//当前编码是gbk  本函数以gbk与utf8为例子&lt;/span&gt;&lt;br/&gt;$str="&lt;span style="color: #8b0000;"&gt;袁小&lt;/span&gt;";&lt;br/&gt;&lt;a href="http://www.php.net/echo" style="color: #0000ff;"&gt;echo&lt;/a&gt; checkUtf8($str);&lt;br/&gt;&lt;a href="http://www.php.net/echo" style="color: #0000ff;"&gt;echo&lt;/a&gt; checkUtf8(iconv('&lt;span style="color: #8b0000;"&gt;gbk&lt;/span&gt;','&lt;span style="color: #8b0000;"&gt;utf-8&lt;/span&gt;',$str));&lt;br/&gt;&lt;br/&gt;$str="&lt;span style="color: #8b0000;"&gt;辍 辎&lt;/span&gt;";&lt;br/&gt;&lt;a href="http://www.php.net/echo" style="color: #0000ff;"&gt;echo&lt;/a&gt; checkUtf8($str);&lt;br/&gt;&lt;a href="http://www.php.net/echo" style="color: #0000ff;"&gt;echo&lt;/a&gt; checkUtf8(iconv('&lt;span style="color: #8b0000;"&gt;gbk&lt;/span&gt;','&lt;span style="color: #8b0000;"&gt;utf-8&lt;/span&gt;',$str));&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style="color: #008000;"&gt;/**&lt;br/&gt; *检测字符串是否是utf8编码*&lt;br/&gt; * @param string $str 输入字符串&lt;br/&gt; * @param string $extzh 排除重合中文，&lt;br/&gt; * @return 1|0 1是utf8 0不为utf8&lt;br/&gt; */&lt;/span&gt;&lt;br/&gt;&lt;a href="http://www.php.net/function" style="color: #0000ff;"&gt;function&lt;/a&gt; checkUtf8($str,$extzh=1)&lt;br/&gt;{&lt;br/&gt;&lt;span style="color: #008000;"&gt;///utf8编码正则检测函数&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008000;"&gt;///copyright qq:8292669  &lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008000;"&gt;///author  程默  http://www.cnblogs.com/chengmo&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style="color: #008000;"&gt;//gbk,utf8重叠的范围是：[c0-df][a0-bf] 这块字符在utf8中有，在gbk编码没有对应字符因此向gbk转换会出现"?"号&lt;/span&gt;&lt;br/&gt;&lt;a href="http://www.php.net/if" style="color: #0000ff;"&gt;if&lt;/a&gt;($extzh==1)&lt;br/&gt;{&lt;br/&gt;$re='&lt;span style="color: #8b0000;"&gt;/^([\x01-\x7f]|[\xc0-\xdf][\xa0-\xbf])+$/&lt;/span&gt;';  &lt;span style="color: #008000;"&gt;///这部分字符如果当作utf8处理，在转换为gbk时候就会出现问题"?"号。因此直接返回不为utf8&lt;/span&gt;&lt;br/&gt;&lt;a href="http://www.php.net/if" style="color: #0000ff;"&gt;if&lt;/a&gt;(&lt;a href="http://www.php.net/preg_match" style="color: #ffa500;"&gt;preg_match&lt;/a&gt;($re,$str))  &lt;span style="color: #008000;"&gt;///公共字符验证成功&lt;/span&gt;&lt;br/&gt;{&lt;br/&gt;&lt;a href="http://www.php.net/return" style="color: #0000ff;"&gt;return&lt;/a&gt; 0;  &lt;span style="color: #008000;"&gt;///不是utf8&lt;/span&gt;&lt;br/&gt;}&lt;br/&gt;}&lt;br/&gt;$re='&lt;span style="color: #8b0000;"&gt;/^([\x01-\x7f]|[\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3}|[\xf8-\xfb][\x80-\xbf]{4}|[\xfc-\xfd][\x80-\xbf]{5})+$/&lt;/span&gt;';&lt;br/&gt;&lt;a href="http://www.php.net/return" style="color: #0000ff;"&gt;return&lt;/a&gt; &lt;a href="http://www.php.net/preg_match" style="color: #ffa500;"&gt;preg_match&lt;/a&gt;($re,$str);&lt;br/&gt;}&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chengmo/201102/201102192152224326.png"&gt;&lt;img height="216" width="532" src="http://images.cnblogs.com/cnblogs_com/chengmo/201102/201102192152221262.png" alt="image" border="0" title="image" style="display: inline; border: 0px;" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;以上是一个折中的方法，在国内一般web程序是：gbk,utf8两种，用上面这个方法基本可以解决问题，可以避免误将gbk识别为utf8,然后将它从utf8-&amp;gt;gbk转码，出现&amp;rdquo;?&amp;rdquo;号朋友，你有什么更好的方法欢迎交流！！ &lt;/p&gt;&lt;p&gt;作者：&lt;a target="_blank" href="http://www.cnblogs.com/chengmo"&gt;chengmo&lt;/a&gt; QQ:8292669&lt;br /&gt;出处：&lt;a target="_blank" href="http://www.cnblogs.com/chengmo"&gt;http://www.cnblogs.com/chengmo&lt;/a&gt;&lt;br /&gt;本文版权归作者和博客园共有，欢迎转载，请务必添加原文链接。&lt;/p&gt;&lt;/blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;img src="http://www.cnblogs.com/chengmo/aggbug/1958657.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chengmo/archive/2011/02/19/1958657.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chengmo/archive/2010/12/06/1898062.html</id><title type="text">php 验证码【倾斜，正弦干扰线，黏贴，旋转】</title><summary type="text">好久没有写帖子了。一直忙着新的项目。 最近，做验证码程序，一直想做一个简洁大方，自动识别比较困难的。 通过这些时候整理搜集，发现一般做法有以下几种方案：1、字体变型 （一般通过算法，进行扭曲，比较有代表性就是：http://code.google.com/p/cool-php-captcha/ 2、字体黏贴 （这里面以qq验证码为代表了，目前网上还是很难找到，破解qq验证码的) 3、干扰线，噪点 (这种识别起来相当容易，很容易被程序自动化识别）对于上面提到，第1,2 二种方法，在识别时候，是比较困难的。个人比较喜欢第二种方法，感觉看起来不是很费力。而扭曲的文字，总觉得怪怪的。 哈哈，纯粹个人喜</summary><published>2010-12-06T11:44:00Z</published><updated>2010-12-06T11:44:00Z</updated><author><name>程默</name><uri>http://www.cnblogs.com/chengmo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chengmo/archive/2010/12/06/1898062.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chengmo/archive/2010/12/06/1898062.html"/><content type="html">&lt;p&gt;好久没有写帖子了。一直忙着新的项目。 最近，做验证码程序，一直想做一个简洁大方，自动识别比较困难的。 通过这些时候整理搜集，发现一般做法有以下几种方案：&lt;/p&gt;&lt;p&gt;1、字体变型 （一般通过算法，进行扭曲，比较有代表性就是：&lt;a href="http://code.google.com/p/cool-php-captcha/"&gt;http://code.google.com/p/cool-php-captcha/&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chengmo/WindowsLiveWriter/php_10FFD/image_2.png"&gt;&lt;img style="display: inline; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/chengmo/WindowsLiveWriter/php_10FFD/image_thumb.png" border="0" alt="image" width="244" height="49" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;2、字体黏贴 （这里面以qq验证码为代表了，目前网上还是很难找到，破解qq验证码的)&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chengmo/WindowsLiveWriter/php_10FFD/image_4.png"&gt;&lt;img style="display: inline; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/chengmo/WindowsLiveWriter/php_10FFD/image_thumb_1.png" border="0" alt="image" width="146" height="50" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;3、干扰线，噪点 (这种识别起来相当容易，很容易被程序自动化识别）&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;对于上面提到，第1,2 二种方法，在识别时候，是比较困难的。个人比较喜欢第二种方法，感觉看起来不是很费力。而扭曲的文字，总觉得怪怪的。 哈哈，纯粹个人喜好了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;实现代码：&lt;/strong&gt;&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;?&lt;/span&gt;php&lt;br/&gt;&lt;span style="color: #008000;"&gt;/**&lt;br/&gt; *带文字旋转，倾斜，黏贴，加正弦干扰线验证码*&lt;br/&gt; *@version  0.1&lt;br/&gt; *@author http://www.cnblogs.com/chengmo&lt;br/&gt; *@copyright 程默 QQ:8292669&lt;br/&gt; */&lt;/span&gt;&lt;br/&gt;&lt;a style="color: #0000ff;" href="http://www.php.net/class"&gt;class&lt;/a&gt; Utils_Caption&lt;br/&gt;{&lt;br/&gt;&lt;a style="color: #0000ff;" href="http://www.php.net/var"&gt;var&lt;/a&gt; $Width      = 60;           &lt;span style="color: #008000;"&gt;//图片宽&lt;/span&gt;&lt;br/&gt;&lt;a style="color: #0000ff;" href="http://www.php.net/var"&gt;var&lt;/a&gt; $Height     = 30;           &lt;span style="color: #008000;"&gt;//图片高&lt;/span&gt;&lt;br/&gt;&lt;a style="color: #0000ff;" href="http://www.php.net/var"&gt;var&lt;/a&gt; $Length     = 4;            &lt;span style="color: #008000;"&gt;//验证码位数&lt;/span&gt;&lt;br/&gt;&lt;a style="color: #0000ff;" href="http://www.php.net/var"&gt;var&lt;/a&gt; $BgColor    = "&lt;span style="color: #8b0000;"&gt;#FFFFFF&lt;/span&gt;";    &lt;span style="color: #008000;"&gt;//背景色&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;a style="color: #0000ff;" href="http://www.php.net/var"&gt;var&lt;/a&gt; $TFonts = &lt;a style="color: #ffa500;" href="http://www.php.net/array"&gt;array&lt;/a&gt;("&lt;span style="color: #8b0000;"&gt;font.ttf&lt;/span&gt;");&lt;br/&gt;&lt;a style="color: #0000ff;" href="http://www.php.net/var"&gt;var&lt;/a&gt; $TFontSize=&lt;a style="color: #ffa500;" href="http://www.php.net/array"&gt;array&lt;/a&gt;(17,20); &lt;span style="color: #008000;"&gt;//字体大小范围&lt;/span&gt;&lt;br/&gt;&lt;a style="color: #0000ff;" href="http://www.php.net/var"&gt;var&lt;/a&gt; $TFontAngle=&lt;a style="color: #ffa500;" href="http://www.php.net/array"&gt;array&lt;/a&gt;(-20,20); &lt;span style="color: #008000;"&gt;//旋转角度&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;a style="color: #0000ff;" href="http://www.php.net/var"&gt;var&lt;/a&gt; $Chars   = "&lt;span style="color: #8b0000;"&gt;0123456789&lt;/span&gt;";         &lt;span style="color: #008000;"&gt;//验证码范围（字母数字）&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;a style="color: #0000ff;" href="http://www.php.net/var"&gt;var&lt;/a&gt; $Code    = &lt;a style="color: #ffa500;" href="http://www.php.net/array"&gt;array&lt;/a&gt;();              &lt;span style="color: #008000;"&gt;//验证码&lt;/span&gt;&lt;br/&gt;&lt;a style="color: #0000ff;" href="http://www.php.net/var"&gt;var&lt;/a&gt; $Image   = "";              &lt;span style="color: #008000;"&gt;//图形对象&lt;/span&gt;&lt;br/&gt;&lt;a style="color: #0000ff;" href="http://www.php.net/var"&gt;var&lt;/a&gt; $FontColors=&lt;a style="color: #ffa500;" href="http://www.php.net/array"&gt;array&lt;/a&gt;('&lt;span style="color: #8b0000;"&gt;#f36161&lt;/span&gt;','&lt;span style="color: #8b0000;"&gt;#6bc146&lt;/span&gt;','&lt;span style="color: #8b0000;"&gt;#5368bd&lt;/span&gt;');  &lt;span style="color: #008000;"&gt;//字体颜色,红绿蓝&lt;/span&gt;&lt;br/&gt;&lt;a style="color: #0000ff;" href="http://www.php.net/var"&gt;var&lt;/a&gt; $TPadden = 0.75;&lt;span style="color: #008000;"&gt;///字符间距,多少个字符&lt;/span&gt;&lt;br/&gt;&lt;a style="color: #0000ff;" href="http://www.php.net/var"&gt;var&lt;/a&gt; $Txbase = 5;&lt;span style="color: #008000;"&gt;///x轴两边距离&lt;/span&gt;&lt;br/&gt;&lt;a style="color: #0000ff;" href="http://www.php.net/var"&gt;var&lt;/a&gt; $Tybase =5 ;&lt;span style="color: #008000;"&gt;///y轴两边距离&lt;/span&gt;&lt;br/&gt;&lt;a style="color: #0000ff;" href="http://www.php.net/var"&gt;var&lt;/a&gt; $TLine =&lt;a style="color: #0000ff;" href="http://www.php.net/true"&gt;true&lt;/a&gt;; &lt;span style="color: #008000;"&gt;///画干扰线&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;public  &lt;a style="color: #0000ff;" href="http://www.php.net/function"&gt;function&lt;/a&gt; RandRSI() &lt;span style="color: #008000;"&gt;///生成验证码&lt;/span&gt;&lt;br/&gt;{&lt;br/&gt;$this-&amp;gt;TFontAngle=&lt;a style="color: #ffa500;" href="http://www.php.net/range"&gt;range&lt;/a&gt;($this-&amp;gt;TFontAngle[0],$this-&amp;gt;TFontAngle[1]);&lt;br/&gt;$this-&amp;gt;TFontSize=&lt;a style="color: #ffa500;" href="http://www.php.net/range"&gt;range&lt;/a&gt;($this-&amp;gt;TFontSize[0],$this-&amp;gt;TFontSize[1]);&lt;br/&gt;&lt;br/&gt;$arr=&lt;a style="color: #ffa500;" href="http://www.php.net/array"&gt;array&lt;/a&gt;();&lt;br/&gt;$Chars=$this-&amp;gt;Chars;&lt;br/&gt;$TFontAngle=$this-&amp;gt;TFontAngle;&lt;br/&gt;$TFontSize=$this-&amp;gt;TFontSize;&lt;br/&gt;$FontColors=$this-&amp;gt;FontColors;&lt;br/&gt;$code="";&lt;br/&gt;$font=&lt;a style="color: #ffa500;" href="http://www.php.net/dirname"&gt;dirname&lt;/a&gt;(__FILE__)."&lt;span style="color: #8b0000;"&gt;/font/&lt;/span&gt;".$this-&amp;gt;TFonts[0];&lt;br/&gt;&lt;br/&gt;$charlen=&lt;a style="color: #ffa500;" href="http://www.php.net/strlen"&gt;strlen&lt;/a&gt;($Chars)-1;&lt;br/&gt;$anglelen=&lt;a style="color: #ffa500;" href="http://www.php.net/count"&gt;count&lt;/a&gt;($TFontAngle)-1; &lt;span style="color: #008000;"&gt;// 角度范围&lt;/span&gt;&lt;br/&gt;$fontsizelen=&lt;a style="color: #ffa500;" href="http://www.php.net/count"&gt;count&lt;/a&gt;($TFontSize)-1; &lt;span style="color: #008000;"&gt;// 角度范围&lt;/span&gt;&lt;br/&gt;$fontcolorlen=&lt;a style="color: #ffa500;" href="http://www.php.net/count"&gt;count&lt;/a&gt;($FontColors)-1; &lt;span style="color: #008000;"&gt;// 角度范围&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;a style="color: #0000ff;" href="http://www.php.net/for"&gt;for&lt;/a&gt;($i=0;$i&amp;lt;$this-&amp;gt;Length;$i++) &lt;span style="color: #008000;"&gt;///得到字符与颜色&lt;/span&gt;&lt;br/&gt;{&lt;br/&gt;$char=$Chars[&lt;a style="color: #ffa500;" href="http://www.php.net/rand"&gt;rand&lt;/a&gt;(0,$charlen)]; &lt;span style="color: #008000;"&gt;///得到字符&lt;/span&gt;&lt;br/&gt;$angle=$TFontAngle[&lt;a style="color: #ffa500;" href="http://www.php.net/rand"&gt;rand&lt;/a&gt;(0,$anglelen)]; &lt;span style="color: #008000;"&gt;///旋转角度&lt;/span&gt;&lt;br/&gt;$fontsize=$TFontSize[&lt;a style="color: #ffa500;" href="http://www.php.net/rand"&gt;rand&lt;/a&gt;(0,$fontsizelen)]; &lt;span style="color: #008000;"&gt;///字体大小&lt;/span&gt;&lt;br/&gt;$fontcolor=$FontColors[&lt;a style="color: #ffa500;" href="http://www.php.net/rand"&gt;rand&lt;/a&gt;(0,$fontcolorlen)]; &lt;span style="color: #008000;"&gt;///字体大小&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;$bound=$this-&amp;gt;_calculateTextBox($fontsize,$angle,$font,$char); &lt;span style="color: #008000;"&gt;///得到范围&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;$arr[]=&lt;a style="color: #ffa500;" href="http://www.php.net/array"&gt;array&lt;/a&gt;($fontsize,$angle,$fontcolor,$char,$font,$bound);  &lt;span style="color: #008000;"&gt;///得到矩形框&lt;/span&gt;&lt;br/&gt;$code.=$char;&lt;br/&gt;}&lt;br/&gt;$this-&amp;gt;Code=$arr; &lt;span style="color: #008000;"&gt;//验证码&lt;/span&gt;&lt;br/&gt;&lt;a style="color: #0000ff;" href="http://www.php.net/return"&gt;return&lt;/a&gt; $code;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;public &lt;a style="color: #0000ff;" href="http://www.php.net/function"&gt;function&lt;/a&gt; Draw() &lt;span style="color: #008000;"&gt;///画图&lt;/span&gt;&lt;br/&gt;{&lt;br/&gt;&lt;a style="color: #0000ff;" href="http://www.php.net/if"&gt;if&lt;/a&gt;(empty($this-&amp;gt;Code)) $this-&amp;gt;RandRSI();&lt;br/&gt;$codes=$this-&amp;gt;Code; &lt;span style="color: #008000;"&gt;///用户验证码&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;$wh=$this-&amp;gt;_getImageWH($codes);&lt;br/&gt;&lt;br/&gt;$width=$wh[0];&lt;br/&gt;$height=$wh[1]; &lt;span style="color: #008000;"&gt;///高度&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;$this-&amp;gt;Width=$width;&lt;br/&gt;$this-&amp;gt;Height=$height;&lt;br/&gt;&lt;br/&gt;$this-&amp;gt;Image = &lt;a style="color: #ffa500;" href="http://www.php.net/imageCreate"&gt;imageCreate&lt;/a&gt;( $width, $height );&lt;br/&gt;$image=$this-&amp;gt;Image;&lt;br/&gt;&lt;br/&gt;$back = $this-&amp;gt;_getColor2($this-&amp;gt;_getColor( $this-&amp;gt;BgColor)); &lt;span style="color: #008000;"&gt;///背景颜色&lt;/span&gt;&lt;br/&gt;&lt;a style="color: #ffa500;" href="http://www.php.net/imageFilledRectangle"&gt;imageFilledRectangle&lt;/a&gt;($image, 0, 0, $width, $height, $back); &lt;span style="color: #008000;"&gt;///填充背景&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;$TPadden=$this-&amp;gt;TPadden;&lt;br/&gt;&lt;br/&gt;$basex=$this-&amp;gt;Txbase;&lt;br/&gt;$color=null;&lt;br/&gt;&lt;a style="color: #0000ff;" href="http://www.php.net/foreach"&gt;foreach&lt;/a&gt; ($codes &lt;a style="color: #0000ff;" href="http://www.php.net/as"&gt;as&lt;/a&gt; $v) &lt;span style="color: #008000;"&gt;///逐个画字符&lt;/span&gt;&lt;br/&gt;{&lt;br/&gt;$bound=$v[5];&lt;br/&gt;$color=$this-&amp;gt;_getColor2($this-&amp;gt;_getColor($v[2]));&lt;br/&gt;&lt;a style="color: #ffa500;" href="http://www.php.net/imagettftext"&gt;imagettftext&lt;/a&gt;($image, $v[0], $v[1], $basex, $bound['&lt;span style="color: #8b0000;"&gt;height&lt;/span&gt;'],$color , $v[4], $v[3]);&lt;br/&gt;$basex=$basex+$bound['&lt;span style="color: #8b0000;"&gt;width&lt;/span&gt;']*$TPadden-$bound['&lt;span style="color: #8b0000;"&gt;left&lt;/span&gt;'];&lt;span style="color: #008000;"&gt;///计算下一个左边距&lt;/span&gt;&lt;br/&gt;}&lt;br/&gt;$this-&amp;gt;TLine?$this-&amp;gt;_wirteSinLine($color,$basex):null; &lt;span style="color: #008000;"&gt;///画干扰线&lt;/span&gt;&lt;br/&gt;&lt;a style="color: #ffa500;" href="http://www.php.net/header"&gt;header&lt;/a&gt;("&lt;span style="color: #8b0000;"&gt;Content-type: image/png&lt;/span&gt;");&lt;br/&gt;&lt;a style="color: #ffa500;" href="http://www.php.net/imagepng"&gt;imagepng&lt;/a&gt;( $image);&lt;br/&gt;&lt;a style="color: #ffa500;" href="http://www.php.net/imagedestroy"&gt;imagedestroy&lt;/a&gt;($image);&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;span style="color: #008000;"&gt;/**&lt;br/&gt; *通过字体角度得到字体矩形宽度*&lt;br/&gt; *&lt;br/&gt; * @param int $font_size 字体尺寸&lt;br/&gt; * @param float $font_angle 旋转角度&lt;br/&gt; * @param string $font_file 字体文件路径&lt;br/&gt; * @param string $text 写入字符&lt;br/&gt; * @return array 返回长宽高&lt;br/&gt; */&lt;/span&gt;&lt;br/&gt;private &lt;a style="color: #0000ff;" href="http://www.php.net/function"&gt;function&lt;/a&gt; _calculateTextBox($font_size, $font_angle, $font_file, $text) {&lt;br/&gt;$box = &lt;a style="color: #ffa500;" href="http://www.php.net/imagettfbbox"&gt;imagettfbbox&lt;/a&gt;($font_size, $font_angle, $font_file, $text);&lt;br/&gt;&lt;br/&gt;$min_x = &lt;a style="color: #ffa500;" href="http://www.php.net/min"&gt;min&lt;/a&gt;(&lt;a style="color: #ffa500;" href="http://www.php.net/array"&gt;array&lt;/a&gt;($box[0], $box[2], $box[4], $box[6]));&lt;br/&gt;$max_x = &lt;a style="color: #ffa500;" href="http://www.php.net/max"&gt;max&lt;/a&gt;(&lt;a style="color: #ffa500;" href="http://www.php.net/array"&gt;array&lt;/a&gt;($box[0], $box[2], $box[4], $box[6]));&lt;br/&gt;$min_y = &lt;a style="color: #ffa500;" href="http://www.php.net/min"&gt;min&lt;/a&gt;(&lt;a style="color: #ffa500;" href="http://www.php.net/array"&gt;array&lt;/a&gt;($box[1], $box[3], $box[5], $box[7]));&lt;br/&gt;$max_y = &lt;a style="color: #ffa500;" href="http://www.php.net/max"&gt;max&lt;/a&gt;(&lt;a style="color: #ffa500;" href="http://www.php.net/array"&gt;array&lt;/a&gt;($box[1], $box[3], $box[5], $box[7]));&lt;br/&gt;&lt;br/&gt;&lt;a style="color: #0000ff;" href="http://www.php.net/return"&gt;return&lt;/a&gt; &lt;a style="color: #ffa500;" href="http://www.php.net/array"&gt;array&lt;/a&gt;(&lt;br/&gt;'&lt;span style="color: #8b0000;"&gt;left&lt;/span&gt;' =&amp;gt; ($min_x &amp;gt;= -1) ? -&lt;a style="color: #ffa500;" href="http://www.php.net/abs"&gt;abs&lt;/a&gt;($min_x + 1) : &lt;a style="color: #ffa500;" href="http://www.php.net/abs"&gt;abs&lt;/a&gt;($min_x + 2),&lt;br/&gt;'&lt;span style="color: #8b0000;"&gt;top&lt;/span&gt;' =&amp;gt; &lt;a style="color: #ffa500;" href="http://www.php.net/abs"&gt;abs&lt;/a&gt;($min_y),&lt;br/&gt;'&lt;span style="color: #8b0000;"&gt;width&lt;/span&gt;' =&amp;gt; $max_x - $min_x,&lt;br/&gt;'&lt;span style="color: #8b0000;"&gt;height&lt;/span&gt;' =&amp;gt; $max_y - $min_y,&lt;br/&gt;'&lt;span style="color: #8b0000;"&gt;box&lt;/span&gt;' =&amp;gt; $box&lt;br/&gt;);&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;private &lt;a style="color: #0000ff;" href="http://www.php.net/function"&gt;function&lt;/a&gt;  _getColor( $color ) &lt;span style="color: #008000;"&gt;//#ffffff&lt;/span&gt;&lt;br/&gt;{&lt;br/&gt;&lt;a style="color: #0000ff;" href="http://www.php.net/return"&gt;return&lt;/a&gt; &lt;a style="color: #ffa500;" href="http://www.php.net/array"&gt;array&lt;/a&gt;(&lt;a style="color: #ffa500;" href="http://www.php.net/hexdec"&gt;hexdec&lt;/a&gt;($color[1].$color[2]),&lt;a style="color: #ffa500;" href="http://www.php.net/hexdec"&gt;hexdec&lt;/a&gt;($color[3].$color[4]),&lt;a style="color: #ffa500;" href="http://www.php.net/hexdec"&gt;hexdec&lt;/a&gt;($color[5].$color[6]));&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;private &lt;a style="color: #0000ff;" href="http://www.php.net/function"&gt;function&lt;/a&gt;  _getColor2( $color ) &lt;span style="color: #008000;"&gt;//#ffffff&lt;/span&gt;&lt;br/&gt;{&lt;br/&gt;&lt;a style="color: #0000ff;" href="http://www.php.net/return"&gt;return&lt;/a&gt; &lt;a style="color: #ffa500;" href="http://www.php.net/imagecolorallocate"&gt;imagecolorallocate&lt;/a&gt; ($this-&amp;gt;Image, $color[0], $color[1], $color[2]);&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;private &lt;a style="color: #0000ff;" href="http://www.php.net/function"&gt;function&lt;/a&gt; _getImageWH($data)&lt;br/&gt;{&lt;br/&gt;$TPadden=$this-&amp;gt;TPadden;&lt;br/&gt;$w=$this-&amp;gt;Txbase;&lt;br/&gt;$h=0;&lt;br/&gt;&lt;a style="color: #0000ff;" href="http://www.php.net/foreach"&gt;foreach&lt;/a&gt; ($data &lt;a style="color: #0000ff;" href="http://www.php.net/as"&gt;as&lt;/a&gt; $v)&lt;br/&gt;{&lt;br/&gt;$w=$w+$v[5]['&lt;span style="color: #8b0000;"&gt;width&lt;/span&gt;']*$TPadden-$v[5]['&lt;span style="color: #8b0000;"&gt;left&lt;/span&gt;'];&lt;br/&gt;$h=$h&amp;gt;$v[5]['&lt;span style="color: #8b0000;"&gt;height&lt;/span&gt;']?$h:$v[5]['&lt;span style="color: #8b0000;"&gt;height&lt;/span&gt;'];&lt;br/&gt;}&lt;br/&gt;&lt;a style="color: #0000ff;" href="http://www.php.net/return"&gt;return&lt;/a&gt; &lt;a style="color: #ffa500;" href="http://www.php.net/array"&gt;array&lt;/a&gt;(&lt;a style="color: #ffa500;" href="http://www.php.net/max"&gt;max&lt;/a&gt;($w,$this-&amp;gt;Width),&lt;a style="color: #ffa500;" href="http://www.php.net/max"&gt;max&lt;/a&gt;($h,$this-&amp;gt;Height));&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;span style="color: #008000;"&gt;//画正弦干扰线&lt;/span&gt;&lt;br/&gt;private &lt;a style="color: #0000ff;" href="http://www.php.net/function"&gt;function&lt;/a&gt; _wirteSinLine($color,$w)&lt;br/&gt;{&lt;br/&gt;$img=$this-&amp;gt;Image;&lt;br/&gt;&lt;br/&gt;$h=$this-&amp;gt;Height;&lt;br/&gt;$h1=&lt;a style="color: #ffa500;" href="http://www.php.net/rand"&gt;rand&lt;/a&gt;(-5,5);&lt;br/&gt;$h2=&lt;a style="color: #ffa500;" href="http://www.php.net/rand"&gt;rand&lt;/a&gt;(-1,1);&lt;br/&gt;$w2=&lt;a style="color: #ffa500;" href="http://www.php.net/rand"&gt;rand&lt;/a&gt;(10,15);&lt;br/&gt;$h3=&lt;a style="color: #ffa500;" href="http://www.php.net/rand"&gt;rand&lt;/a&gt;(4,6);&lt;br/&gt;&lt;br/&gt;&lt;a style="color: #0000ff;" href="http://www.php.net/for"&gt;for&lt;/a&gt;($i=-$w/2;$i&amp;lt;$w/2;$i=$i+0.1)&lt;br/&gt;{&lt;br/&gt;$y=$h/$h3*&lt;a style="color: #ffa500;" href="http://www.php.net/sin"&gt;sin&lt;/a&gt;($i/$w2)+$h/2+$h1;&lt;br/&gt;&lt;a style="color: #ffa500;" href="http://www.php.net/imagesetpixel"&gt;imagesetpixel&lt;/a&gt;($img,$i+$w/2,$y,$color);&lt;br/&gt;$h2!=0?&lt;a style="color: #ffa500;" href="http://www.php.net/imagesetpixel"&gt;imagesetpixel&lt;/a&gt;($img,$i+$w/2,$y+$h2,$color):null;&lt;br/&gt;}&lt;br/&gt;}&lt;br/&gt;}&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;外带字体：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;font.ttf ，一个简单粗体文件。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chengmo/WindowsLiveWriter/php_10FFD/image_6.png"&gt;&lt;img style="display: inline; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/chengmo/WindowsLiveWriter/php_10FFD/image_thumb_2.png" border="0" alt="image" width="564" height="153" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt;&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;先看下运行效果吧，大家也不要忙着复制运行了。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chengmo/WindowsLiveWriter/php_10FFD/image_8.png"&gt;&lt;img style="display: inline; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/chengmo/WindowsLiveWriter/php_10FFD/image_thumb_3.png" border="0" alt="image" width="69" height="39" /&gt;&lt;/a&gt; &lt;a href="http://images.cnblogs.com/cnblogs_com/chengmo/WindowsLiveWriter/php_10FFD/image_10.png"&gt;&lt;img style="display: inline; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/chengmo/WindowsLiveWriter/php_10FFD/image_thumb_4.png" border="0" alt="image" width="59" height="35" /&gt;&lt;/a&gt; &lt;a href="http://images.cnblogs.com/cnblogs_com/chengmo/WindowsLiveWriter/php_10FFD/image_12.png"&gt;&lt;img style="display: inline; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/chengmo/WindowsLiveWriter/php_10FFD/image_thumb_5.png" border="0" alt="image" width="62" height="43" /&gt;&lt;/a&gt; &lt;a href="http://images.cnblogs.com/cnblogs_com/chengmo/WindowsLiveWriter/php_10FFD/image_14.png"&gt;&lt;img style="display: inline; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/chengmo/WindowsLiveWriter/php_10FFD/image_thumb_6.png" border="0" alt="image" width="73" height="46" /&gt;&lt;/a&gt; &lt;a href="http://images.cnblogs.com/cnblogs_com/chengmo/WindowsLiveWriter/php_10FFD/image_16.png"&gt;&lt;img style="display: inline; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/chengmo/WindowsLiveWriter/php_10FFD/image_thumb_7.png" border="0" alt="image" width="67" height="38" /&gt;&lt;/a&gt; &amp;hellip;&amp;hellip;&lt;/p&gt;&lt;p&gt;主要特点是：旋转，然后黏贴，干扰线是线粗细可以变，然后正弦波形可以变化。&lt;/p&gt;&lt;p&gt;比较复杂是：calculateTextBox 这个函数，这个是得到字符旋转后的宽度高度。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;demo:&lt;/strong&gt;&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;$rsi = new Utils_Caption();&lt;br/&gt;$rsi-&amp;gt;TFontSize=array(15,17);&lt;br/&gt;$rsi-&amp;gt;Width=50;&lt;br/&gt;$rsi-&amp;gt;Height=25;&lt;br/&gt;$code = $rsi-&amp;gt;RandRSI();&lt;br/&gt;session_start();&lt;br/&gt;$_SESSION["CHECKCODE"] = $code;&lt;br/&gt;$rsi-&amp;gt;Draw();&lt;/blockquote&gt;&lt;p&gt;好了，就写这么些了，代码还有很多不足之处。欢迎朋友提出好的建议。下面，我给出链接地址。&lt;/p&gt;&lt;p&gt;以上代码下载地址是：&lt;a href="http://files.cnblogs.com/chengmo/caption_chengmo.zip"&gt;http://files.cnblogs.com/chengmo/caption_chengmo.zip&lt;/a&gt;&lt;/p&gt;&lt;p&gt;作者：&lt;a href="http://www.cnblogs.com/chengmo" target="_blank"&gt;chengmo&lt;/a&gt; QQ:8292669&lt;br /&gt;出处：&lt;a href="http://www.cnblogs.com/chengmo" target="_blank"&gt;http://www.cnblogs.com/chengmo&lt;/a&gt;&lt;br /&gt;本文版权归作者和博客园共有，欢迎转载，请务必添加原文链接。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chengmo/aggbug/1898062.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chengmo/archive/2010/12/06/1898062.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chengmo/archive/2010/10/30/1864004.html</id><title type="text">由web程序出现乱码开始挖掘(Bom头、字符集与乱码）</title><summary type="text">从第一次开始写web程序，自己还有身边同事开发出现乱码情况基本都没有消停过。估计以后还会一样继续。 这么些年，不断修修改改，也总结也归纳。程序从asp,asp.net,jsp,php，服务器从windows到linux，数据库也从sqlserver,mysql到oracle；它还是偶尔会出现。 好了，我总结下我与它较量的一些收获吧。乱码都与字符集有关系，一切都从它开始说。什么是字符集，什么是字符编...</summary><published>2010-10-29T18:45:00Z</published><updated>2010-10-29T18:45:00Z</updated><author><name>程默</name><uri>http://www.cnblogs.com/chengmo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chengmo/archive/2010/10/30/1864004.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chengmo/archive/2010/10/30/1864004.html"/><content type="html">&lt;p&gt;从第一次开始写web程序，自己还有身边同事开发出现乱码情况基本都没有消停过。估计以后还会一样继续。 这么些年，不断修修改改，也总结也归纳。程序从asp,asp.net,jsp,php，服务器从windows到linux，数据库也从sqlserver,mysql到oracle；它还是偶尔会出现。 好了，我总结下我与它较量的一些收获吧。乱码都与字符集有关系，一切都从它开始说。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;什么是字符集，什么是字符编码，它做什么用？&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;字符（Charcter）是文字与符号的总称，包括文字、图形符号、数学符号等。而字符集是一组抽象的字符组合的集合。如：英文字符集，中文字符集，日文字符集等&lt;/p&gt;&lt;p&gt;&lt;strong&gt;什么是字符编码?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;计算机只能存储0,1之类2进制数字，怎么样让它表示那么多各种各样的字符呢？就需要对各种字符指定一个数值的编码代号它就是字符编码。如：a这个字符，在ascii字符集编码表中对应的编号是97，而&amp;ldquo;中&amp;rdquo;在gb2312字符集中对应的编号是：16进制是D6D0 10进制是54992 。通过编号就可以找到计算机对应字符。不用将那么复杂的字符保存在计算机中，只需要保存它代号就好。&lt;span style="color: #800080;"&gt;字符集只是指定了一个集合中有哪些字符，而字符编码，是为这个集合中所有字符定义个编号，这就是字符集与编码区别所在。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;如果我告诉别人，我这个字符是：gb2312字符集中编号是：54992或者是D6D0 ，无论那个程序都知道是&amp;rdquo;中&amp;rdquo;，如果有人听错了，把它弄成日文JIS字符集，然后他也去找编号是：54992对应的字符，却找到的是：&amp;rdquo;面&amp;ldquo;。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;打了这个比方，相信大家找到原因了，同样如果把54992拿到ascii 码表找，就会得到对应：�� 两个不能打印字符了。 &lt;/p&gt;&lt;p&gt;从上面看，当你拿到本来是gb2312编号，在不是它的字符集里面找就出现这样问题了。 其它，&lt;span style="color: #800080;"&gt;程序出现乱码也都是这个原因，找错了字符集表了. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800080;"&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800080;"&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;字符在计算机是怎么样存储的呢？&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;span style="background-color: #ffffff;"&gt;看了上面介绍，我想大家一定会说，如果所有文本的字符，都用它的符号存储在计算机里面，不就什么问题都么有吗？ 以前也这么想，后来一想啊，如果都存在计算机中，各种各样，怎么样表示呢？计算机处理01之类数字该多方便呢。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #ffffff;"&gt;我们可以通过winhex实际来检查下，下面在简体中文下，将&amp;rdquo;中按照gb2312字符集编码保存。 &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chengmo/WindowsLiveWriter/b00445018129_13C94/image_2.png"&gt;&lt;img style="display: inline; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/chengmo/WindowsLiveWriter/b00445018129_13C94/image_thumb.png" border="0" alt="image" width="554" height="223" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;以gb2312编码保存中文&amp;ldquo;中&amp;rdquo;，实际存储在计算机中是：D6D0，是&amp;ldquo;中&amp;rdquo;在字符集gb2312中的编号啦！&lt;/strong&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;&amp;nbsp;&lt;a href="http://images.cnblogs.com/cnblogs_com/chengmo/WindowsLiveWriter/b00445018129_13C94/image_4.png"&gt;&lt;img style="display: inline; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/chengmo/WindowsLiveWriter/b00445018129_13C94/image_thumb_1.png" border="0" alt="image" width="578" height="425" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #0000ff;"&gt;计算机中只保存该字符在某字符集中对应的字符编号（也叫字符编码）&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #ffffff;"&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;怎么样读取文件并正确显示文件内容？&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;span style="background-color: #ffffff;"&gt;从上面例子知道字符实际以该字符在某字符集中字符编码存储与计算机磁盘中。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #ffffff;"&gt;下面以&amp;ldquo;中国&amp;rdquo;为例(中文简体windows)：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;table border="0" cellspacing="1" cellpadding="4" width="500" bgcolor="#666666"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td rowspan="9" bgcolor="#ffffff"&gt;"中国"&lt;/td&gt;&lt;td bgcolor="#999999"&gt;&lt;strong&gt;保存编码&lt;/strong&gt;&lt;/td&gt;&lt;td bgcolor="#999999"&gt;&lt;strong&gt;存储内容&lt;/strong&gt;&lt;/td&gt;&lt;td bgcolor="#999999"&gt;&lt;strong&gt;记事本打开&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;ANSI&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;D6D0 B9FA&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;正常&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;gb2312&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;D6D0 B9FA&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;正常&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;utf-8+BOM&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;EFBBBF E4B8AD E59BBD&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;正常&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;utf-8&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;E4B8AD E59BBD&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;正常&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;unicode+BOM&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;FFFE 2D4E FD56&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;正常&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;unicode&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;2D4E FD56&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;&lt;strong&gt;乱码（变成ANSI)&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;EUC-JP&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;C3E6 B9F1&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;&lt;strong&gt;乱码（变成ANSI)&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;iso-8859-1&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;3F 3F&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;&lt;strong&gt;乱码（变成ANSI)&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt; 以下以：&amp;ldquo;abc&amp;rdquo;为例&lt;/p&gt;&lt;table border="0" cellspacing="1" cellpadding="4" width="500" bgcolor="#666666"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td rowspan="9" bgcolor="#ffffff"&gt;"abc"&lt;/td&gt;&lt;td bgcolor="#999999"&gt;&lt;strong&gt;保存编码&lt;/strong&gt;&lt;/td&gt;&lt;td bgcolor="#999999"&gt;&lt;strong&gt;存储内容&lt;/strong&gt;&lt;/td&gt;&lt;td bgcolor="#999999"&gt;&lt;strong&gt;记事本打开&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;ANSI&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;61 62 63&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;正常&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;gb2312&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;61 62 63&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;正常&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;utf-8+BOM&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;EFBBBF 61 62 63&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;正常&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;utf-8&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;61 62 63&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;正常&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;unicode+BOM&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;FFFE 61 62 63&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;正常&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;unicode&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;61 62 63&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;正常（变成ANSI)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;EUC-JP&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;61 62 63&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;正常（变成ANSI)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;iso-8859-1&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;61 62 63&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;正常（变成ANSI)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;从上面可以得到几点：&lt;/p&gt;&lt;p&gt;1、以某字符集存储字符时，它会在该字符集中搜索这个字符的位置（编号或编码），以这个编号（编码）保存在文件，如果所搜找不到该字符，一般会以：3F 3F保存（一定会出错）&lt;/p&gt;&lt;p&gt;2、当需要显示字符，从取文件中字符编码，如果没有指定字符集，会通过文件头（主要unicode字符集有特殊头标记）判断字符集，如果不是unicode字符集，默认都以ANSI字符集读取，用字符编码在该字符集中寻找对应字符，如果搜索到就正常显示，搜索不到就会显示乱码.&lt;/p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/blockquote&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;strong&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/strong&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;常见问题字符疑问收集&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;strong&gt;什么是ANSI字符集?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 这个不是固定字符集，如果在中文简体windows中，它代码字符集是gb2312，在繁体值代表是big5等等。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;为什么英文字符不会出现乱码？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 常见ascii码字符集是：128字符，对应编码值是：1-128 ，二进制表示是：00000001-01111111。它表示了所有常见英文数字，标点符号。其它字符集都是由ascii码字符集扩展而来，扩展了最高位由10000000开始，用多字节表示新的字符，基本都保留了：0xxxxxxx 开头128个基本字符，而且对应编码与ascii码相同。 &lt;/p&gt;&lt;p&gt;这样，常见英文字符不论在那种字符集中，对应字符编码一致，存储编码也一样。读取时候无论用什么字符集读取，它所对应字符也一直。所有基本不会出现乱码情况。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;读取软件能够识别存储文件的字符集吗？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;由于目前各种字符集加起来有上百种，目前除了unicode字符集，定义的存储文件头，基本其它字符集只是给出了对应的字符编号值。因此，相同编号会出现在不同的字符集中，光从文件存储的编码值，是不能确定它的字符集的。如：gb2312字符集中，D6d0对应是&amp;ldquo;中&amp;rdquo;，而同样是：D6D0在ecu-jp 字符集中，对应是&amp;ldquo;面&amp;rdquo;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;什么是bom头？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;bom全称是：byte order mark，汉语意思是标记字节顺序码。只是出现在：unicode字符集中，只有unicode字符集，存储时候，要求指定编码，如果不指定，windows还会用默认的：ANSI读取。常见的bom头是：&lt;/p&gt;  UTF-8 ║ EF BB BF &lt;br/&gt;  UTF-16LE ║ FF FE (小尾）&lt;br/&gt;  UTF-16BE ║ FE FF （大尾）&lt;br/&gt;  UTF-32LE ║ FF FE 00 00 &lt;br/&gt;  UTF-32BE ║ 00 00 FE FF&lt;p&gt;&lt;strong&gt;&lt;br /&gt;unicode与utf-8 、utf-16 utf-32是什么关系？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;unicode（统一码、万国码、单一码）是一种字符集，Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。Unicode用数字0-0x10FFFF来映射这些字符，最多可以容纳1114112个字符，或者说有1114112个码位。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。在Unicode中：汉字&amp;ldquo;字&amp;rdquo;对应的数字是23383。我们可以用：UTF-8、UTF-16、UTF-32表示这个数字，将数字23383存储在计算机中。UTF-8对应是：0xE6, 0xB1, 0x89(3个字节）,UTF-16对应是：0x6c49（2个字节）,UTF-32对应是：0x6c49（4个字节）。utf-8,utf-16,utf-32是unicode码一种实现形式，都是属于unicode编码。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;unicode编码特点是什么？&lt;/strong&gt;&lt;/p&gt;unicode编码特点是，它定义了编码方式和存储实现方式。编码方式就是上面说的可以用，utf-8&amp;hellip;utf-32表示，而存储实现方式，无论那种编码都知道了文件头(bom)。因此，可以通过这个特殊头来判断存储的文本文件使用那种字符集编码。 &lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&amp;nbsp;&lt;strong&gt;为什么utf-8编码不指定bom头（可以理解为文件头），软件任然可以正常判断出它字符集编码？&lt;/strong&gt;这个问题估计很多朋友都会产生疑问，为什么utf-16不指定就读乱码，而utf-8可以。我们可以从下面的例子看下： utf-8是怎么样从unicode转换而来了。&amp;nbsp;  Unicode编码(16进制) ║ UTF-8 字节流(二进制) &lt;br/&gt;  000000 - 00007F ║ 0xxxxxxx &lt;br/&gt;  000080 - 0007FF ║ 110xxxxx 10xxxxxx &lt;br/&gt;  000800 - 00FFFF ║ 1110xxxx 10xxxxxx 10xxxxxx &lt;br/&gt;  010000 - 10FFFF ║ 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 从上面看，发现规律没有？第一个自己开头有几个&amp;rdquo;1&amp;rdquo;,后面就对应有几个10开头字节了。 这样我们都可以通过正则进行检测了.&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [\x09\x0A\x0D\x20-\x7E]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # ASCII&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |[\xC2-\xDF][\x80-\xBF]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # non-overlong 2-byte&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |\xE0[\xA0-\xBF][\x80-\xBF]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # excluding overlongs&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}&amp;nbsp;&amp;nbsp; # straight 3-byte&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |\xED[\x80-\x9F][\x80-\xBF]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # excluding surrogates&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |\xF0[\x90-\xBF][\x80-\xBF]{2}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # planes 1-3&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |[\xF1-\xF3][\x80-\xBF]{3}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # planes 4-15&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |\xF4[\x80-\x8F][\x80-\xBF]{2}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # plane 16 &lt;/p&gt;&lt;p&gt;由于它独特的编码存储特点，因此目前常见文本处理软件就能够自动分析出来。（windows记事本，editplus,notepad++等) &lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;为什么bom头会产生乱码？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;有bom头的存储或者字节流，它一定是unicode字符集编码。到底属于那一种（utf-8还是utf-16或是utf-32)，通过头可以判断出来。由于已经说过utf-16,utf-32不指定bom头，解析程序默认就认为是ansi编码，出现乱码。 而utf-8指定或者不指定程序都可判断知道对于的字符集编码。问题就出在这里，可能有的应用程序（ie6浏览器），它就认为如果utf-8编码，就不需要指定bom头，它可以自己判断，相反指定了bom头，它还会出现问题（因为它把头当utf-8解析出现乱码了）。这里不截图了，cnblogs里面谈这个比较多，目前ie6会出现问题。其它ie7+,firefox,chrome不会出现，会忽略掉bom头。 统一解决办法是：存为utf-8编码是，不需要加入bom头，其它utf-16,utf-32加入。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;通过程序运算gb2312编码能够自动转换为utf-8编码吗？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;utf-8实际是unicode字符集表现方式。如果看了这2种字符集编码表就清楚了。 它是2个独立字符集，相同汉字在2个字符集中所对应编号没有关系，而且汉字顺序也不同，gb2312先按照拼音后按照笔画排序，而unicode没有做相应规定。我们清楚知道，如果没有对应字符集映射关系表在手。通过直接程序进行运算是实现不了的。如果你手里有这2个字符集映射表。如：&amp;rdquo;字&amp;rdquo;utf-8是：0xE6, 0xB1, 0x89 ，对应unicode编码是：23383,然后拿23383，在unicode字符集寻找，发现是字符&amp;ldquo;字&amp;rdquo;，接着将&amp;ldquo;字&amp;rdquo;这个字符，拿到gb2312表中查询：0xCE,0xC4 因此转换结果是：0xE6,0xB1,0x89 ---&amp;gt; 0xCE,0xC4。 &lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;GB2312、GBK、gb18030、Big5是什么关系？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;GB2312:1980年的GB2312一共收录了7445个字符，包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7，低字节从A1-FE，占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;GBK: 汉字国标扩展码,基本上采用了原来GB2312-80所有的汉字及码位，并涵盖了原Unicode中所有的汉字20902，总共收录了883个符号， 21003个汉字及提供了1894个造字码位。包括港、台两种汉字字库.&amp;nbsp;&lt;p&gt;GB18030-2000产生，在GBK汉字标准字符集继续扩展,GB18030是GBK的超集，也就是包含的字符要比GBK多，又增加了6351个字符，其中一部分为4字节字（four-byte encoding range）。增加了六种少数民族语言和一些四字节字。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Big5是中国台湾的，是繁体中文代表&lt;/p&gt;&lt;p&gt;GB18030兼容GBK兼容GB2312 ，相同常用汉字在GB2312编码表中字符编号（编码）与GBK,GB18030相同。如：&amp;rdquo;字&amp;ldquo;gb2312字符编码是：0xCE,0xC4 ，它在其它2个里面也是这个。因为GB2312只有7000多常用汉字，当出现繁体，古文时候就会出现问题，因此采用大集合的GB18030是个不错选择。&lt;/p&gt;&lt;p&gt;Big5与GB2312不能通过程序相互转换，需要有字符集映射关系表才能完成。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;字符集是怎么样一个演变过程呢？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这个如果讲故事可以讲很久了。当计算机有美国人发明后，当时设计到字符输入，由于是英文字符，通过收集整理。它们形成了标准的ascii码(128) 字符集。8位，首位为0。 由于不断普及，欧洲西方国家相应使用，发现有些特殊字符它们不能表示，如：&amp;lambda;&amp;phi;等。如是出来想法，想利用ascii码后128位，增加它们的字符。这样就出现了EASCII码。这些还是不能表示所有国家，想法语，俄语等有自己特殊字符。因此制定标准将后128位进行分片制定。制定出iso-8859系列字符集。&lt;/p&gt;&lt;p&gt;ISO/IEC 8859-1 (Latin-1) - 西欧语言&lt;br /&gt;ISO/IEC 8859-2 (Latin-2) - 中欧语言&lt;br /&gt;ISO/IEC 8859-3 (Latin-3) - 南欧语言。世界语也可用此字符集显示。&lt;br /&gt;ISO/IEC 8859-4 (Latin-4) - 北欧语言&lt;br /&gt;ISO/IEC 8859-5 (Cyrillic) - 斯拉夫语言&lt;br /&gt;ISO/IEC 8859-6 (Arabic) - 阿拉伯语&lt;br /&gt;ISO/IEC 8859-7 (Greek) - 希腊语&lt;br /&gt;ISO/IEC 8859-8 (Hebrew) - 希伯来语（视觉顺序）&lt;br /&gt;ISO 8859-8-I - 希伯来语（逻辑顺序）&lt;br /&gt;ISO/IEC 8859-9（Latin-5 或 Turkish）- 它把Latin-1的冰岛语字母换走，加入土耳其语字母。&lt;br /&gt;ISO/IEC 8859-10（Latin-6 或 Nordic）- 北日耳曼语支，用来代替Latin-4。&lt;br /&gt;ISO/IEC 8859-11 (Thai) - 泰语，从泰国的 TIS620 标准字集演化而来。&lt;br /&gt;ISO/IEC 8859-13（Latin-7 或 Baltic Rim）- 波罗的语族&lt;br /&gt;ISO/IEC 8859-14（Latin-8 或 Celtic）- 凯尔特语族&lt;br /&gt;ISO/IEC 8859-15 (Latin-9) - 西欧语言，加入Latin-1欠缺的芬兰语字母和大写法语重音字母，以及欧元（&amp;euro;）符号。&lt;br /&gt;ISO/IEC 8859-16 (Latin-10) - 东南欧语言。主要供罗马尼亚语使用，并加入欧元符号。&lt;/p&gt;&lt;p&gt;这些在一段时间，可以解决西方国家常见字符。当后来电脑在中日韩等国家普及时候，象中国常见汉字有7000多个，扩展128个空位，完全不够。因此，需要用多个字节表示。后来就定，第一个字节，第一位如果是1，后面还有一个字节与之一起表示一个字符。如果是0，就对应ascii码。 这样就形成了国内的gb2312,后来还是不够表示繁体中文，加入了：gbk，最后是gb18030,但是，这样全世界各个国家还是用它们自己字符集进行表示。没有一个统一的大字符集，能够表示全球所有字符。直到unicode出现，它的设计最多可以表示100多万个字符。全球所有字符都可以收纳在其中。 写出的程序，不用经常进行各种编码转换。就可以让世界上所有国家可以阅读对应字符文字。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;什么是代码页，它与字符集有什么关系？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;大家在指定网页程序语言生活，还记得cp936表示中文代码页(code page)。那么它与我们说的gbk字符集有什么关系呢？&lt;span style="color: #800080;"&gt;代码页是字符集编码的别名，也有人称"内码表"。早期，代码页是IBM称呼电脑BIOS本身支持的字符集编码的名称。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800080;"&gt;常见字符集&lt;/span&gt;&lt;span style="color: #000000;"&gt;与代码页直接映射是：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;cp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; charset&lt;/p&gt;&lt;p&gt;932 &amp;mdash; 日文&lt;br /&gt;936 &amp;mdash; 简体中文（GBK）&lt;br /&gt;949 &amp;mdash; 韩文&lt;br /&gt;950 &amp;mdash; 繁体中文（大五码）&lt;br /&gt;1200 &amp;mdash; UCS-2LE Unicode 小端序&lt;br /&gt;1201 &amp;mdash; UCS-2BE Unicode 大端序&lt;br /&gt;65001 &amp;mdash; UTF-8 Unicode&lt;/p&gt;&lt;p&gt;936就是我们的gbk字符编码集。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;CJK字符集是什么？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;cjk代号意思是：汉语（Chinese）、日语（Japanese）、韩语（Korean）。也就是包含这3国语言的字符集。包含这3个国家常见的汉字，一共有2万多个。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;所有软件都会默认是：ANSI字符集吗？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;不同程序默认读取字符集不同，上面举例是记事本默认是这样的。在php里面会以：iso-8859-1读取。 jsp程序，java默认字符集也是：iso-8859-1。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;为什么很多软件程序编译过程使用是：iso-8859-1字符集？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;由于我们通过应用程序书写的软件是用各种字符集编码保存在磁盘中。如果中文默认是用gbk。保存于磁盘中，默认以字节码保存，是否有无中文，每个字码值在：1-256。这些刚好可以用iso-8859-1扩展单字节字符集。因为，它是存储最小单元。在程序语言里面，不会用中文作变量，函数等名称。那些对应都是常见ascii码。而中文用字注释，或者一些常量中。在编译时候不会影响到语法问题。它会以原来字节码保持原样。在读取时候，只需要用对应的字符集编码读出，就能得到对应中文字符。 &lt;/p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;说到这里，其实字符集问题可能还有很多，欢迎讨论！&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;作者：&lt;a href="http://www.cnblogs.com/chengmo"&gt;chengmo&lt;/a&gt; QQ:8292669&lt;br /&gt;出处：&lt;a href="http://www.cnblogs.com/chengmo"&gt;http://www.cnblogs.com/chengmo&lt;/a&gt;&lt;br /&gt;本文版权归作者和博客园共有，欢迎转载，请务必添加原文链接。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chengmo/aggbug/1864004.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chengmo/archive/2010/10/30/1864004.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chengmo/archive/2010/10/27/1862791.html</id><title type="text">linux whatis与whatis database 使用及查询方法（man使用实例）</title><summary type="text">在学习man命令时候，估计很多朋友都发现有man –f ,man –k 参数，可以查出很多数据。这些有的与man手册页相同，有些不是属于手册页的。它们数据怎么收集来的，并且whatis是怎么样工作的。通过man查找帮助过程：[chengmo@centos5 ~]$ man -h...f:same as whatis(1)... #觉得比较奇怪，whatis是什么呢？ [ch...</summary><published>2010-10-27T09:12:00Z</published><updated>2010-10-27T09:12:00Z</updated><author><name>程默</name><uri>http://www.cnblogs.com/chengmo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chengmo/archive/2010/10/27/1862791.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chengmo/archive/2010/10/27/1862791.html"/><content type="html">&lt;p&gt;在学习man命令时候，估计很多朋友都发现有man &amp;ndash;f&amp;nbsp; ,man &amp;ndash;k 参数，可以查出很多数据。这些有的与man手册页相同，有些不是属于手册页的。它们数据怎么收集来的，并且whatis是怎么样工作的。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;通过man查找帮助过程：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;[chengmo@centos5 ~]$ man -h&lt;br /&gt;...&lt;br /&gt;&amp;nbsp;f:same as whatis(1)&lt;br /&gt;... &lt;/p&gt;&lt;p&gt;#觉得比较奇怪，whatis是什么呢？ &lt;/p&gt;&lt;p&gt;[chengmo@centos5 ~]$ man whatis&lt;br /&gt;#查询得到是：&lt;br /&gt;#whatis - search the whatis database for complete words. &lt;br /&gt;#它是查询whatis数据库的工具 &lt;/p&gt;&lt;p&gt;#The whatis database is created using the command /usr/sbin/makewhatis.&lt;br /&gt;#里面还说，whatis数据库 是通过/usr/bin/makewhatis建立的 &lt;/p&gt;&lt;p&gt;&lt;strong&gt;收获：&lt;/strong&gt;&lt;span style="color: #0000ff;"&gt;whatis数据库，并且有makewhatis创建，whatis脚本是用作查询的&lt;/span&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;makewhatis是怎么样工作的呢？&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;[chengmo@centos5 ~]$ man makewhatis &lt;/p&gt;&lt;p&gt;&lt;strong&gt;#得到：&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;makewhatis reads all the manual pages contained in the given sections of manpath or the preformatted pages con-tained in the given sections of catpath.&amp;nbsp; For each page, it writes a line in the&amp;nbsp; whatis&amp;nbsp; database;&amp;nbsp; each&amp;nbsp; line consists&amp;nbsp; of&amp;nbsp; the&amp;nbsp; name&amp;nbsp; of the page and a short description, separated by a dash. The description is extracted&amp;nbsp; using the content of the NAME section of the manual page. &lt;/p&gt;&lt;p&gt;#大概意思是：makewhatis 从手册页配置的路径以及领域范围，搜集所有手册页索引信息，每个手册页在数据库加入一行，这行会包括手册页里面name,以及简单描述。 &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;收获：&lt;/strong&gt;&lt;span style="color: #0000ff;"&gt;知道这个数据库是建立是索引，并且每个数据库写入一行(a line) ,会不会这个数据库就是文本文件呢？现在到这里，我们不知道数据库保存地方，也不知道它结构，只有看看whatis命令，看它是不是有源码信息&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;怎么得到whatis程序源码?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;[chengmo@centos5 ~]$ type whatis&lt;br /&gt;whatis is /usr/bin/whatis &lt;/p&gt;&lt;p&gt;#告诉路径我们看看内容 &lt;/p&gt;&lt;p&gt;&lt;br /&gt;[chengmo@centos5 ~]$ vi /usr/bin/whatis &lt;/p&gt;&lt;p&gt;&amp;nbsp; 1 #!/bin/sh&lt;br /&gt;&amp;nbsp; 2 #&lt;br /&gt;&amp;nbsp; 3 # apropos -- search the whatis database for keywords.&lt;br /&gt;&amp;nbsp; 4 # whatis&amp;nbsp; -- idem, but match only commands (as whole words). &lt;/p&gt;&lt;p&gt;&amp;hellip;&amp;hellip; &lt;/p&gt;&lt;p&gt;#它是个sh脚本， &lt;/p&gt;&lt;p&gt;&lt;strong&gt;#得到：&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;#grep &amp;ldquo;关键词&amp;ldquo; /var/cache/man/whatis &lt;/p&gt;&lt;p&gt;#它实际在查找这个文件，/var/cache/man/whatis就是上面说的whatis 数据库 &lt;/p&gt;&lt;p&gt;[chengmo@centos5 ~]$ head /var/cache/man/whatis &lt;br /&gt;$notes_name [Module::Build::Notes] (3pm)&amp;nbsp; - Configuration for $module_name&lt;br /&gt;*_unlocked [unlocked_stdio] (3)&amp;nbsp; - non-locking stdio functions &lt;/p&gt;&lt;p&gt;#&lt;strong&gt;whatis数据库就是一个文本文件记录手册页的索引信息&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;whatis数据库是什么时候创建的呢？&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;[chengmo@centos5 ~]$ ls -al /var/cache/man/whatis &lt;br /&gt;-rw-r--r-- 1 root root 1057156 10-27 04:06 /var/cache/man/whatis &lt;/p&gt;&lt;p&gt;#发现创建时间是凌晨4点左右，看了这个是系统创建的，那么少不了cron怀疑了 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;[chengmo@centos5 ~]$ cat /etc/crontab&amp;nbsp;&amp;nbsp; &lt;br /&gt;SHELL=/bin/bash&lt;br /&gt;PATH=/sbin:/bin:/usr/sbin:/usr/bin&lt;br /&gt;MAILTO=root&lt;br /&gt;HOME=/ &lt;/p&gt;&lt;p&gt;# run-parts&lt;br /&gt;01 * * * * root run-parts /etc/cron.hourly&lt;br /&gt;02 4 * * * root run-parts /etc/cron.daily&lt;br /&gt;22 4 * * 0 root run-parts /etc/cron.weekly&lt;br /&gt;42 4 1 * * root run-parts /etc/cron.monthly &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;有run-parts脚本运行/etc/cron.daily目录下面的文件 &lt;/p&gt;&lt;p&gt;[chengmo@centos5 ~]$ cd /etc/cron.daily/&lt;/p&gt;&lt;p&gt;[chengmo@centos5 cron.daily]$ cat makewhatis.cron &lt;br /&gt;#!/bin/bash &lt;/p&gt;&lt;p&gt;LOCKFILE=/var/lock/makewhatis.lock &lt;/p&gt;&lt;p&gt;makewhatis -u -w &lt;/p&gt;&lt;p&gt;&amp;hellip;&amp;hellip; &lt;/p&gt;&lt;p&gt;找到了这个是由这个脚本运行的 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;以上是通过man命令查找帮助信息的一个过程，有问题，首先分析帮助是个不错的选择。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;作者：&lt;a href="http://www.cnblogs.com/chengmo" target="_blank"&gt;chengmo&lt;/a&gt; QQ:8292669&lt;br /&gt;出处：&lt;a href="http://www.cnblogs.com/chengmo" target="_blank"&gt;http://www.cnblogs.com/chengmo&lt;/a&gt;&lt;br /&gt;本文版权归作者和博客园共有，欢迎转载，请务必添加原文链接。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chengmo/aggbug/1862791.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chengmo/archive/2010/10/27/1862791.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chengmo/archive/2010/10/27/1862553.html</id><title type="text">linux 打造man中文帮助手册图解(man-pages-zh帮助页)</title><summary type="text">刚学习linux有一份中文帮助手册该是多好事情。linux自带的帮助尽管有多种语言，目前各种发行版的linux基本没有中文帮助手册。打造个适合自己中文手册还是很有意义的。配置过程其实比较简单，只需要知道中文包，然后放到man可以搜索到的目录中，基本就可以了。下面将分一下几步：下载开源的man-pages 中文手册包 配置解压手册包 测试安装中文包一、在个人工作目录安装中文帮助手册 这样优点是每个用...</summary><published>2010-10-27T05:49:00Z</published><updated>2010-10-27T05:49:00Z</updated><author><name>程默</name><uri>http://www.cnblogs.com/chengmo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chengmo/archive/2010/10/27/1862553.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chengmo/archive/2010/10/27/1862553.html"/><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;刚学习linux有一份中文帮助手册该是多好事情。linux自带的帮助尽管有多种语言，目前各种发行版的linux基本没有中文帮助手册。打造个适合自己中文手册还是很有意义的。配置过程其实比较简单，只需要知道中文包，然后放到man可以搜索到的目录中，基本就可以了。&lt;/p&gt;&lt;p&gt;下面将分一下几步：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;下载开源的man-pages 中文手册包 &lt;/li&gt;&lt;li&gt;配置解压手册包 &lt;/li&gt;&lt;li&gt;测试安装中文包&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;&lt;strong&gt;一、在个人工作目录安装中文帮助手册&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这样优点是每个用户，登陆进去都可以有自己的语言版帮助手册。大家直接手册不会被相互调用，独立而且灵活&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1、下载开源man中文手册包(man-pages手册页)&lt;/strong&gt;&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="background-color: #ffffff;"&gt;现在准备下载开源帮助手册包：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="background-color: #ffffff;"&gt;1.打开&lt;a title="http://code.google.com/p/manpages-zh/" href="http://code.google.com/p/manpages-zh/"&gt;http://code.google.com/p/manpages-zh/&lt;/a&gt;&amp;nbsp; 点击下方的：&lt;a href="http://manpages-zh.googlecode.com/files/manpages-zh-1.5.tar.gz"&gt;manpages-zh-1.5.tar.gz&lt;/a&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chengmo/WindowsLiveWriter/linuxmanmanpageszh_AA92/image_4.png"&gt;&lt;img style="display: inline; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/chengmo/WindowsLiveWriter/linuxmanmanpageszh_AA92/image_thumb_1.png" border="0" alt="image" width="574" height="423" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;2、通过linux wget下载开发包&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;[chengmo@centos5 ~]$ wget &lt;a href="http://manpages-zh.googlecode.com/files/manpages-zh-1.5.tar.gz"&gt;http://manpages-zh.googlecode.com/files/manpages-zh-1.5.tar.gz&lt;/a&gt;&lt;/p&gt;&lt;p&gt;输入即可&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chengmo/WindowsLiveWriter/linuxmanmanpageszh_AA92/image_6.png"&gt;&lt;img style="display: inline; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/chengmo/WindowsLiveWriter/linuxmanmanpageszh_AA92/image_thumb_2.png" border="0" alt="image" width="574" height="146" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2、解压man中文手册包&lt;/strong&gt;&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;只要在自己工作目录下面建立man/zh_CN 目录，将压缩包解压，按照规格目录中。man命令就可以搜索到。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #808000;"&gt;特别说明下,下面的安装保证你的语言环境设置为中文：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #808000;"&gt;[chengmo@centos5 ~]$ echo $LANG&lt;br /&gt;zh_CN.GB2312&lt;/span&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="color: #808000;"&gt;如果不是：通过 export LANG=zh_CN.GB2312&lt;/span&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="color: #808000;"&gt;如果你发现上面执行不通过，你可以运行：locale -a 查一下你系统支持的字符集&lt;/span&gt;&lt;/p&gt;[chengmo@centos5 ~]$ cd ~&lt;br/&gt;#进入当前目录&lt;br/&gt;[chengmo@centos5 ~]$ mkdir -p man/zh_CN&lt;br/&gt;#建立目录man 以及子目录zh_CN&lt;br/&gt;[chengmo@centos5 ~]$ tree  man  &lt;br/&gt;man&lt;br/&gt;`-- zh_CN&lt;br/&gt;#目录以及子目录已经可以了，现在只需要将压缩包解压到zh_CN 中文目录即可&lt;br/&gt;&lt;br/&gt;[chengmo@centos5 ~]$ tar -xzvf manpages-zh-1.5.tar.gz &lt;br/&gt;manpages-zh-1.5/src/mann/expr.n&lt;br/&gt;manpages-zh-1.5/src/mann/fblocked.n&lt;br/&gt;manpages-zh-1.5/src/mann/fconfigure.n&lt;br/&gt;manpages-zh-1.5/src/mann/fcopy.n&lt;br/&gt;manpages-zh-1.5/src/mann/file.n&lt;br/&gt;manpages-zh-1.5/src/mann/fileevent.n&lt;br/&gt;manpages-zh-1.5/src/mann/filename.n&lt;br/&gt;manpages-zh-1.5/src/mann/flush.n&lt;br/&gt;manpages-zh-1.5/src/mann/focusNext.n&lt;br/&gt;manpages-zh-1.5/src/mann/for.n&lt;br/&gt;manpages-zh-1.5/src/mann/foreach.n&lt;br/&gt;&lt;br/&gt;#......解压数据包&lt;br/&gt;&lt;br/&gt;[chengmo@centos5 ~]$ cd manpages-zh-1.5&lt;br/&gt;[chengmo@centos5 manpages-zh-1.5]$ ls&lt;br/&gt;COPYING  debian  DOCS  Makefile  man-pages-zh_CN.spec  raw  README  README.GB  src  utils&lt;br/&gt;#该目录结构 支持make安装的,可以通过make命令生成编译文件，也可以直接复制里面src目录安装&lt;br/&gt;&lt;br/&gt;[chengmo@centos5 manpages-zh-1.5]$ make&lt;br/&gt;mkdir UTF-8&lt;br/&gt;cp -r src/man* UTF-8/&lt;br/&gt;#已经生成了：UTF-8目录下面文件，只需要将该目录复制到~/man/zh_CN下面即可&lt;br/&gt;[chengmo@centos5 manpages-zh-1.5]$ cp -r UTF-8/* ~/man/zh_CN/&lt;br/&gt;通过上面几步已经将帮助手册安装到自己的工作目录下面的man/zh_CN下面了。&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3、测试man中文帮助手册是否安装成功&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;下面检查下，看man中文手册是否加入到man路径里面了。[chengmo@centos5 manpages-zh-1.5]$ man -w&lt;br/&gt;/usr/kerberos/man:/usr/local/share/man:/usr/share/man/zh_CN:/usr/share/man:/home/chengmo/man/zh_CN:/home/chengmo/man:/usr/local/man&lt;br/&gt;#发现已经在MANPATH路径加入了：/home/chengmo/man 以及：/home/chengmo/man/zh_CN&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;[chengmo@centos5 ~]$ man -aw passwd&lt;br/&gt;/usr/share/man/man1/passwd.1.gz&lt;br/&gt;/usr/share/man/man5/passwd.5.gz&lt;br/&gt;/home/chengmo/man/zh_CN/man5/passwd.5&lt;br/&gt;#发现已经找到中文手册了&lt;br/&gt;&lt;br/&gt;[chengmo@centos5 ~]$ man 5 -aw passwd&lt;br/&gt;/usr/share/man/man5/passwd.5.gz&lt;br/&gt;/home/chengmo/man/zh_CN/man5/passwd.5&lt;br/&gt;#读取领域5限定类型，这样系统原先的英文也保留了，看中英文也很方便&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;[chengmo@centos5 ~]$ man 5 -a passwd &lt;br/&gt;#显示英文的，按q就会出来中文文档了&lt;p&gt;&amp;nbsp; &lt;a href="http://images.cnblogs.com/cnblogs_com/chengmo/WindowsLiveWriter/linuxmanmanpageszh_AA92/image_8.png"&gt;&lt;img style="display: inline; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/chengmo/WindowsLiveWriter/linuxmanmanpageszh_AA92/image_thumb_3.png" border="0" alt="image" width="574" height="394" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;二、所有用户公用中文帮助手册&lt;/strong&gt;&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;这里原理跟个人用户基本一样，只是手册放到大家公用目录，而不是个人目录即可。&lt;/p&gt;[chengmo@centos5 ~]$ tree /usr/share/man/zh_CN&lt;br/&gt;/usr/share/man/zh_CN&lt;br/&gt;|-- man1&lt;br/&gt;|   `-- newgrp.1.gz&lt;br/&gt;`-- man8&lt;br/&gt;    |-- adduser.8.gz&lt;br/&gt;    |-- chpasswd.8.gz&lt;br/&gt;    |-- groupadd.8.gz&lt;br/&gt;    |-- groupdel.8.gz&lt;br/&gt;    |-- groupmod.8.gz&lt;br/&gt;    |-- useradd.8.gz&lt;br/&gt;    |-- userdel.8.gz&lt;br/&gt;    `-- usermod.8.gz&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;系统默认公共手册页地址一般在：/usr/share/man下面，放到下面的zh_CN目录即可。&lt;/p&gt;[chengmo@centos5 manpages-zh-1.5]$ make&lt;br/&gt;mkdir UTF-8&lt;br/&gt;cp -r src/man* UTF-8/&lt;br/&gt;#已经生成了：UTF-8目录下面文件，只需要将该目录复制到~/man/zh_CN下面即可&lt;br/&gt;[chengmo@centos5 manpages-zh-1.5]$ cp -r UTF-8/* /usr/share/man/zh_CN/&lt;br/&gt;其它的man.config配置不需要修改。&lt;br/&gt;&lt;strong&gt;检查一下：&lt;/strong&gt;[chengmo@centos5 ~]$ man 5 -aw passwd /usr/share/man/man5/passwd.5.gz /user/share/man/zh_CN/man5/passwd.5 说明手册已经安装好了。&lt;/blockquote&gt;&lt;p&gt;这里2种方法安装介绍了一下，感觉中文手册很不错，可以试试，我个人比较喜欢还是安装到再的工作目录比较好，因为现在linux版本很多，而且命令有很多看似一样，但是实际还有些差别，这种中文手册更新没有相应软件更新快。当使用时候发现命令不一致时候，还是得考究考究原版英文。 保持中英文手册都存在，也是个不错法子。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;作者：&lt;a href="http://www.cnblogs.com/chengmo" target="_blank"&gt;chengmo&lt;/a&gt; QQ:8292669&lt;br /&gt;出处：&lt;a href="http://www.cnblogs.com/chengmo" target="_blank"&gt;http://www.cnblogs.com/chengmo&lt;/a&gt;&lt;br /&gt;本文版权归作者和博客园共有，欢迎转载，请务必添加原文链接。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chengmo/aggbug/1862553.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chengmo/archive/2010/10/27/1862553.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chengmo/archive/2010/10/26/1861809.html</id><title type="text">linux shell man命令详细介绍-快捷获得帮助信息(2)</title><summary type="text">最近几天手头事情比较忙，这个接上一篇：linux shell命令快捷获得系统帮助(一)[man-pages定义规范] ,如果有朋友对于linux系统帮助文件结构与定义感兴趣看下刚才那篇文章。 知道linux帮助文件(man-pages，手册页)一般放在，$MANPATH/man 目录下面，而且按照领域与语言放到不同的目录里面。 看了上一章，要找那个命令使用相关手册，只要我们按照领域区分，到对于目录...</summary><published>2010-10-26T11:48:00Z</published><updated>2010-10-26T11:48:00Z</updated><author><name>程默</name><uri>http://www.cnblogs.com/chengmo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chengmo/archive/2010/10/26/1861809.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chengmo/archive/2010/10/26/1861809.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 最近几天手头事情比较忙，这个接上一篇：&lt;a href="http://www.cnblogs.com/chengmo/archive/2010/10/24/1859837.html"&gt;linux shell命令快捷获得系统帮助(一)[man-pages定义规范]&lt;/a&gt; ,如果有朋友对于linux系统帮助文件结构与定义感兴趣看下刚才那篇文章。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 知道linux帮助文件(man-pages，手册页)一般放在，$MANPATH/man 目录下面，而且按照领域与语言放到不同的目录里面。 看了上一章，要找那个命令使用相关手册，只要我们按照领域区分，到对于目录去查看与命令对应的文件解压,cat file 就可以看到一篇详细的文档了。 但是与快速索引查找帮助相差太远了。linux有一个很好工具，就是man 它会按照系统设计帮助目录，在各个文档里面查询，并且显示内容。接下来，主要讲一下这个命令使用以及配置说明，还有一些使用实例。 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;man命令使用&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;man命令：可以通过一些参数，快速查询linux帮助手册，并且格式化显示。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;使用语法：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;man [-adfhktwW] [section] [-M path] [-P pager] [-S list]&amp;nbsp; [-m system] [-p string] title.. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;参数用法：&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;table border="0" cellspacing="1" cellpadding="4" width="550" bgcolor="#666666"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="43" bgcolor="#cccccc"&gt;参数&lt;/td&gt;&lt;td width="488" bgcolor="#cccccc"&gt;备注&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="2" bgcolor="#ffffff"&gt;&lt;strong&gt;man命令常用参数&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;-a&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;显示所有匹配项&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;-d&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;显示man查照手册文件时候，搜索路径信息,不显示手册页内容&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;-D&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;同-d,显示手册页内容&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;-f&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;同命令whatis ，将在whatis数据库查找以关键字开同的帮助索引信息&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;-h&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;显示帮助信息&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;-k&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;同命令apropos 将搜索whatis数据库，模糊查找关键字&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;-S list&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;指定搜索的领域及顺序 如：-S 1:1p httpd 将搜索man1然后 man1p目录&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;-t&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;使用troff 命令格式化输出手册页 默认：groff输出格式页&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;-w&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;不带搜索title 打印manpath变量 带title关键字 打印找到手册文件路径,默认搜索一个文件后停止&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;-W&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;同-w&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;section&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;搜索领域【限定手册类型】默认查找所有手册&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="2" bgcolor="#ffffff"&gt;&lt;strong&gt;man命令其它参数&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;-c&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;显示使用 cat 命令的手册信息&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;-C&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;指定man 命令搜索配置文件 默认是man.config&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;-K&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;搜索一个字符串在所有手册页中,速度很慢&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;-M&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;指定搜索手册的路径&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;-P pro&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;使用程序pro显示手册页面 默认是less &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;-B pro&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;使用pro程序显示HTML手册页 默认是less&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;-H pro&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;使用pro程序读取HTML手册，用txt格式显示，默认是cat&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;-p str&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;指定通过groff格式化手册之前，先通过其它程序格式化手册&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;它带的参数非常多，其实只有上面常用参数我们才经常使用，其它很多参数几本不会去修改。&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;man命令获得帮助一般过程&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;实例代码&lt;/strong&gt;&lt;/p&gt;[chengmo@centos5 ~]$ man -w passwd&lt;br/&gt;/usr/share/man/man1/passwd.1.gz&lt;br/&gt;#显示passwd帮助文件路径,passwd.1 通过名称知道这个是passwd命令帮助手册,那它的其它命令的呢？&lt;br/&gt;&lt;br/&gt;[chengmo@centos5 ~]$ man -aw passwd&lt;br/&gt;/usr/share/man/man1/passwd.1.gz&lt;br/&gt;/usr/share/man/man5/passwd.5.gz&lt;br/&gt;#加入-a获得所有帮助手册文件地址,默认只会查找一个&lt;br/&gt;&lt;br/&gt;[chengmo@centos5 ~]$ man 5 passwd &lt;br/&gt;#只得到passwd配置文件帮助信息，可以加入领域类型限制,如果知道5，默认是查询man5 文件配置信息说明 手册目录&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;[chengmo@centos5 ~]$ man -d passwd&lt;br/&gt;Reading config file /etc/man.config&lt;br/&gt;.....&lt;br/&gt;found man directory /usr/man&lt;br/&gt;using /usr/bin/less -is as pager&lt;br/&gt;using /usr/bin/less -is as browser&lt;br/&gt;using /bin/cat to dump HTML pages as text&lt;br/&gt;path directory /bin is in the config file&lt;br/&gt;adding /usr/share/man/zh_CN to manpath&lt;br/&gt;adding /usr/share/man to manpath&lt;br/&gt;found 'NROFF_OLD_CHARSET' in path&lt;br/&gt;old charset of '/usr/share/man/man1/passwd.1.gz' is 'ISO-8859-1'&lt;br/&gt;man: &lt;br/&gt;not executing command:&lt;br/&gt;  (cd /usr/share/man &amp;amp;&amp;amp; (echo ".ll 11.8i"; echo ".nr LL 11.8i"; echo ".pl 1100i"; /usr/bin/gunzip -c '/usr/share/man/man1/passwd.1.gz'; echo ".\\\""; echo ".pl \n(nlu+10") | /usr/bin/gtbl | /usr/bin/nroff -c --legacy ISO-8859-1 -mandoc 2&amp;gt;/dev/null | /usr/bin/less -is)&lt;br/&gt;&lt;br/&gt;#man -d 返回man 执行过程搜索查找方法，以及查询手册通过怎么样格式化语句显示。都会列出来&lt;br/&gt;#可以看到，指定pages,borwser输出命令对应文件，html输出文件，搜索路径，由于我当前LANG=zh_CN.gb2312因此，添加了zh_CN目录搜索&lt;br/&gt;#最终执行命令时候，通过一系列格式转换命令，最终有less显示&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;[chengmo@centos5 ~]$ man -S 1:2 passwd&lt;br/&gt;#在领域类型是：1:2 范围内查找手册，对应目录分别是man1 ,man2&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;[chengmo@centos5 ~]$ man -f httpd&lt;br/&gt;httpd                (8)  - Apache Hypertext Transfer Protocol Server&lt;br/&gt;httpd               (rpm) - Apache HTTP Server&lt;br/&gt;httpd-devel         (rpm) - Development tools for the Apache HTTP server.&lt;br/&gt;#在whatis数据库（有所有网站man帮助以及cat,doc帮助信息索引）中查询，文件标题以：http开头信息的文档&lt;br/&gt;#中间的(8) 对应我们可以用：man 8 httpd 调用，对于显示(rpm)实际上显示有个httpd帮助信息，是属于一个httpd rpm安装包，通过man rpm httpd查看不了。可以通过rpm -ql httpd 查找安装包&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;[chengmo@centos5 ~]$ man -k httpd&lt;br/&gt;CGI::Carp            (3pm)  - CGI routines for writing to the HTTPD (or other) error log&lt;br/&gt;httpd                (8)  - Apache Hypertext Transfer Protocol Server&lt;br/&gt;httpd               (rpm) - Apache HTTP Server&lt;br/&gt;httpd-devel         (rpm) - Development tools for the Apache HTTP server.&lt;br/&gt;httpd_selinux        (8)  - Security Enhanced Linux Policy for the httpd daemon&lt;br/&gt;lighttpd             (1)  - a fast, secure and flexible webserver&lt;br/&gt;lighttpd            (rpm) - Lightning fast webserver with light system requirements&lt;br/&gt;lighttpd-fastcgi    (rpm) - FastCGI module and spawning helper for lighttpd and PHP configuration&lt;br/&gt;ncsa_auth            (8)  - NCSA httpd-style password file authentication helper for Squid&lt;br/&gt;#在whatis数据库中，查询包含httpd所有帮助手册，以及安装包. 可以通过：rpm -ql lighttpd&lt;br/&gt;&lt;br/&gt;[chengmo@centos5 ~]$ rpm -ql lighttpd | grep gz&lt;br/&gt;/usr/share/man/man1/lighttpd.1.gz&lt;br/&gt;#其实这个包刚好是：lighttpd             (1)  - a fast, secure and flexible webserver 帮助手册&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;[chengmo@centos5 ~]$ man -w&lt;br/&gt;/usr/kerberos/man:/usr/local/share/man:/usr/share/man/zh_CN:/usr/share/man:/usr/local/man&lt;br/&gt;#显示man 命令查找手册的路径&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800080;"&gt;对于：whatis数据库，以及中文化linux帮助文件这里先不分析。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800080;"&gt;一般遇到一个不是很熟悉命令可以先通过：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800080;"&gt;man -k command1&amp;nbsp; 查询所有类似帮助文件信息，这样输出最多也可以用：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800080;"&gt;man -f&amp;nbsp; command1 查询以command1开头所有相关帮助信息列表 如果发现有类似：command1 (5)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800080;"&gt;man 5 command1 通过直接定位5获得帮助信息&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;man命令搜索配置文件（man.config配置方法）&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;man这个命令为什么功能这么神奇，能够这么方便快捷索引出系统帮助信息，其它与它的一个配置文件分不开。我们看一下它配置文件。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;[chengmo@centos5 ~]$ man -f man&lt;br/&gt;man                  (1)  - format and display the on-line manual pages&lt;br/&gt;man                  (1p)  - display system documentation&lt;br/&gt;man                  (7)  - macros to format man pages&lt;br/&gt;man                 (rpm) - A set of documentation tools: man, apropos and whatis.&lt;br/&gt;man-pages           (rpm) - Man (manual) pages from the Linux Documentation Project.&lt;br/&gt;man.config [man]     (5)  - configuration data for man&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;通过该命令，我们索引到所有与man有关的手册页了。 根据前面提到的领域设置类型，(1)是man命令说明，(7)man文件使用的宏格式规定，下面有一个：man.config (5) ，就是man的配置文件了。 &lt;/p&gt;&lt;p&gt;&lt;strong&gt;读取man.config文件：&lt;/strong&gt;&lt;/p&gt;[wangsl@centos5 ~]$ cat /etc/man.config | grep -v '^#'&lt;br/&gt;FHS&lt;br/&gt;MANPATH /usr/man&lt;br/&gt;MANPATH /usr/share/man&lt;br/&gt;MANPATH /usr/local/man&lt;br/&gt;MANPATH /usr/local/share/man&lt;br/&gt;MANPATH /usr/X11R6/man&lt;br/&gt;MANPATH_MAP     /bin                    /usr/share/man&lt;br/&gt;MANPATH_MAP     /sbin                   /usr/share/man&lt;br/&gt;MANPATH_MAP     /usr/bin                /usr/share/man&lt;br/&gt;MANPATH_MAP     /usr/sbin               /usr/share/man&lt;br/&gt;MANPATH_MAP     /usr/local/bin          /usr/local/share/man&lt;br/&gt;MANPATH_MAP     /usr/local/sbin         /usr/local/share/man&lt;br/&gt;MANPATH_MAP     /usr/X11R6/bin          /usr/X11R6/man&lt;br/&gt;MANPATH_MAP     /usr/bin/X11            /usr/X11R6/man&lt;br/&gt;MANPATH_MAP     /usr/bin/mh             /usr/share/man&lt;br/&gt;TROFF           /usr/bin/groff -Tps -mandoc&lt;br/&gt;NROFF           /usr/bin/nroff -c --legacy NROFF_OLD_CHARSET -mandoc 2&amp;gt;/dev/null&lt;br/&gt;EQN             /usr/bin/geqn -Tps&lt;br/&gt;NEQN            /usr/bin/geqn -Tutf8&lt;br/&gt;TBL             /usr/bin/gtbl&lt;br/&gt;REFER           /usr/bin/grefer&lt;br/&gt;PIC             /usr/bin/gpic&lt;br/&gt;VGRIND&lt;br/&gt;GRAP&lt;br/&gt;PAGER           /usr/bin/less -is&lt;br/&gt;BROWSER         /usr/bin/less -is&lt;br/&gt;HTMLPAGER       /bin/cat&lt;br/&gt;CAT             /bin/cat&lt;br/&gt;CMP             /usr/bin/cmp -s&lt;br/&gt;COMPRESS        /usr/bin/bzip2&lt;br/&gt;COMPRESS_EXT    .bz2&lt;br/&gt;MANSECT         1:1p:8:2:3:3p:4:5:6:7:9:0p:n:l:p:o:1x:2x:3x:4x:5x:6x:7x:8x&lt;br/&gt;.gz             /usr/bin/gunzip -c&lt;br/&gt;.bz2            /usr/bin/bzip2 -c -d&lt;br/&gt;.z&lt;br/&gt;.Z              /bin/zcat&lt;br/&gt;.F&lt;br/&gt;.Y&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;配置文件分类：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;MANPATH 关键字&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/strong&gt;指定手册默认存放路径，man启动就会在这些目录中索引手册页，可以通过添加一行：MANPATH /home/chengmo/man 指定加入自己的手册路径，通过man -M可以添加自己的手册路径&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;MANPATH_MAP关键字&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp; &lt;/strong&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;&amp;nbsp; linux系统手册页，大家在看到时候有高亮，然后还有加粗，下划线，倾斜，空行等固定格式。其实这些在本来的手册页文件里面，只是保存为一系列的代号。大家不妨解压个gz手册文件，然后通过cat查看下内容。你会发现显示里面有如下内容中（点开头，然后一系列数字，而且整个页面显示杂乱无章，跟我们man看到完全不一样），其它这些代号对应是linux文件里面的宏指令代码，如：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .B 粗体 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .BI 粗体跟斜体 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .BR 粗体跟正体 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .I 斜体 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .IB 斜体跟粗体 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .IR 斜体跟正体 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .RB 正体跟粗体 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .RI 正体跟斜体 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .SM 小（缩放到正常大小的9/10） &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .SB 小跟黑体（所跟的黑体不会缩小） &lt;/p&gt;&lt;p&gt;如果不清楚这个关系，把这些宏指令比拟为：html语言一些标签，在记事本中打开，大家都看不明白，但是如果用ie查看。就一目了然了。 &lt;/p&gt;&lt;p&gt;这些宏指令在显示时候，必须通过一系列命令做格式转换，这里必须提到是：groff系列命令(它的工作有点像IE）：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="8" width="600"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="598" valign="top"&gt;&lt;p&gt;&lt;span style="color: #800080;"&gt;groff简介：&lt;/span&gt; &lt;/p&gt;&lt;p&gt;Groff (GNU Troff) 是 Troff 的最新开放源码实现，Troff 是从相同的输入源为各种设备生成打印和屏幕文档的一种文档格式化输出系统。 &lt;/p&gt;&lt;p&gt;Groff 是一种用于格式化输出文档的编程语言。它由一套工具组成，而不是单个的应用程序，&lt;code&gt;groff&lt;/code&gt; 工具是使用这些工具的前端。其中包括处理特殊的输入文本的预处理器、用于处理输入的称为 &lt;code&gt;troff&lt;/code&gt; 的主排版引擎、以及将 &lt;code&gt;troff&lt;/code&gt; 的输出转换为打印和屏幕输出的各种格式的后处理器。 &lt;/p&gt;&lt;p&gt;您可以在文本编辑器中编写输入或者从程序生成输入，无论采用哪种方式，文档的编写过程都发生在 Groff 系统之外。文档使用纯文本进行编写并使用 Groff 语言进行标记，后者指定了文档的格式和外观（请参见为 Groff 编写输入部分）。然后将该输入文本发送到 Groff，以便对其进行处理从而获得所需的输出。 &lt;/p&gt;&lt;p&gt;Groff包含几个处理文本格式的程序。Groff把标准的文本和特殊的命令翻译成格式化的输出，像你在 man 手册页里看到的那样。 &lt;/p&gt;&lt;p&gt;&lt;em&gt;安装下列程序&lt;/em&gt;: addftinfo, afmtodit, eqn, eqn2graph, geqn (link to eqn), grn, grodvi, groff, groffer, grog, grolbp, grolj4, grops, grotty, gtbl (link to tbl), hpftodit, indxbib, lkbib, lookbib, mmroff, neqn, nroff, pfbtops, pic, pic2graph, post-grohtml, pre-grohtml, refer, soelim, tbl, tfmtodit, troff and zsoelim (link to soelim) &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;这里只是解析man.config常见的解析命令：&lt;/p&gt;&lt;p&gt;gpic 将内嵌于troff或者TeX输入文件中的图像编译成troff或者TeX理解的指令。&lt;/p&gt;&lt;p&gt;gtbl 实现table表格输出。&lt;/p&gt;&lt;p&gt;neqn 将方程格式化，使其成为适应ASCII输出的脚本，如果文档要表示一些数字开方，根号之类需要它了&lt;/p&gt;&lt;p&gt;refer 将一个文件拷贝到标准输出,并丢弃.[和.]之间作为引用的内容和在.R1和.R2之间解释如何处理这些引用的命令。&lt;/p&gt;&lt;p&gt;troff groff依照合适的顺序并使用合适的参数来执行预处理程序和后处理程序。&amp;nbsp; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;PAGER、BROWSER、HTMLPAGER&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;分别制定最终标准手册页，HTML手册页，HTML as TXT手册页 由那个程序显示。其实基本都是交给了：less这个作为手册页显示程序。当我们打开了手册页后，对它进行翻页查找等操作，其实就是运用less 程序快捷键完成的。如果命令行man &amp;ndash;[PBH] 可以对当前索引，分别用新的程序覆盖系统设置。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;COMPRESS,COMPRESS_EXT&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;设置压缩文件，已经压缩文件生成扩展名，如果需要将手册输出其它格式时候会用到&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;MANSECT&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;指定man 搜索手册目录顺序，假设设置是：&lt;/p&gt;&lt;p&gt;mansect 1:1p:8:2:3:3p:4:5:6:7:9:0p:n:l:p:o:1x:2x:3x:4x:5x:6x:7x:8x &lt;/p&gt;&lt;p&gt;如果直接man command1 ，它将按照这里指定的顺序查找手册页，先是man1,然后man1p&amp;hellip;&amp;hellip; 直到找到一个页面，就停止搜索。除非加了-a 参数。如果调用man -S 1:1p 是可以覆盖这项设置的&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;.gz .bz2&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这个是如果手册页面是这里程序的，用什么程序进行解压。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;我们还记得上次man -d 的参数吧！运行最后会输入一个脚本：&lt;/p&gt;&lt;p&gt;(cd /usr/share/man &amp;amp;&amp;amp; (echo ".ll 11.8i"; echo ".nr LL 11.8i"; echo ".pl 1100i"; /usr/bin/gunzip -c '/usr/share/man/man1/man.1.gz'; echo ".\\\""; echo ".pl \n(nlu+10") | /usr/bin/gtbl | /usr/bin/nroff -c --legacy ISO-8859-1 -mandoc 2&amp;gt;/dev/null | /usr/bin/less -is)&lt;/p&gt;&lt;p&gt;其实这个才是man命令执行后 ，通过各个格式化指令组合，最终shell脚本运行的命令。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;突然想到一个问题，man之所以强大，与它的松散配置分不开，它只是实现了搜索查找，而解压由：gunzip,格式化是由：groff处理，显示有less处理。&lt;/p&gt;&lt;p&gt;说到这里，man好像都说完了，对了，显示的页面怎么操作呢？接下来，我们在看看,less常用命令&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;man显示页面操作（less命令使用）&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;我们找到了自己的帮助文件了，而且已经显示了页面。在这个黑屏页面里面，我怎么样实现查找，跳转等操作呢？&lt;/p&gt;&lt;p&gt;其实，它现在已经进入了less命令管理范围了（可能有朋友认为是vi的，因为它们快捷键很相似，其实是less的）&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chengmo/WindowsLiveWriter/261538b82497_AF34/image_2.png"&gt;&lt;img style="display: inline; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/chengmo/WindowsLiveWriter/261538b82497_AF34/image_thumb.png" border="0" alt="image" width="578" height="393" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;下面说下less命令操作：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;光标移动操作：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;e&amp;nbsp; ^E&amp;nbsp; j&amp;nbsp; ^N&amp;nbsp; CR&amp;nbsp; *&amp;nbsp; 前进一行（或N行）&lt;br /&gt;y&amp;nbsp; ^Y&amp;nbsp; k&amp;nbsp; ^K&amp;nbsp; ^P&amp;nbsp; *&amp;nbsp; 后退一行（或N行）&lt;br /&gt;f&amp;nbsp; ^F&amp;nbsp; ^V&amp;nbsp; SPACE&amp;nbsp; *&amp;nbsp; 前进一个窗口（或N行）&lt;br /&gt;b&amp;nbsp; ^B&amp;nbsp; ESC-v&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&amp;nbsp; 后退一个窗口（或N行）&lt;br /&gt;z&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&amp;nbsp; 前进一个窗口（将窗口设置到N）&lt;br /&gt;w&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&amp;nbsp; 后退一个窗口（将窗口设置到N）&lt;br /&gt;ESC-SPACE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&amp;nbsp; 前进一个窗口，在文件末尾不停止&lt;br /&gt;d&amp;nbsp; ^D&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&amp;nbsp; 前进半个窗口（将这半个窗口设置到N）&lt;br /&gt;u&amp;nbsp; ^U&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&amp;nbsp; 后退半个窗口（将这半个窗口设置到N）&lt;br /&gt;ESC-)&amp;nbsp; RightArrow *&amp;nbsp; 向左半个屏幕宽（或N个位置）&lt;br /&gt;ESC-(&amp;nbsp; LeftArrow&amp;nbsp; *&amp;nbsp; 向右半个屏幕宽（或N个位置）&lt;br /&gt;F&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 一直前进，像"tail -f"一样 &lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;移动操作基本与vi一样的。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;查找操作：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;/pattern&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&amp;nbsp; 向前查找包含pattern的行.&lt;br /&gt;?pattern&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&amp;nbsp; 向后查找包含pattern的行.&lt;br /&gt;n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&amp;nbsp; 查找下一个pattern行.&lt;br /&gt;N&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&amp;nbsp; 查找上一个pattern行.&lt;br /&gt;ESC-n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&amp;nbsp; 同n.&lt;br /&gt;ESC-N&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&amp;nbsp; 同N&lt;br /&gt;ESC-u&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 取消所有搜索的高亮显示 &lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;调动操作：&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;g&amp;nbsp; &amp;lt;&amp;nbsp; ESC-&amp;lt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&amp;nbsp; 跳转到文件第一行&lt;br /&gt;G&amp;nbsp; &amp;gt;&amp;nbsp; ESC-&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&amp;nbsp; 跳转到文件最后一行&lt;br /&gt;p&amp;nbsp; %&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&amp;nbsp; 跳转到文件最开始 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;p&gt;&lt;strong&gt;其它操作：&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&amp;nbsp; :n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&amp;nbsp; 打开跳转到下一个文件&lt;br /&gt;&amp;nbsp; :p&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&amp;nbsp; 打开跳转到上一个文件&lt;br /&gt;&amp;nbsp; :x&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&amp;nbsp; 跳转到第一个打开的文件&lt;br /&gt;&amp;nbsp; h&amp;nbsp; H&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 显示帮助&lt;br /&gt;&amp;nbsp; q&amp;nbsp; :q&amp;nbsp; Q&amp;nbsp; :Q&amp;nbsp; ZZ&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 退出当前打开文件 &lt;/p&gt;&lt;p&gt;less可以打开多个文件，在多个文件操作中，可以使用这些命令。如man -a passwd 实际会查到多个手册，都会有less打开。可以通过这类命令实现打开与关闭。 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;以上是在使用man命令时候，一些总结，大家有好的方法欢迎交流。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;作者：&lt;a href="http://www.cnblogs.com/chengmo" target="_blank"&gt;chengmo&lt;/a&gt; QQ:8292669&lt;br /&gt;出处：&lt;a href="http://www.cnblogs.com/chengmo" target="_blank"&gt;http://www.cnblogs.com/chengmo&lt;/a&gt;&lt;br /&gt;本文版权归作者和博客园共有，欢迎转载，请务必添加原文链接。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chengmo/aggbug/1861809.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chengmo/archive/2010/10/26/1861809.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chengmo/archive/2010/10/25/1857775.html</id><title type="text">linux /dev 常见特殊设备介绍与应用[loop,null,zero,full,random]</title><summary type="text">linux是文件型系统，所有硬件如软件都会在对于的目录下面有相应的文件表示。对于dev这个目录，我们知道它下面的文件，表示的是linux的设备。在windows系统中，设备大家很好理解，象硬盘，磁盘指的是实实在在硬件。而在文件系统的linux下面，都有对于文件与这些设备关联的。访问它们就可以放到实际硬件，想想还是linux灵活了。变成文件，操作该多简单了。不用调用以前com,prt等接口了。直接读...</summary><published>2010-10-25T11:19:00Z</published><updated>2010-10-25T11:19:00Z</updated><author><name>程默</name><uri>http://www.cnblogs.com/chengmo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chengmo/archive/2010/10/25/1857775.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chengmo/archive/2010/10/25/1857775.html"/><content type="html">&lt;p&gt;linux是文件型系统，所有硬件如软件都会在对于的目录下面有相应的文件表示。对于dev这个目录，我们知道它下面的文件，表示的是linux的设备。在windows系统中，设备大家很好理解，象硬盘，磁盘指的是实实在在硬件。而在文件系统的linux下面，都有对于文件与这些设备关联的。访问它们就可以放到实际硬件，想想还是linux灵活了。变成文件，操作该多简单了。不用调用以前com,prt等接口了。直接读文件，写文件就可以向设备发送读或者写操作了。 按照读写存储数据方式，我们可以把设备分为以下几种：字符型设备，块设备，伪设备。&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;&amp;nbsp;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;字符型设备&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;&lt;i&gt;&lt;strong&gt;字符设备&lt;/strong&gt;&lt;/i&gt;是指每次与系统传输1个字符的设备。这些设备节点通常为传真、虚拟终端和串口调制解调器、键盘之类设备提供流通信服务，它通常不支持随机存取数据。 字符设备在实现时，大多不使用缓存器。系统直接从设备读取／写入每一个字符。例如，键盘这种设备提供的就是一个数据流，当你敲入“cnblogs”这个字符串时，键盘驱动程序会按照和输入完全相同的顺序返回这个由七个字符组成的数据流。它们是顺序的，先返回c，最后是s。&lt;/p&gt;&lt;/blockquote&gt; &lt;ul&gt; &lt;li&gt;&amp;nbsp;&lt;strong&gt;块设备&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;&lt;i&gt;&lt;strong&gt;块设备&lt;/strong&gt;&lt;/i&gt;是指与系统间用块的方式移动数据的设备。这些设备节点通常代表可寻址设备，如硬盘、CD-ROM和内存区域。  &lt;p&gt;块设备通常支持随机存取和寻址，并使用缓存器。操作系统为输入输出分配了缓存以存储一块数据。当程序向设备发送了读取或者写入数据的请求时，系统把数据中的每一个字符存储在适当的缓存中。当缓存被填满时，会采取适当的操作（把数据传走），而后系统清空缓存。它与字符设备不同之处就是，是否支持随机存储。字符型是流形式，逐一存储。&lt;/p&gt;&lt;/blockquote&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;伪设备&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;在类Unix操作系统中，设备节点并不一定要对应物理设备。没有这种对应关系的设备是&lt;i&gt;&lt;strong&gt;伪设备&lt;/strong&gt;&lt;/i&gt;。操作系统运用了它们提供的多种功能。部份经常使用到的伪设备包括： null,zero,full,loop,random,urandom&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;strong&gt;二、特殊设备及使用&lt;/strong&gt;&lt;/p&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;这里说到特殊设备除了硬盘主板等，只是它在linux shell命令里面，有特殊的作用，因此把它们单独拿出来。这些设备分别是：&lt;/p&gt; &lt;p&gt;/dev/stdin&lt;/p&gt; &lt;p&gt;/dev/stdout&lt;/p&gt; &lt;p&gt;/dev/stderr&lt;/p&gt; &lt;p&gt;/dev/null&lt;/p&gt; &lt;p&gt;/dev/zero&lt;/p&gt; &lt;p&gt;/dev/full&lt;/p&gt; &lt;p&gt;/dev/random,urandom&lt;/p&gt; &lt;p&gt;/dev/fd&lt;/p&gt; &lt;p&gt;/dev/tcp|upd&lt;/p&gt; &lt;p&gt;/dev/loop&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;1、标准输出输入设备&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;还记得上次说的，linux重定向吗？可以看下：&lt;a href="http://www.cnblogs.com/chengmo/archive/2010/10/20/1855805.html"&gt;linux shell数据重定向（输入重定向与输出重定向）详细分析&lt;/a&gt; 。它们就是与几个特殊文件描述符对应，fd0,fd1,fd2 （stdin,stdout,stderr)&lt;/p&gt; &lt;p&gt;如：&lt;/p&gt;[chengmo@centos5 shell]$ cat&amp;gt;teststdin&amp;lt;/dev/stdin&lt;br/&gt;test&lt;br/&gt;#ctrl+D&lt;br/&gt;#cat从/dev/stdin获得数据，然后将标准输出，输入的到teststdin文件&lt;br/&gt;[chengmo@centos5 shell]$ cat teststdin &lt;br/&gt;test&lt;br/&gt;&lt;br/&gt;[chengmo@centos5 shell]$ cat&amp;gt;teststdin&lt;br/&gt;test&lt;br/&gt;#ctrl+D&lt;br/&gt;#不指定输入，默认输入设备就是/dev/stdinn&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;/dev/stdin&lt;/strong&gt;指的就是键盘设备&lt;/p&gt;[chengmo@centos5 shell]$ cat test.sh &amp;gt;/dev/stdout |grep 'echo'&lt;br/&gt;echo "very good!";&lt;br/&gt;echo "good!";&lt;br/&gt;echo "pass!";&lt;br/&gt;echo "no pass!"&lt;br/&gt;#/dev/stdout指向就是标准输出，因此重定向给它的数据，最终发送到屏幕上（fd1)&lt;br/&gt;&lt;br/&gt;[chengmo@centos5 shell]$ cat test.sh  |grep 'echo'            &lt;br/&gt;echo "very good!";&lt;br/&gt;echo "good!";&lt;br/&gt;echo "pass!";&lt;br/&gt;echo "no pass!";&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;[chengmo@centos5 shell]$ cat test.sh &amp;gt;/dev/stderr |grep 'echo'   &lt;br/&gt;#!/bin/sh&lt;br/&gt;&lt;br/&gt;scores=40;&lt;br/&gt;if [[ $scores -gt 90 ]]; then&lt;br/&gt;    echo "very good!";&lt;br/&gt;elif [[ $scores -gt 80 ]]; then&lt;br/&gt;    echo "good!";&lt;br/&gt;elif [[ $scores -gt 60 ]]; then&lt;br/&gt;    echo "pass!";&lt;br/&gt;else&lt;br/&gt;    echo "no pass!";&lt;br/&gt;fi;&lt;br/&gt;#/dev/stderr 指是错误输出，默认也是输出到屏幕上面，但是它的内容不能通过管道传递给grep，管道只能传递标准输出&lt;br/&gt;&lt;p&gt;&lt;strong&gt;/dev/null设备&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;是个黑洞设备,它丢弃一切写入其中数据，空设备通常被用于丢弃不需要的输出流。记得当年用windows时候，有个类似的设备：NUL ，跟这个功能一样。任何写入该设备数据都会被丢弃掉。从这个里面读取数据返回是空。将一些不用内容经常发送给这个设备,丢弃不需要的数据。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;如：&lt;/strong&gt;&lt;/p&gt;[chengmo@centos5 shell]$ cat /dev/null&lt;br/&gt;[chengmo@centos5 shell]$ cat test.sh &amp;gt;/dev/null#读该设备为空，写入该设备数据都丢弃了&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;/dev/zero设备&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在类UNIX 操作系统中, /dev/zero 是一个特殊的文件，当你读它的时候，它会提供无限的空字符(NULL, ASCII NUL, 0x00)。其中的一个典型用法是用它提供的字符流来覆盖信息，另一个常见用法是产生一个特定大小的空白文件。 &lt;p&gt;&lt;strong&gt;如：&lt;/strong&gt;&lt;/p&gt;[chengmo@centos5 shell]$ dd if=/dev/zero of=testzero count=1024 bs=1024&lt;br/&gt;1024+0 records in&lt;br/&gt;1024+0 records out&lt;br/&gt;1048576 bytes (1.0 MB) copied, 0.0107194 seconds, 97.8 MB/s&lt;br/&gt;#创建一个大小为1M文件，该文件一个块是1024字节，一共是1024块（刚好1M)，用/dev/zero文件内容填充它。输出创建到：testzero文件&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;[chengmo@centos5 shell]$dd if=/dev/zero of=/dev/磁盘分区&lt;br/&gt;#这个命令一定不要随便用，有点象windows里面的粉碎文件工具。不过它是用\0x00填充整个分区。这样做数据是不可以恢复的了。&lt;br/&gt;&lt;br/&gt;[chengmo@centos5 shell]$cat /dev/zero&amp;gt;testinputzero&lt;br/&gt;#这个命令也不能随便使用咯，/dev/zero设备一个特效是，如果你读取的话，是一个死循环会输出无穷的\x00，这样你将创建一个用\x00填充的文件。如果你没有限制该用户磁盘配额。它将耗尽整个磁盘空间。&lt;p&gt;&amp;nbsp; &lt;p&gt;在linux资源配额限制里面，如果没有现在普通用户的磁盘空间利用，或内存使用。一个普通用户就可以通过上面方法一会就塞满整个磁盘。也可以通过while(true) {fork……}类程序，启动无限线程，耗尽整个系统内存。 &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;/dev/full设备&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;类Unix系统中，/dev/full（常满设备）是一个特殊设备文件，总是在向其写入时返回设备无剩余空间（错误码为ENOSPC），读取时则与/dev/zero相似，返回无限的空字符(NULL, ASCII NUL, 0x00)。这个设备通常被用来测试程序在遇到磁盘无剩余空间错误时的行为。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;如：&lt;/strong&gt;&lt;/p&gt;[chengmo@centos5 shell]$ echo 'chengmo' &amp;gt;/dev/full &lt;br/&gt;-bash: echo: write error: 设备上没有空间&lt;br/&gt;[chengmo@centos5 shell]$ echo $?&lt;br/&gt;1&lt;br/&gt;#命令执行返回错误&lt;p&gt;&lt;strong&gt;/dev/random[urandom]&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在类UNIX操作系统中，/dev/random是一个特殊的设备文件，可以用作随机数发生器或伪随机数发生器。它允许程序访问来自设备驱动程序或其它来源的背景噪声。常用作随机数发生器。具体参考：&lt;a href="http://www.cnblogs.com/chengmo/archive/2010/10/23/1858879.html"&gt;linux shell实现随机数多种方法（date,random,uuid)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;strong&gt;/dev/fd&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;记录用户打开的文件描述符&lt;/p&gt;&lt;p&gt;[chengmo@centos5 shell]$ ls /dev/fd/&lt;br&gt;0&amp;nbsp; 1&amp;nbsp; 2&amp;nbsp; 3 &lt;p&gt;详细参考：&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chengmo/archive/2010/10/20/1855805.html"&gt;linux shell数据重定向（输入重定向与输出重定向）详细分析&lt;/a&gt; 文件描述符介绍。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;/dev/tcp[udp]/host/port&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;读取该类形式设备，将会创建一个连接host主机port端口的tcp[upd]连接。打开一个socket通讯接口。&lt;/p&gt;&lt;p&gt;详细使用可以参考：&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chengmo/archive/2010/10/22/1858302.html"&gt;linux shell 脚本实现tcp/upd协议通讯（重定向应用）&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;/dev/loop&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在类UNIX操作系统中，Loop设备 可以把loop 文件，作为块设备挂载使用。&lt;/p&gt;&lt;p&gt;如：&lt;/p&gt;&lt;p&gt;[chengmo@centos5 shell]$mount -o loop example.img /home/chengmo/img&lt;/p&gt;&lt;p&gt;#将img镜像文件挂载到/home/chengmo/img目录下面，有了这个设备，我们不需要通过虚拟光驱就可以读虚拟磁盘格式的文件。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;说了很多linux 特殊设备，其它象cpu,内存，磁盘，网络，键盘，终端设备。跟我们windows里面常见差不多。有什么问题，欢迎交流！&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chengmo/aggbug/1857775.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chengmo/archive/2010/10/25/1857775.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chengmo/archive/2010/10/24/1859837.html</id><title type="text">linux shell命令快捷获得系统帮助(一)[man-pages定义规范]</title><summary type="text">作为刚刚学习linux朋友，我们拿到一个命令，不知道怎么样使用，一般都会先看下命令默认参数说明，然后再不清楚就是通过man命令查阅手册。还是找不到方法，就网上搜索，最后不行就去大论坛发帖。由于很多时候发帖子估计要比较久有人回复。久而久之，对学习linux的热情被怠慢下来了。 其实，这也是学习linux的最大困难。 linux命令帮助，一般有2种，命令自身代码里面带有使用帮助说明，这种一般很精简，太...</summary><published>2010-10-24T10:35:00Z</published><updated>2010-10-24T10:35:00Z</updated><author><name>程默</name><uri>http://www.cnblogs.com/chengmo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chengmo/archive/2010/10/24/1859837.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chengmo/archive/2010/10/24/1859837.html"/><content type="html">&lt;p&gt;作为刚刚学习linux朋友，我们拿到一个命令，不知道怎么样使用，一般都会先看下命令默认参数说明，然后再不清楚就是通过man命令查阅手册。还是找不到方法，就网上搜索，最后不行就去大论坛发帖。由于很多时候发帖子估计要比较久有人回复。久而久之，对学习linux的热情被怠慢下来了。 其实，这也是学习linux的最大困难。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;linux命令帮助，一般有2种，命令自身代码里面带有使用帮助说明，这种一般很精简，太长了，程序自身的大小以及日常维护不方便。还有一种，就是带有帮助文件，类似windows的chm格式文件。下面我说下这2种怎么样查阅。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;一、程序内在帮助信息&lt;/strong&gt;&lt;/p&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#000000"&gt;例如：&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;[chengmo@centos5 ~]$ cat --help&lt;br/&gt;Usage: cat [OPTION] [FILE]...&lt;br/&gt;Concatenate FILE(s), or standard input, to standard output.&lt;br/&gt;&lt;br/&gt;  -A, --show-all           equivalent to -vET&lt;br/&gt;#......省略&lt;br/&gt;&lt;br/&gt;[chengmo@centos5 ~]$ man -h&lt;br/&gt;man, version 1.6d&lt;br/&gt;&lt;br/&gt;usage: man [-adfhktwW] [section] [-M path] [-P pager] [-S list]&lt;br/&gt;        [-m system] [-p string] name ...&lt;br/&gt;#......省略&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font color="#000000"&gt;上面是2个例子，通过参数获得命令使用帮助，这是我们经常用的。 说点题外话，开始跑题了……,呵呵&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#000000"&gt;我想说下命令常见参数规律，一般如果带参数是一个字符,那么就用：一个”-“连接，如果后面参数是多个字符就用：”--“连接。是不是一个”-“后面不能接多个字符呢？这点就是linux命令解析灵活性了，如果你把多个字符用一个”-“连接，它会将它分割为多个参数。如：ls –al 等价于 ls –a –l ,如果你用：ls –-al&amp;nbsp; 那么它将把al作为整体参数了。 &lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#000000"&gt;还要说一点，一般linux命令，都会用-h,或者 --help作为返回命令行帮助信息。 特别是--help最多，有的命令2个都支持。 这个已经成了一种习惯了。遇到不会用的命令，不妨试试这2个参数。 &lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;二、获得命令外部帮助文件(man-pages)&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;什么是手册页（man-pages)&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;font color="#000000"&gt;在windows下面，我们经常把帮助手册叫电子书，是chm文件。在linux下面的帮助手册，一般叫man-pages。它们按照一定规律存放在linux一些文件夹里面，如果需要查阅，可以通过man-pages手册索引命令查阅，常见有：info,man（本文主要讲的）,xman等等。说到这里，肯定有朋友会说：那有windows下面的chm方便吗，搜索，查询，以及表现形式怎么样的呢？在shell终端查看，是不是都是一大篇大篇文字，单独枯燥，密密麻麻的。 哈哈，我可以说的是，它内容表现还很丰富，支持普通文字，表格，图片，还有就是搜索定位到需要信息超快。 一定比在windows里面通过鼠标点击快几倍了。 &lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font color="#000000"&gt;那么它为什么管理方便，索引速度快呢。接下来，我们看一下man-pages也的规范了。&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;man-pages目录及文件名规范定义&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;font color="#000000"&gt;&lt;strong&gt;存放目录：&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;首先是目录以及存放规范,linux文档经常放在：MANPATH环境变量指定的目录中。一般在：/usr/share/man 这个目录里面。这个目录下面结构还有定义的：&lt;/p&gt;[chengmo@centos5 man]$ ls &lt;br/&gt;bg  el  fr            hu            it.UTF-8  man1   man2x  man4   man6   man8   manl  pl.ISO8859-2  ro         sk  zh_CN&lt;br/&gt;cs  en  fr.ISO8859-1  id            ja        man1p  man3   man4x  man6x  man8x  mann  pl.UTF-8      ru         sl  zh_TW&lt;br/&gt;da  es  fr.UTF-8      it            ko        man1x  man3p  man5   man7   man9   nl    pt            ru.KOI8-R  sv&lt;br/&gt;de  fi  hr            it.ISO8859-1  man0p     man2   man3x  man5x  man7x  man9x  pl    pt_BR         ru.UTF-8   tr&lt;br/&gt;#可以分为&lt;strong&gt;2类&lt;/strong&gt;，一类是man[*]目录，一类是：en,zh_CN,pl.ISO8859-2类代表语言已经地区，编码目录&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;先说一下,man[*]这类目录表示意思。linux帮助文档，一个特别的有意思的是，按照文档表示不同类型，分领域的（也就是分类别），过会我们会说这个类别按照什么分了。还有就是类似：zh_CN pl.ISO8859-2这些。文档还分语言.地域.字符编码 。可以支持统一命令，多个语言版本的文档，并且地域可以不一样，还可以指定字符集。如：zh_TW.big5 这个意思就是：中文_台湾地区.使用big5字符集编码的文档。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;br&gt;文档领域区分方法（就是类别）&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我们看下下面的表格：&lt;/p&gt;&lt;table border="0" cellspacing="1" cellpadding="4" width="550" bgcolor="#666666"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="#cccccc" width="41"&gt;&lt;strong&gt;领域&lt;/strong&gt;&lt;/td&gt;&lt;td bgcolor="#cccccc" width="119"&gt;&lt;strong&gt;描述&lt;/strong&gt;&lt;/td&gt;&lt;td bgcolor="#cccccc" width="362"&gt;&lt;strong&gt;说明&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;1&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;用户命令 &lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;可由任何人启动的,如env、cat、man、touch文档&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;2&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;系统调用或内核函数 &lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;即由内核提供的函数 如link、sethostname、mkdir &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;3&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;库程序 &lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;即库函数 如acosh、asctime、btree、locale &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;4&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;与设备有关的信息 &lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;即/dev目录下的特殊文件 如zero null sda&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;5&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;文件格式描述 &lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;如/etc/passwd 文件格式描述说明在这个分类下&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;6&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;游戏 &lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;游戏的帮助文件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;7&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;其他 &lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;包括 宏命令包、惯例等如 arp、boot、regex、unix utf8 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;8&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;系统管理 &lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;只能由root启动 如fdisk、fsck、renice、rpm、yum &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;9&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;内核 &lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;用来存放内核例行程序的文档&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;n&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;新文档&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;可能要移到更适合的领域&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;o&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;老文档&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;可能会在一段期限内保留&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;l&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;本地文档&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;与本特定系统有关的&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;如果文档属于那个类型的，它就放到 MANPATH/语言_区域.字符集/man[n]目录下面。 没有区域语言，代表是en英文文档。就直接放到：MANPATH/man[n]下面,基本上大部分文档都是这个下面。&lt;/p&gt;&lt;p&gt;举个列子吧：&lt;/p&gt;&lt;p&gt;linux下面有个命令是：passwd 修改密码信息的，每个用户都可以调用，所以它会放到man1/目录下面&lt;/p&gt;&lt;p&gt;但是同时，/etc/passwd有个保存用户账户信息配置文件，它的格式及说明信息文档，将放到/man5目录下了。这样按照领域（以后都叫这个了，呵呵）区分，不会出现相同名称文件找错的情况了。 上面提到的：1,2,3,4,5,7,8这些类型是我们经常用到的。 如果我想知道/dev/null 设备的意思，我可以到：man4这个目录下面找了。 &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;font color="#808000"&gt;[命令名称.领域]:名字就是命令、函数或文件名的名称，后面跟一个点，再跟著领域字符。&lt;/font&gt;如：如果passwd命令说明文档，文件名命名是：passwd.1，加上目录存放为：man1/passwd.1 ，如果对应passwd格式说明文档，它将是：man5/passwd.5 。看下下面例子：[chengmo@centos5 man5]$ ls p*      &lt;br/&gt;pam.5.gz       pam_env.conf.5.gz  passwd.5.gz  png.5.gz  &lt;br/&gt;pam.conf.5.gz  pam_krb5.5.gz      pbm.5.gz     pnm.5.gz  &lt;br/&gt;pam.d.5.gz     pam_ldap.5.gz      pgm.5.gz     ppm.5.gz  &lt;br/&gt;#/usr/share/man/man5 下面所有以p开头文件，从文件里面我们就知道它对应于那些配置文件格式说明了。&lt;br/&gt;#pam.d.5.gz就是pam.d目录结构说明  pam.5.gz是pam模块结构说明&lt;p&gt;从这个里面看，.gz结尾，看来是通过gzip压缩过的，linux系统为节省文档存储空间，自带文档都经过压缩的。只是查看时候，我们需要解压然后查看。文档内容不会改变。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;再啰嗦一下：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;细心朋友一定看到个问题，上面显示：man目录下面结构例子里面，除了man[n]以及语言地区目录。还有一类目录：man1,man0p,man1p,man1x 这里说明下：&lt;/p&gt;&lt;p&gt;加p:表示POSIX Programmer 程序说明文档&lt;/p&gt;&lt;p&gt;加x:表示x windows桌面程序说明文档&lt;/p&gt;&lt;p&gt;0p:表示POSIX Programmer 一些c的头文件库，如：tcp.h,ulimit.h等说明文档&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;man-pages文件内容格式规范&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;能够快捷方便查询linux文档，除了目录规范以及命名规范外。对于文档的内容也有一个格式规范呢。 &lt;/p&gt;&lt;p&gt;一个文本文件，又不是用word格式，基本都是ascii字符，还有什么规范？&lt;/p&gt;&lt;p&gt;可能朋友会这么说，是的，它确实是文本文件，编辑一个随便的txt文件，就可以是一个linux文档，如：你写了个：testhellow.sh脚本，然后你写了一段文本存为：man/man1/testhellow.1文件。这个就算一个文档了。 &lt;/p&gt;&lt;p&gt;你通过linux索引方法，是可以找得到的。 &lt;font color="#808000"&gt;但是：它不是一个规范的文档。&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#808000"&gt;规范格式文档是：&lt;/font&gt;&lt;/p&gt;&lt;table border="0" cellspacing="1" cellpadding="4" width="550" bgcolor="#666666"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="#cccccc"&gt;&lt;p align="center"&gt;&lt;strong&gt;手册页内容 &lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td bgcolor="#cccccc"&gt;&lt;p align="center"&gt;&lt;strong&gt;描 述 &lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;&lt;p&gt;NAME&lt;/p&gt;&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;&lt;p&gt;程序或者命令的名称、手册节号及发布日期 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;&lt;p&gt;SYNOPSIS&lt;/p&gt;&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;&lt;p&gt;怎样调用命令，带有所有选项和参数的完整列表 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;&lt;p&gt;DESCRIPTl0N&lt;/p&gt;&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;&lt;p&gt;命令及其用法的简短小结 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;&lt;p&gt;RETURN VALUES&lt;/p&gt;&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;&lt;p&gt;程序或者库函数返回值，以及产生特定返回值的环境 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;&lt;p&gt;EXIT STATUS&lt;/p&gt;&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;&lt;p&gt;经常用来替代服TURNVALUS&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;&lt;p&gt;OPTIONS&lt;/p&gt;&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;&lt;p&gt;按字母顺序排列的选项和参数清单，如果有的话 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;&lt;p&gt;FILES&lt;/p&gt;&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;&lt;p&gt;命令使用的或者能使用的文件清单 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;&lt;p&gt;USAGE&lt;/p&gt;&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;&lt;p&gt;用程序的语言说明的简明语法，如果有的话 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;&lt;p&gt;ENVIROMENT&lt;/p&gt;&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;&lt;p&gt;命令使用的或者能使用的环境变量清单 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;&lt;p&gt;DIAGNOSTICS&lt;/p&gt;&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;&lt;p&gt;命令产生的错误信息及其解决办法的清单&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;&lt;p&gt;NOTES&lt;/p&gt;&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;&lt;p&gt;不能够归入其他任何一种类别下的所有信息 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;&lt;p&gt;CONFORMING TO&lt;/p&gt;&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;&lt;p&gt;列出程序遵循的任何标难，比如PoSIX或ISO&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;&lt;p&gt;SEE ALSO&lt;/p&gt;&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;&lt;p&gt;和命令有关的交叉索引和信息 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;&lt;p&gt;BUGS&lt;/p&gt;&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;&lt;p&gt;指出己知的bug和错误功能，以及怎样和程序的作者联系修正它们 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#ffffff"&gt;&lt;p&gt;AUTHOR&lt;/p&gt;&lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;&lt;p&gt;命令的作者或者维护者的名字，可能带有电子邮件地址或URL地址&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt; 规范的文档，如果有相关描述，都会包含上面这些节点类型的。我们举例说明下：&lt;/p&gt;[chengmo@centos5 ~]$ gtbl cat.1  | gtbl | groff -Tascii -man      &lt;br/&gt;CAT(1)                           User Commands                          CAT(1)&lt;br/&gt;&lt;br/&gt;NAME&lt;br/&gt;       cat - concatenate files and print on the standard output&lt;br/&gt;&lt;br/&gt;SYNOPSIS&lt;br/&gt;       cat [OPTION] [FILE]...&lt;br/&gt;&lt;br/&gt;DESCRIPTION&lt;br/&gt;       Concatenate FILE(s), or standard input, to standard output.&lt;br/&gt;省略....&lt;br/&gt;&lt;br/&gt;EXAMPLES&lt;br/&gt;       cat f - g&lt;br/&gt;省略....&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;AUTHOR&lt;br/&gt;       Written by Torbjorn Granlund and Richard M. Stallman.&lt;br/&gt;&lt;br/&gt;REPORTING BUGS&lt;br/&gt;       Report bugs to &amp;lt;bug-coreutils@gnu.org&amp;gt;.&lt;br/&gt;&lt;br/&gt;COPYRIGHT&lt;br/&gt;       Copyright (C) 2006 Free Software Foundation, Inc.&lt;br/&gt;省略....&lt;br/&gt;SEE ALSO&lt;br/&gt;       The full documentation for cat is maintained as a Texinfo  manual.   If&lt;br/&gt;省略....&lt;br/&gt;&lt;br/&gt;cat 5.97                          March 2007                            CAT(1)&lt;p&gt;这里自己解压了一个cat.1.gz然后通过自带命令查看文档格式如上图，这些你看到用到好多命令，显示一个文档，在下一节文档查询里面我们会知道原因的。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;这里主要说的是linux文档结构，包括目录，命名，已经文档名称，格式等。这些不是强制的，系统也不好强制检测你自己的文档是否满足。但是，你如果有自己文档想加入系统索引，按照规定去做，才会让以后管理不止混乱了。俗话说：无规律不成方圆。是这个理。呵呵，今天说的比较啰嗦，不知道有没有说清楚，这次说的比较理论的，下一节实际检索文档方面的东西。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chengmo/aggbug/1859837.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chengmo/archive/2010/10/24/1859837.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chengmo/archive/2010/10/23/1858879.html</id><title type="text">linux shell实现随机数多种方法（date,random,uuid)</title><summary type="text">在日常生活中，随机数实际上经常遇到，想丢骰子，抓阄，还有抽签。呵呵，非常简单就可以实现。那么在做程序设计，真的要通过自己程序设计出随机数那还真的不简单了。现在很多都是操作系统内核会提供相应的api，这些原始参数是获取一些计算机运行原始信息，如内存，电压，物理信号等等，它的值在一个时间段可以保证是唯一的了。好了，废话我就不说了。呵呵。 shell脚本程序我们有那些获得随机数方法呢？ 一、通过时间获...</summary><published>2010-10-23T02:15:00Z</published><updated>2010-10-23T02:15:00Z</updated><author><name>程默</name><uri>http://www.cnblogs.com/chengmo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chengmo/archive/2010/10/23/1858879.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chengmo/archive/2010/10/23/1858879.html"/><content type="html">&lt;p&gt;在日常生活中，随机数实际上经常遇到，想丢骰子，抓阄，还有抽签。呵呵，非常简单就可以实现。那么在做程序设计，真的要通过自己程序设计出随机数那还真的不简单了。现在很多都是操作系统内核会提供相应的api，这些原始参数是获取一些计算机运行原始信息，如内存，电压，物理信号等等，它的值在一个时间段可以保证是唯一的了。好了，废话我就不说了。呵呵。 &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp; shell脚本程序我们有那些获得随机数方法呢？&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;一、通过时间获得随机数（date)&lt;/strong&gt;&lt;/p&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;这个也是我们经常用到的，可以说时间是唯一的，也不会重复的，从这个里面获得同一时间的唯一值。适应所有程序里面了。 &lt;/p&gt; &lt;p&gt;&lt;strong&gt;例子：&lt;/strong&gt;&lt;/p&gt;[chengmo@centos5  shell]$ date +%s&lt;br/&gt;1287764773&lt;br/&gt;#获得时间戳，当前到：1970-01-01 00:00:00 相隔的秒数&lt;br/&gt;#如果用它做随机数，相同一秒的数据是一样的。在做循环处理，多线程里面基本不能满足要求了。&lt;br/&gt;&lt;br/&gt;[chengmo@centos5  shell]$ date +%N&lt;br/&gt;738710457&lt;br/&gt;#获得当前时间的纳秒数据，精确到亿分之一秒。&lt;br/&gt;#这个相当精确了，就算在多cpu，大量循环里面，同一秒里面，也很难出现相同结果，不过不同时间里面还会有大量重复碰撞&lt;br/&gt;&lt;br/&gt;[chengmo@centos5  shell]$ date +%s%N&lt;br/&gt;1287764807051101270&lt;br/&gt;#这个可以说比较完美了，加入了时间戳，又加上了纳秒&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;通过上面说明，用它来做随机数的基数了，接下来我们看怎么样获得一段数据内怎么样获得随机数。 &lt;/p&gt;#!/bin/sh&lt;br/&gt;&lt;br/&gt;#写个随机函数，调用方法random min max &lt;br/&gt;#在min 与 max直接获得随机整数&lt;br/&gt;#copyright chengmo QQ:8292669&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;#获得随机数返回值，shell函数里算出随机数后，更新该值&lt;br/&gt;function random()&lt;br/&gt;{&lt;br/&gt;    min=$1;&lt;br/&gt;    max=$2-$1;&lt;br/&gt;    num=$(date +%s+%N);&lt;br/&gt;    ((retnum=num%max+min));&lt;br/&gt;    #进行求余数运算即可&lt;br/&gt;    echo $retnum;&lt;br/&gt;    #这里通过echo 打印出来值，然后获得函数的，stdout就可以获得值&lt;br/&gt;    #还有一种返回，定义全价变量，然后函数改下内容，外面读取&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;#得到1-10的seq数据项&lt;br/&gt;for i in {1..10};&lt;br/&gt;do  &lt;br/&gt;out=$(random 2 10000);&lt;br/&gt;echo $i,"2-10000",$out;&lt;br/&gt;done;&lt;p&gt;&lt;strong&gt;看看运行结果：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;[chengmo@centos5&amp;nbsp; shell]$ sh testrandom.sh&lt;br&gt;1,2-10000,5600&lt;br&gt;2,2-10000,5295&lt;br&gt;3,2-10000,3432&lt;br&gt;4,2-10000,3148&lt;br&gt;5,2-10000,9041&lt;br&gt;6,2-10000,4290&lt;br&gt;7,2-10000,2380&lt;br&gt;8,2-10000,9009&lt;br&gt;9,2-10000,5474&lt;br&gt;10,2-10000,3664 &lt;/p&gt;&lt;p&gt;一个循环里面，得到值各不相同。 &lt;/p&gt;&lt;p&gt;这个是我们常用方法，适应各种语言，是一个通用算法，就算服务器不提供，某时刻相同唯一数据标记，我们也可以通过这种方法，做自己的伪随机数。下面还有更简单方法呢，不要我们自己做了。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;2、通过内部系统变量($RANDOM)&lt;/strong&gt; &lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;其实，linux已经提供有个系统环境变量了，直接就是随机数，哈哈，觉得刚学习方法，是不是白费了！！&lt;/p&gt;[chengmo@centos5  shell]$ echo $RANDOM&lt;br/&gt;10918&lt;br/&gt;[chengmo@centos5  shell]$ echo $RANDOM&lt;br/&gt;10001&lt;br/&gt;&lt;br/&gt;#连续2次访问，结果不一样，这个数据是一个小于或等于5位的整数&lt;p&gt;&lt;span style="font-family: verdana"&gt;可能有疑问了，如果超过5位的随机数怎么得到呢？&lt;/span&gt;&lt;/p&gt;&lt;p&gt;呵呵，加个固定10位整数，然后进行求余，跟例1 一样了。接下来的例子又是我们自立更生做了。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;3、通过系统内部唯一数据生成随机数（/dev/random,urandom)&lt;/strong&gt;&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;我们知道dev目录下面，是linux一些默认设备，它给我们感觉就是放的是键盘，硬盘，光驱等设备的对应文件了。 其实linux有些设备很特殊，有特殊用途。前面我们说到的：/&lt;a href="http://www.cnblogs.com/chengmo/archive/2010/10/22/1858302.html" target="_blank"&gt;dev/[udp|tcp]/host/port&lt;/a&gt;比较特殊吧。呵呵，有扯远了。&lt;/p&gt;&lt;p&gt;/dev/random设备，存储着系统当前运行的环境的实时数据。它可以看作是系统某个时候，唯一值数据，因此可以用作随机数元数据。我们可以通过文件读取方式，读得里面数据。/dev/urandom这个设备数据与random里面一样。只是，它是非阻塞的随机数发生器，读取操作不会产生阻塞。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;实例：&lt;/strong&gt;&lt;/p&gt;[chengmo@centos5  shell]$ head -1 /dev/urandom&lt;br/&gt;ãÅ†ù…•KTþçanVÕã¹Û&amp;amp;¡õ¾“ô2íùU“ žF¦_ ÿ”†mEðûUráÏ=J¯TŸA•ÌAÚRtÓ&lt;br/&gt;&lt;br/&gt;#读一行，怎么是乱码呢？其实它是通过二进制数据保存实时数据的，那么我们怎么样把它变成整型数据呢？&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;[chengmo@centos5 ~/shell]$ head -200 /dev/urandom | cksum&lt;br/&gt;1615228479 50333&lt;br/&gt;#由于urandom的数据是非常多，不能直接通过cat读取，这里取前200行，其实整个数据都是变化的，取多少也一样是唯一的。&lt;br/&gt;#cksum 将读取文件内容，生成唯一的表示整型数据，只有文件内容不变，生成结果就不会变化,与php crc函数&lt;br/&gt;&lt;br/&gt;[chengmo@centos5  shell]$ head -200 /dev/urandom | cksum | cut -f1 -d" "&lt;br/&gt;484750180&lt;br/&gt;#cut 以” “分割，然后得到分割的第一个字段数据&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;得到整型数据，然后，类似一的方法就可以获得到随机数了。 题外话：在程序里面，我们经常md5得到唯一值，然后是字符串的，如果想表示成整型方式，可以通过crc函数.crc是循环冗余校验，相同数据通过运算，都会得到一串整型数据。现在这种验证应用很广。详细要了解，可以参考：&lt;a href="http://zh.wikipedia.org/zh-cn/%E5%BE%AA%E7%8E%AF%E5%86%97%E4%BD%99%E6%A0%A1%E9%AA%8C" target="_blank"&gt;crc&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;下面还有个方法，直接从设备读取生成好的uuid码。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;4、读取linux 的uuid码&lt;/strong&gt;&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;在提到这个之前，有个概念，就是什么是uuid呢？&lt;/p&gt;&lt;p&gt;UUID码全称是&lt;strong&gt;通用唯一识别码&lt;/strong&gt; (Universally Unique Identifier, UUID),它 是一个软件建构的标准，亦为&lt;strong&gt;自由软件基金会&lt;/strong&gt; (Open Software Foundation, OSF) 的组织在&lt;strong&gt;分布式计算环境&lt;/strong&gt; (Distributed Computing Environment, DCE) 领域的一部份。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;UUID 的目的&lt;/strong&gt;，是让分布式系统中的所有元素，都能有唯一的辨识信息，而不需要通过中央控制端来做辨识信息的指定。如此一来，每个人都可以创建不与其它人冲突的 UUID。在这样的情况下，就不需考虑数据库创建时的名称重复问题。它会让网络任何一台计算机所生成的uuid码，都是互联网整个服务器网络中唯一的。它的原信息会加入硬件，时间，机器当前运行信息等等。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;UUID格式是：&lt;/strong&gt;包含32个&lt;a href="http://zh.wikipedia.org/wiki/%E5%8D%81%E5%85%AD%E9%80%B2%E4%BD%8D"&gt;16进位&lt;/a&gt;数字，以“-”连接号分为五段，形式为8-4-4-4-12的32个字符。范例；550e8400-e29b-41d4-a716-446655440000&amp;nbsp; ,所以：UUID理论上的总数为2&lt;sup&gt;16 x 8&lt;/sup&gt;=2&lt;sup&gt;128&lt;/sup&gt;，约等于3.4 x 10&lt;sup&gt;38&lt;/sup&gt;。 也就是说若每奈秒产生1兆个UUID，要花100亿年才会将所有UUID用完。&lt;/p&gt;&lt;p&gt;其实，大家做数据库设计时候，肯定听说过，guid(&lt;b&gt;全局唯一标识符&lt;/b&gt;)码，它其实是与uuid类似，由微软支持。 这里编码，基本有操作系统内核产生。大家记得把，在windows里面，无论数据库，还是其它软件，很容易得到这个uuid编码。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;linux 的uuid码&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;linux的uuid码也是有内核提供的，在/proc/sys/kernel/random/uuid这个文件内。其实，random目录，里面还有很多其它文件，都与生成uuid有关系的。&lt;/p&gt;[chengmo@centos5 ~/shell]$ cat /proc/sys/kernel/random/uuid&lt;br/&gt;dff68213-b700-4947-87b1-d9e640334196&lt;br/&gt;[chengmo@centos5 ~/shell]$ cat /proc/sys/kernel/random/uuid&lt;br/&gt;7b57209a-d285-4fd0-88b4-9d3162d2e1bc&lt;br/&gt;#连续2次读取，得到的uuid是不同的&lt;br/&gt;&lt;br/&gt;[chengmo@centos5 ~/shell]$ cat /proc/sys/kernel/random/uuid| cksum | cut -f1 -d" " &lt;br/&gt;2141807556&lt;br/&gt;#同上方法得到随机整数&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;这是linux下面，几种常见活动随机数整数方法，除了第一个是不同外，其实后3个，产生随机码的伪数据来源，都与/dev/random设备有关系。只是它们各自呈现不同而已。如果你还有更多其它方法，请给我消息，与大家分享了。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chengmo/aggbug/1858879.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chengmo/archive/2010/10/23/1858879.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chengmo/archive/2010/10/22/1858302.html</id><title type="text">linux shell 脚本实现tcp/upd协议通讯（重定向应用）</title><summary type="text">前几天发了重定向以及管道相关使用方法，今天这里发些很有趣的例子。通过重定向实现基于tcp/udp协议的软件通讯。 linux 设备里面有个比较特殊的文件: /dev/[tcp|upd]/host/port 只要读取或者写入这个文件，相当于系统会尝试连接:host 这台机器，对应port端口。如果主机以及端口存在，就建立一个socket 连接。将在，/proc/self/fd目录下面，有对应的文件...</summary><published>2010-10-22T06:18:00Z</published><updated>2010-10-22T06:18:00Z</updated><author><name>程默</name><uri>http://www.cnblogs.com/chengmo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chengmo/archive/2010/10/22/1858302.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chengmo/archive/2010/10/22/1858302.html"/><content type="html">&lt;p&gt;前几天发了重定向以及管道相关使用方法，今天这里发些很有趣的例子。通过重定向实现基于tcp/udp协议的软件通讯。 &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;linux 设备里面有个比较特殊的文件: &lt;/p&gt; &lt;p&gt;/dev/[tcp|upd]/host/port 只要读取或者写入这个文件，相当于系统会尝试连接:host 这台机器，对应port端口。如果主机以及端口存在，就建立一个socket 连接。将在，/proc/self/fd目录下面，有对应的文件出现。 &lt;/p&gt; &lt;p&gt;&lt;strong&gt;一、测试下：/dev/tcp/host/post文件&lt;/strong&gt; &lt;/p&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;[chengmo@centos5  shell]$ cat&amp;lt;/dev/tcp/127.0.0.1/22&lt;br/&gt;SSH-2.0-OpenSSH_5.1&lt;br/&gt;#我的机器shell端口是：22&lt;br/&gt;#实际:/dev/tcp根本没有这个目录，这是属于特殊设备&lt;br/&gt;[chengmo@centos5  shell]$ cat&amp;lt;/dev/tcp/127.0.0.1/223&lt;br/&gt;-bash: connect: 拒绝连接&lt;br/&gt;-bash: /dev/tcp/127.0.0.1/223: 拒绝连接&lt;br/&gt;#223接口不存在,打开失败&lt;br/&gt;&lt;br/&gt;[chengmo@centos5  shell]$ exec 8&amp;lt;&amp;gt;/dev/tcp/127.0.0.1/22&lt;br/&gt;[chengmo@centos5  shell]$ ls -l /proc/self/fd/&lt;br/&gt;总计 0&lt;br/&gt;lrwx------ 1 chengmo chengmo 64 10-21 23:05 0 -&amp;gt; /dev/pts/0&lt;br/&gt;lrwx------ 1 chengmo chengmo 64 10-21 23:05 1 -&amp;gt; /dev/pts/0&lt;br/&gt;lrwx------ 1 chengmo chengmo 64 10-21 23:05 2 -&amp;gt; /dev/pts/0&lt;br/&gt;lr-x------ 1 chengmo chengmo 64 10-21 23:05 3 -&amp;gt; /proc/22185/fd&lt;br/&gt;lrwx------ 1 chengmo chengmo 64 10-21 23:05 8 -&amp;gt; socket:[15067661]&lt;br/&gt;&lt;br/&gt;#文件描述符8，已经打开一个socket通讯通道，这个是一个可以读写socket通道,因为用："&amp;lt;&amp;gt;"打开&lt;br/&gt;[chengmo@centos5  shell]$ exec 8&amp;gt;&amp;amp;-&lt;br/&gt;#关闭通道&lt;br/&gt;[chengmo@centos5  shell]$ ls -l /proc/self/fd/&lt;br/&gt;总计 0&lt;br/&gt;lrwx------ 1 chengmo chengmo 64 10-21 23:08 0 -&amp;gt; /dev/pts/0&lt;br/&gt;lrwx------ 1 chengmo chengmo 64 10-21 23:08 1 -&amp;gt; /dev/pts/0&lt;br/&gt;lrwx------ 1 chengmo chengmo 64 10-21 23:08 2 -&amp;gt; /dev/pts/0&lt;br/&gt;lr-x------ 1 chengmo chengmo 64 10-21 23:08 3 -&amp;gt; /proc/22234/fd&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;从时间服务器读取时间：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;[chengmo@centos5 html]$ cat&amp;lt;/dev/tcp/time-b.nist.gov/13 &lt;p&gt;55491 10-10-22 11:33:49 17 0 0 596.3 UTC(NIST) * &lt;/p&gt;&lt;p&gt;上面这条语句使用重定向输入语句就可以了。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;二、通过重定向读取远程web服务器头信息&lt;/strong&gt; &lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;#!/bin/sh &lt;br/&gt;#testhttphead.sh&lt;br/&gt;#实现通过主机名，端口读取web 服务器header信息&lt;br/&gt;#copyright chengmo,qq:8292669&lt;br/&gt;&lt;br/&gt;if(($#&amp;lt;2));then&lt;br/&gt;    echo "usage:$0 host port";&lt;br/&gt;    exit 1;&lt;br/&gt;fi &lt;br/&gt;#如果参数缺失，退出程序，返回状态1&lt;br/&gt;&lt;br/&gt;exec 6&amp;lt;&amp;gt;/dev/tcp/$1/$2 2&amp;gt;/dev/null;&lt;br/&gt;#打开host的port 可读写的socket连接，与文件描述符6连接&lt;br/&gt;&lt;br/&gt;if(($?!=0));then&lt;br/&gt;    echo "open $1 $2 error!";&lt;br/&gt;    exit 1;&lt;br/&gt;fi &lt;br/&gt;#如果打开失败，$?返回不为0，终止程序&lt;br/&gt;&lt;br/&gt;echo -e "HEAD / HTTP/1.1\n\n\n\n\n"&amp;gt;&amp;amp;6; &lt;br/&gt;#将HEAD 信息，发送给socket连接&lt;br/&gt;&lt;br/&gt;cat&amp;lt;&amp;amp;6; &lt;br/&gt;#从socket读取返回信息，显示为标准输出&lt;br/&gt;&lt;br/&gt;exec 6&amp;lt;&amp;amp;-;&lt;br/&gt;exec 6&amp;gt;&amp;amp;-; &lt;br/&gt;#关闭socket的输入，输出&lt;br/&gt;&lt;br/&gt;exit 0; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;脚本建立后：存为testhttphead.sh&lt;/p&gt;&lt;p&gt;&lt;strong&gt;运行结果：&lt;/strong&gt;&lt;/p&gt;[chengmo@centos5 ~/shell]$ sh testhttphead.sh www.baidu.com 80&lt;br/&gt;HTTP/1.1 200 OK&lt;br/&gt;Date: Thu, 21 Oct 2010 15:17:23 GMT&lt;br/&gt;Server: BWS/1.0&lt;br/&gt;Content-Length: 6218&lt;br/&gt;Content-Type: text/html;charset=gb2312&lt;br/&gt;Cache-Control: private&lt;br/&gt;Expires: Thu, 21 Oct 2010 15:17:23 GMT&lt;br/&gt;Set-Cookie: BAIDUID=1C40B2F8C676180FD887379A6E286DC1:FG=1; expires=Thu, 21-Oct-40 15:17:23 GMT; path=/; domain=.baidu.com&lt;br/&gt;P3P: CP=" OTI DSP COR IVA OUR IND COM "&lt;br/&gt;Connection: Keep-Alive&lt;br/&gt;&lt;br/&gt;[chengmo@centos5 ~/shell]$ sh testhttphead.sh 127.0.0.1 8080&lt;br/&gt;open 127.0.0.1 8080 error!&lt;strong&gt;突然&lt;/strong&gt;&lt;strong&gt;有个奇怪想法：&lt;/strong&gt; &lt;p&gt;我们在windows时代就通过telnet 可以实现tcp/upd协议通讯，那么如果用传统方法怎么实现呢？&lt;/p&gt;[chengmo@centos5 ~/shell]$ echo -e "HEAD / HTTP/1.1\n\n\n\n\n"|telnet www.baidu.com 80 &lt;br/&gt;Trying 220.181.6.175...&lt;br/&gt;Connected to www.baidu.com.&lt;br/&gt;Escape character is '^]'.&lt;br/&gt;Connection closed by foreign host.&lt;br/&gt;&lt;br/&gt;#直接给发送，失败&lt;br/&gt;[chengmo@centos5 ~/shell]$ (telnet www.baidu.com 80)&amp;lt;&amp;lt;EOF&lt;br/&gt;HEAD / HTTP/1.1&lt;br/&gt;&lt;br/&gt; &lt;br/&gt;EOF&lt;br/&gt;Trying 220.181.6.175...&lt;br/&gt;Connected to www.baidu.com.&lt;br/&gt;Escape character is '^]'.&lt;br/&gt;Connection closed by foreign host.&lt;br/&gt;#重定向输入，还是失败？&lt;br/&gt;&lt;p&gt;&lt;strong&gt;找到正确方法：&lt;/strong&gt;&lt;/p&gt;[chengmo@centos5 shell]$ (echo -e "HEAD / HTTP/1.1\n\n\n\n\n";sleep 2)|telnet www.baidu.com 80 &lt;br/&gt;Trying 220.181.6.175...&lt;br/&gt;Connected to www.baidu.com.&lt;br/&gt;Escape character is '^]'.&lt;br/&gt;HTTP/1.1 200 OK&lt;br/&gt;Date: Thu, 21 Oct 2010 15:51:58 GMT&lt;br/&gt;Server: BWS/1.0&lt;br/&gt;Content-Length: 6218&lt;br/&gt;Content-Type: text/html;charset=gb2312&lt;br/&gt;Cache-Control: private&lt;br/&gt;Expires: Thu, 21 Oct 2010 15:51:58 GMT&lt;br/&gt;Set-Cookie: BAIDUID=0B6A01ACECD5353E4247E088A8CB345A:FG=1; expires=Thu, 21-Oct-40 15:51:58 GMT; path=/; domain=.baidu.com&lt;br/&gt;P3P: CP=" OTI DSP COR IVA OUR IND COM "&lt;br/&gt;Connection: Keep-Alive&lt;br/&gt;#成功了！加入sleep 居然可以了，sleep 改成1秒也可以&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;是不是由于sleep后，echo会推出2秒发给通道：telnet呢？推论可以从这2个方面推翻：&lt;/p&gt;&lt;p&gt;一个方面：通过()括的数据是一对命令，会作为一个子命令执行，一起执行完程序结束。每个命令echo语句，就直接发送到屏幕（也就是标准输出），只要有标准输出了，就会通过通道马上传个：telnet ，如果接下来命令还有输出，会注意传给telnet ，直到()内所有命令执行完，与通道连接就断开了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;再一个方面：如果说是起到推迟发送的话，什么时候有数据过来，发给telnet，什么时候telnet命令启动。跟你推迟一点还是早一点发送过来。没有关系。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这种类型命令，看出sleep，其实就是保持通道跟telnet 连接2秒钟。 通道连接着了，telnet终端输入也还在，因此可以保持从baidu服务器获得数据。&lt;/p&gt;&lt;p&gt;所以,延迟多久，还是跟服务器处理速度有关系。 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff"&gt;如果通过echo 向telnet发送数据，保持通道联通，使用sleep是个很好方法。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;通过重定向给telnet输入参数这种方法，我还想不到怎么样实现延迟输入。有知道朋友，可以指点指点.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;区别：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;telnet与echo 实现 http访问，与通过打开读写socket是不一样的，打开socket通道，是可以进行交换处理的。传入命令，活动结果，再传入命令，再获得结果。telnet通过echo 就不能这样处理了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;三、通过shell脚本重定向实现监控memcache状态&lt;/strong&gt;&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;strong&gt;实例：&lt;/strong&gt;&lt;/p&gt;#!/bin/sh&lt;br/&gt;&lt;br/&gt;#通过传入ip 以及端口，发送指令获得返回数据&lt;br/&gt;#copyright chengmo qq:8292669&lt;br/&gt;&lt;br/&gt;#函数往往放到最上面&lt;br/&gt;function sendmsg()&lt;br/&gt;{&lt;br/&gt;    msg=$1;&lt;br/&gt;    echo  "$1"&amp;gt;&amp;amp;8;&lt;br/&gt;    getout;&lt;br/&gt;}&lt;br/&gt;#向socket通道发送指令，并且调用获得返回参数&lt;br/&gt;&lt;br/&gt;function getout()&lt;br/&gt;{   &lt;br/&gt;#read 命令 -u 从打开文件描述符 8 读取数据，-d读取数据忽略掉:\r换行符 &lt;br/&gt;    while read -u 8 -d $'\r' name; &lt;br/&gt;    do  &lt;br/&gt;        if [ "${name}" == "END"  -o "${name}" == "ERROR" ];then&lt;br/&gt;            break;&lt;br/&gt;        fi;&lt;br/&gt;        echo $name;&lt;br/&gt;    done&lt;br/&gt;}&lt;br/&gt;#由于：memcached每次通讯完毕，会返回：END或者ERROR(出错），通过判断是否是"END"觉得读取是不是结束，否则循环不会停止&lt;br/&gt;&lt;br/&gt;if [ $# -lt 2 ];then&lt;br/&gt;echo "usage:$0 host port [command]";&lt;br/&gt;exit 1;&lt;br/&gt;fi;&lt;br/&gt;&lt;br/&gt;[[ $# -gt 2 ]]&amp;amp;&amp;amp;command=$3;&lt;br/&gt;&lt;br/&gt;#设置默认值 如果command为定义则为：stats&lt;br/&gt;command="${command=stats}";&lt;br/&gt;host="$1";&lt;br/&gt;port="$2";&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;exec 8&amp;lt;&amp;gt;/dev/tcp/${host}/${port};&lt;br/&gt;#打开通向通道是8&lt;br/&gt;&lt;br/&gt;if [ "$?" != "0" ];then&lt;br/&gt;echo "open $host  $port fail!";&lt;br/&gt;exit 1;&lt;br/&gt;fi &lt;br/&gt;&lt;br/&gt;sendmsg "$command";&lt;br/&gt;#发送指定命令&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;sendmsg "quit";&lt;br/&gt;#发送退出通向命令&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;exec 8&amp;lt;&amp;amp;-;&lt;br/&gt;exec 8&amp;gt;&amp;amp;-;&lt;br/&gt;#关闭socket通道&lt;br/&gt;&lt;br/&gt;exit 0;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这是通过重定向，实现socket通讯中，发送然后获取返回的例子。其实，上面代码看似一次只能发送一段。时间上。我们可以反复调用：sendmsg ，捕捉输出数据。实现连续的，读与写操作。&lt;/p&gt;&lt;p&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;其实通过：telnet也可以实现的。&lt;/p&gt;&lt;p&gt;[chengmo@centos5 shell]$ (echo "stats";sleep 2)|telnet 127.0.0.1 11211&lt;/p&gt;&lt;p&gt;通过nc命令实现：&lt;/p&gt;&lt;p&gt;[chengmo@centos5 shell]$ (echo "stats")|nc 127.0.0.1 11211&lt;/p&gt;&lt;p&gt;不需要加延迟，直接打开通道&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;第二个程序里面，看到shell完全可以处理交互设计了。如果按照这样，登陆ftp,pop3,stmp都可以类似实现。这些，我们通过shell socket类似程序实现，应该不困难，只是捕捉如发送解析的问题了。 &lt;/p&gt;&lt;img src="http://www.cnblogs.com/chengmo/aggbug/1858302.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chengmo/archive/2010/10/22/1858302.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
