网站开发日志

2008年11月13日星期四

分享家:Addthis中国

UTF8字符串转换拼音

Blogger的传统模板不支持边侧栏的日志分类功能,这两天我忙着写代码来实现这个一功能。目前你已经可以看到用美味书签(delicious.com)制作的“标签云”(注:有国内的朋友反映,美味书签打开的速度很慢,估计是国内对delicious.com的过滤造成的)。其他日志分类功能也快要开发完成了,我采用的方法是在Linux操作系统上用PHP产生HTML代码然后上传到服务器,这样就免除在国内用户访问滞后的问题。估计明天可以把这个功能加上,到时再做详细介绍。这个帖子主要将介绍我在开发中碰到的编码问题:因为我的日志分类标签有用中文命名的,例如“浏览器”。如果我把“浏览器”标签的帖子放在一起,命名为“浏览器.html”,然后在链接里用“/blog/category/浏览器.html”,应该也是可以的。但是如果文件用中文命名,要想把文件从Linux系统里用WinSCP下载到本地是行不通的,原因是WinSCP不支持中文文件名。我没有花太多时间去研究是否可以更改WinSCP的编码设置来修正这个问题;而且我本来就不爱用中文来命名html文件,总觉得把中文放在地址栏有点怪怪的,所以我就想用别的方法来解决这个问题。

开始想到的是用urlencode函数,例如:

$string = urlencode("浏览器");
//编码后 $string = "%e6%b5%8f%e8%a7%88%e5%99%a8"

可是这个方法行不通,虽然url编码后链接是不含中文的,但是当你点击它后,它又会被转回中文,因为文件名也已经使用了url编码,所以这时它已经找不到以中文命名的文件了。

后来想到用拼音来代替中文字符,上网Google了下,找到了一些中文字符转换拼音的PHP库,但大多数是支持GB转拼音。因为我的系统用的是UTF-8,所以需要先把字符的编码转换一下:

$string="博客"
return iconv('UTF-8', 'GB2312', $string); //得到GB2312编码

此外,我的确还找到一个支持UTF8转换拼音的PHP代码。使用方法很简单,先点击这里下载py.php(注:不知道原作者是谁,如果谁知道请来信告知,我会把出处补上。)然后调用文件里的Pinyin函数即可。值得注意的是,它不支持大写的英文字母,比如字符串含有大写英文字母,转换后大写英文字母会丢失。因此在转换之前,要先把字符串小写化。具体调用代码如下:

<?php   
  require('py.php');
  $newtag = Pinyin(strtolower($tag),1);
/*注意:
1.$tag可以是中文,也可以是英文,但是因为字母必须小写,所以用到strtolower函数
2.因为我的系统用的是UTF-8编码,所以调用Pinyin函数的是,加入了'1'为第二个参数;如果你的
系统是GB编码的,调用的时候,则不需要这个参数。*/
?>     

更新(2/23/09): 谢谢匿名网友的提示, 在py.php里,把下面这行改下,就支持大写字母了。

return preg_replace("/[^a-z0-9]*/", '', $_Res);
//这里$_Res是转换好的字符串,使用preg_replace,把不是a-z以及不是数字的字符过滤,
//这么一来把那些大写字母也过滤了。因此把替换正则表达式如下更改一下就可以保留大写字母了。
return preg_replace("/[^a-zA-Z0-9]*/", '', $_Res);
正则是我的强项:-)按道理不应该不知道的,哈哈,没有认真读代码 :-(

标签:

相关文章:

2 条评论:

发表评论

指向此帖子的链接: