<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[沧海一粟]]></title> 
<link>http://www.dzhope.com/index.php</link> 
<description><![CDATA[Web系统架构与服务器运维,php开发]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[沧海一粟]]></copyright>
<item>
<link>http://www.dzhope.com/post/487/</link>
<title><![CDATA[php采用UTF-8编码时候中文拼音排序]]></title> 
<author>jed &lt;jed521@163.com&gt;</author>
<category><![CDATA[代码编程]]></category>
<pubDate>Fri, 21 Nov 2008 06:01:11 +0000</pubDate> 
<guid>http://www.dzhope.com/post/487/</guid> 
<description>
<![CDATA[ 
	 因为我的记忆力严重不足，所以这几天写了一个UTF-8的备忘录，结果发现在UTF-8的编码下，mysql不能正确地排序，于是换到php里面用sort，继续失败……汗死……后来一想，可能是因为UTF-8的编码不是按照拼音来编码的，所以才会导致这个原因，另外貌似GBK的字库也不是完全按拼音排序的，"窦"字在GBK里面存在，但是却排在最后面，为了避免错乱，故在排序时把"窦"替换成同音字"豆"，即可，于是写了这个排序函数……哎，弄了我一个晚上，结果就8行代码……无语了……<br/><br/>PHP代码<br/><div class="code"><br/>function name_cmp($a, $b) &#123;&nbsp;&nbsp;&nbsp;&nbsp;<br/> $a = str_replace(&#039;窦&#039;, &#039;豆&#039;, $a);&nbsp;&nbsp;&nbsp;&nbsp;<br/> $b = str_replace(&#039;窦&#039;, &#039;豆&#039;, $b);&nbsp;&nbsp;&nbsp;&nbsp;<br/> $a = iconv(&#039;UTF-8&#039;, &#039;GBK&#039;, $a);&nbsp;&nbsp;&nbsp;&nbsp;<br/> $b = iconv(&#039;UTF-8&#039;, &#039;GBK&#039;, $b);&nbsp;&nbsp;&nbsp;&nbsp;<br/> $a = ereg_replace(&#039;^(a&#124;an&#124;the) &#039;, &#039;&#039;, strtolower($a));&nbsp;&nbsp;&nbsp;&nbsp;<br/> $b = ereg_replace(&#039;^(a&#124;an&#124;the) &#039;, &#039;&#039;, strtolower($b));&nbsp;&nbsp;&nbsp;&nbsp;<br/> return strcasecmp($a, $b);&nbsp;&nbsp;&nbsp;&nbsp;<br/>&#125;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp; <br/>usort($array, &#039;name_cmp&#039;);&nbsp;&nbsp;&nbsp;&nbsp;<br/></div><br/>关于网上的mysql按拼音查询的两种说法: <br/>1. 用ORDER BY BINARY(字段) ASC的方式查询数据库<br/>&nbsp;&nbsp;&nbsp;&nbsp;实际上在纯UTF-8的环境下是实现不了了，只有用UTF-8的编码去保存GBK的字符之后才能这样使用，而且不能忘记替换像"窦"这种特殊的字哦……<br/><br/>2. 在数据库中新建一个字段，保存汉字拼音，再利用该字段查询<br/>&nbsp;&nbsp;&nbsp;&nbsp;这个方法在数据库里面看起来比较直观，不过同样需要把汉字转换成拼音，直接获得拼音的首字母还是不够的.......<br/>&nbsp;&nbsp;&nbsp;&nbsp;在网上找了份代码，运行的还不错，不过需要下载一个字库文件:<br/>&nbsp;&nbsp; <br/><br/>RAR压缩包：<br/>下载该附件：<a href="http://www.bigasp.com.cn/Uploads/Files/Code/gbk" target="_blank">http://www.bigasp.com.cn/Uploads/Files/Code/gbk</a>拼音字库.rar<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;预览地址:<a href="http://www.bigasp.com.cn/extra/gbk2py" target="_blank">http://www.bigasp.com.cn/extra/gbk2py</a><br/>&nbsp;&nbsp;&nbsp;&nbsp;代码如下: <br/><br/>PHP代码<br/><div class="code"><br/>class my_Getpy &#123;&nbsp;&nbsp;&nbsp;&nbsp;<br/> var $_dat = &#039;py.dat&#039;;&nbsp;&nbsp;&nbsp;&nbsp;<br/> var $_fd&nbsp;&nbsp;= false;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp; <br/> function my_Getpy($pdat = &#039;&#039;) &#123;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;if (&#039;&#039; != $pdat)&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;$this-&gt;_dat = $pdat;&nbsp;&nbsp;&nbsp;&nbsp;<br/> &#125;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp; <br/> function load($pdat = &#039;&#039;) &#123;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;if (&#039;&#039; == $pdat)&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;$pdat = $this-&gt;_dat;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;$this-&gt;unload();&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;$this-&gt;_fd = @fopen($pdat, &#039;rb&#039;);&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;if (!$this-&gt;_fd) &#123;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp; trigger_error(&quot;unable to load PinYin data file `$pdat`&quot;, E_USER_WARNING);&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp; return false;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&#125;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;return true;&nbsp;&nbsp;&nbsp;&nbsp;<br/> &#125;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp; <br/> function unload() &#123;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;if ($this-&gt;_fd) &#123;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp; @fclose($this-&gt;_fd);&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp; $this-&gt;_fd = false;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&#125;&nbsp;&nbsp;&nbsp;&nbsp;<br/> &#125;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp; <br/> function get($zh) &#123;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;if (strlen($zh) != 2) &#123;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp; trigger_error(&quot;`$zh` is not a valid GBK hanzi&quot;, E_USER_WARNING);&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp; return false;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&#125;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;if (!$this-&gt;_fd &amp;&amp; !$this-&gt;load()) return false;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;$high = ord($zh&#91;0&#93;) - 0x81;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;$low&nbsp;&nbsp;= ord($zh&#91;1&#93;) - 0x40;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;// 计算偏移位置&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;$nz = ($ord0 - 0x81);&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;$off = ($high&lt;&lt;8) + $low - ($high * 0x40);&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;// 判断 off 值&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;if ($off &lt; 0) &#123;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp; trigger_error(&quot;`$zh` is not a valid GBK hanzi-2&quot;, E_USER_WARNING);&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp; return false;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&#125;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;fseek($this-&gt;_fd, $off * 8, SEEK_SET);&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;$ret = fread($this-&gt;_fd, 8);&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;$ret = unpack(&#039;a8py&#039;, $ret);&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;return $ret&#91;&#039;py&#039;&#93;;&nbsp;&nbsp;&nbsp;&nbsp;<br/> &#125;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp; <br/> function _my_Getpy() &#123;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;$this-&gt;_unload();&nbsp;&nbsp;&nbsp;&nbsp;<br/> &#125;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&#125; <br/>// demo 测试例子&nbsp;&nbsp; <br/>?&gt;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp; <br/>&lt;title&gt;GBK码汉字转拼音&lt;/title&gt;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&lt;h1&gt;GBK码汉字转拼音&lt;/h1&gt;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp; <br/>&lt;form method=get&gt;&nbsp;&nbsp;&nbsp;&nbsp;<br/>输入汉字试试：&lt;input type=&quot;text&quot; size=&quot;16&quot; name=&quot;zh&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&lt;input type=&quot;submit&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&lt;/form&gt;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp; <br/>&lt;?php&nbsp;&nbsp;&nbsp;&nbsp;<br/>if ($str = $_GET&#91;&#039;zh&#039;&#93;) &#123;&nbsp;&nbsp;&nbsp;&nbsp;<br/> $py = new my_Getpy;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/> $len = strlen($str);&nbsp;&nbsp;&nbsp;&nbsp;<br/> $ret = &#039;&#039;;&nbsp;&nbsp;&nbsp;&nbsp;<br/> for ($i = 0; $i &lt; $len; $i++) &#123;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;if (ord($str&#91;$i&#93;) &gt; 0x80) &#123;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp; $xx = $py-&gt;get(substr($str, $i, 2));&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp; $ret .= ($xx ?&nbsp;&nbsp;$xx . &#039; &#039; : substr($str, $i, 2));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp; $i++;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&#125; else &#123;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp; $ret .= $str&#91;$i&#93;;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&#125;&nbsp;&nbsp;&nbsp;&nbsp;<br/> &#125;&nbsp;&nbsp;&nbsp;&nbsp;<br/> $py-&gt;unload();&nbsp;&nbsp;&nbsp;&nbsp;<br/> echo &quot;字串 `&lt;font color=red&gt;&#123;$str&#125;&lt;/font&gt;` 的拼音是: &lt;font color=red&gt;&#123;$ret&#125;&lt;/font&gt;&#92;n&quot;;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&#125;&nbsp;&nbsp;&nbsp;&nbsp;<br/>?&gt;&nbsp;&nbsp;&nbsp;&nbsp; <br/></div><br/>Tags - <a href="http://www.dzhope.com/tags/utf-8/" rel="tag">utf-8</a> , <a href="http://www.dzhope.com/tags/%25E6%258E%2592%25E5%25BA%258F/" rel="tag">排序</a>
]]>
</description>
</item><item>
<link>http://www.dzhope.com/post/487/#blogcomment9158</link>
<title><![CDATA[[评论] php采用UTF-8编码时候中文拼音排序]]></title> 
<author>xia &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Fri, 05 Dec 2008 09:39:21 +0000</pubDate> 
<guid>http://www.dzhope.com/post/487/#blogcomment9158</guid> 
<description>
<![CDATA[ 
	大牛啊，今天找了一天，试了你的方法很有效果。但是不知道$a = ereg_replace(&#039;^(a&#124;an&#124;the) &#039;, &#039;&#039;, strtolower($a));&nbsp;&nbsp;&nbsp;&nbsp;$b = ereg_replace(&#039;^(a&#124;an&#124;the) &#039;, &#039;&#039;, strtolower($b)); 这两句何解，为什么要正则替换掉&quot;a&#124;an&#124;the&quot;
]]>
</description>
</item>
</channel>
</rss>