彻底解决wordpress中文截断产生乱码的方法

wordpress的海量模板是它的亮点之一,国内众多高手设计的模板已经非常漂亮。可是残酷的现实是大部分的模板都还是出于老外之手,老外在做模板的时候一般只会考虑到显示正常即可,而我们如果用中文来写博客毕竟和英文环境有所差别,这样可能会出现很多的问题,比如字体大小,乱码,这些都要手动调整。

话说调整CSS很多人都已经是轻车熟路了,本文不讨论。
不过可能大家会遇到类似下图的现象:

产生乱码的原因

这种乱码现象一般是出现在正文截断的时候,因为Wordpress模板的字符集是UTF-8,它对于英文来说是一个字母一个字节(8位)来编码,而中文却是一个汉字三个字节(24位)来编码。所以截断的函数只会判断在多少字节的地方去截,如果到了那个地方一个汉字只显示了三分之一或者三分之二的时候,那个汉字就不能完整显示,而函数又不能很智能的多截一个字节或者少截一个,怎么办?于是就产生了乱码。这个问题相信在很多有类似功能的国外模板上都会出现,这不是数据库的错,也不是字符集的问题,只是因为制作者在编写模板的时候并没有考虑到中文字符可能产生的问题。

所以,我们要替换截断的函数。简单来说,两步就可以搞定。

第一步

将以下两个函数写进主题所附带的functions.php文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
function Limit_Char($max_char = 200, $more_text = '...', $more_link_text = '', $limit_type = 'content') {
    if ($limit_type == 'title') { $limiter = get_the_title(); }
    else { $limiter = get_the_content(); }
    $limiter = apply_filters('the_content', $limiter);
    $limiter = strip_tags(str_replace(']]>', ']]>', $limiter));
     if (strlen($limiter) > $max_char) {
        $limiter = substr($limiter, 0, $max_char+1);
        $limiter = utf8_conver($limiter);
        echo $limiter;
        echo $more_text;
        if ($more_link_text != '') {
            echo ' <a href="';
            echo the_permalink();
            echo '">'.$more_link_text.'</a>';
        }
    } else {
        echo $limiter;
    }
}
 
function utf8_conver($str) {
        $len = strlen($str);
        for ($i=strlen($str)-1; $i>=0; $i-=1){
                $hex .= ' '.ord($str[$i]);
                $ch = ord($str[$i]);
        if (($ch & 128)==0) return(substr($str,0,$i));
                if (($ch & 192)==192) return(substr($str,0,$i));
        }
        return($str.$hex);
}

第二步

把模板文件中比如index.php中将截断函数替换成新的。

1
2
<?php Limit_Char(200); ?>
<!-- 200是你需要截断多少字节的长度,根据实际情况修改。-->

修改完成,大功告成啦。理论上用这个办法,只要是截断的问题都可以得到解决。
BTW:本人菜鸟一只。高手轻点拍砖。

Tags: , ,

评论(11)

  1. OurDearAmy CHINA Mozilla Firefox Windows 2010/04/08 at 11:46 下午 #

    忽然发现您竟然加了我链接
    我给您加的链接不知道怎么修饰您好,只好写了@电商电商,哈哈
    当然批注是把您关注的东西全部写上了

  2. OurDearAmy CHINA Mozilla Firefox Windows 2010/04/08 at 11:47 下午 #

    哇,您竟然不审核评论

    • Jackly CHINA Google Chrome Windows 2010/04/09 at 10:24 上午 #

      哈哈。审核那事儿是天朝在行的,咱才不玩呢。

  3. shun CHINA Google Chrome Windows 2010/04/15 at 9:41 下午 #

    你好,我正好在WORDPRESS截断上遇到了乱码问题。。但是这篇文章我看了很久有些地方不是很懂 。可以帮下忙吗?谢谢。我的QQ是247529546.。如果可以的话请帮我下。。感激不尽~

  4. cnscorpio CHINA Mozilla Firefox Windows 2010/05/09 at 10:54 下午 #

    有段时间没更新了。

  5. 智慧帆 CHINA Internet Explorer 2010/06/02 at 12:09 下午 #

    许久没有来逛了!!

  6. 远走高飞 CHINA Mozilla Firefox Windows 2010/06/08 at 7:35 下午 #

    学习了。。

  7. ikeeptrying AUSTRALIA Google Chrome Windows 2010/06/08 at 8:20 下午 #

    嘿嘿
    我的不是wp的~

  8. 绵阳浮生 CHINA Internet Explorer Windows 2010/08/01 at 10:18 上午 #

    换个链接嘛!哥们!

  9. yellow CHINA Internet Explorer Windows 2010/08/05 at 4:32 下午 #

    文章不错,我以前整JOOMLA的时候也弄过中文截断的问题。
    回复下面这一堆代码。。。。。

Trackbacks/Pingbacks

  1. 新主题呼之欲出(3) | 阿邙’S Blog WordPress - 2010/06/06

    [...] 首页关于归档Wp相关左右间给我捎信干掉侧边栏首页>WordPress>∷新主题呼之欲出(3)∷ 看了万戈兄的文章摘要免插件输出总结:《Wordpress 中 N合一的日志摘要方法》,决定自己也折腾一把,去掉实现此功能的插件.结果发现我的主机貌似对mb_strimwidth函数的支持性比较差劲,虽然我也是php5,但输出的摘要末尾一个字符偶尔会是乱码.这样很不爽.的确很不爽.于是到处查找,综合了一个方法,是使不支持此函数的童鞋也能完美输出无乱码的摘要了.首先在主题function.php文件<?php  代码   ?>中,定义两个新的函数.代码如下: <pre>function Limit_Char($max_char = 200, $more_text = '…', $more_link_text = '', $limit_type = 'content') { if ($limit_type == 'title') { $limiter = get_the_title(); } else { $limiter = get_the_content(); } $limiter = apply_filters('the_content', $limiter); $limiter = strip_tags(str_replace(']]>', ']]>', $limiter)); if (strlen($limiter) > $max_char) { $limiter = substr($limiter, 0, $max_char+1); $limiter = utf8_conver($limiter); echo $limiter; echo $more_text; if ($more_link_text != '') { echo ' <a href="'; echo the_permalink(); echo '">'.$more_link_text.'</a>'; } } else { echo $limiter; } } function utf8_conver($str) { $len = strlen($str); for ($i=strlen($str)-1; $i>=0; $i-=1){ $hex .= ' '.ord($str[$i]); $ch = ord($str[$i]); if (($ch & 128)==0) return(substr($str,0,$i)); if (($ch & 192)==192) return(substr($str,0,$i)); } return($str.$hex); }上面代码能够实现utf-8格式的中文无乱码输出摘要,并且如果使用了more标签,那么会自动输出more标签前的为摘要.函数定义完毕,那么我们如果想要在哪里显示摘要内容,就插入代码如下:<?php Limit_Char(200); ?> <!– 200是你需要截断多少字节的长度,根据实际情况修改。–>Ps:以上方法来源于Jackly:彻底解决wordpress中文截断产生乱码的方法这样还不够完美,如果你自定义了摘要,用此代码不会输出自定义摘要内容.我参考万戈童鞋的方法,修改在显示摘要位置需要的代码如下:<div> <?php $myExcerpt = $post->post_excerpt; //如果自定义摘要内容为空 if ( empty ( $myExcerpt ) ) { echo Limit_Char(500);} //输出我们定义的函数产生的摘要 else { //自定义摘要不为空则摘出自定义摘要末尾显示….. echo $myExcerpt."……"; } ?> </div>当然了,前提是要在function.php中定义我们刚才讲的那两个新函数.由此一来,当你在文章中使用了more标签,那么程序就会将文章摘要输出为more标签前的文字;当你在发布文章时自定义了摘要内容,那么程序就会将文章摘要输出为自定义文章摘要;当你上面两种都没做的时候,程序就会将文章摘要输出为我们定义的函数所控制的500字摘要.这个也是真对我的新主题应用的一个方法.新主题已经有了雏形了,但还不是很完善,先放个预览出来:google_ad_client = "pub-8840778242744981"; /* 468×15, 创建于 10-6-1 */ google_ad_slot = "2698087236"; google_ad_width = 568; google_ad_height = 15; 相关标签: more标签,WordPress,截断,摘要,自定义 |»本博客所有文章欢迎转载,请遵循 !,|»转载请注明来源:阿邙’S Blog »新主题呼之欲出(3)|»本文链接地址:http://amangs.com/wordpress/my-news-theme-coming-soon-3.html|»本文短网址:,你可以将本文地址转发至微博。 这篇文章发表 于 2010年06月06日,星期天 0人浏览, 21:37 文章分类为WordPress. 你可以通过 RSS 2.0订阅. 也可以 发表评论, 或者进行trackback. 上一篇: 乐铺送大礼,博主撰文喜 相关日志 随机文章 热门文章 520-521.将GIF动画导入Photoshop CS3 [以及CS4]CommentLuv:显示回复者最新日志的链接七月《记念刘和珍君》暖用CSS实现文字自动截断孙燕姿《逆光》在线抢听腾讯微博邀请码激情发放! (67)我的Wordpress,这些一个都不能少(一) (60)「暖暖为你」Doulex鼠标灯,温馨暖人间! (46)我的Wordpress,这些一个都不能少(二) (44)咱也搬家到衡天小张啦~ (39)搬家至vpsyou! (39)Hit FM杰伦新歌《超人不会飞》全球首播 (37)也谈修改.htaccess文件进行301重定向. (33)留下评论 点击这里取消回复称呼 (*)Mail (*,不会被公开)站点地址/**/ <<勾选这里推荐你的最新日志!最新评论近期热评随机文章Ray Chow:这一页严重错位?Ray Chow:插件很不错很实用diyidu:哇噻,这个还有啊!万戈:牛人啊,自己做插件,厉害厉害,佩服佩服joyla:在我眼里,这篇文章已经是家喻户晓了一样!JasonChao:嘿嘿,我也收到了iamlukas:再买就打算买苹果的 …ikeeptrying:这个看过了~没什么说法~闲云野鹤:对于我来说有点贵,玩不起啊! :arro…朵未: 这么贵的本本是该调侃…腾讯微博邀请码激情发放! (67)我的Wordpress,这些一个都不能少(一) (60)「暖暖为你」Doulex鼠标灯,温馨暖人间! (46)我的Wordpress,这些一个都不能少(二) (44)咱也搬家到衡天小张啦~ (39)搬家至vpsyou! (39)Hit FM杰伦新歌《超人不会飞》全球首播 (37)也谈修改.htaccess文件进行301重定向. (33)wp_list_comments结构分析 (23)关于现在的生活 (23)2009-11-23 结090427谢。咱也搬家到衡天小张啦~通过Api调用腾讯微博到任何位置.妈妈生日快乐!09-06-23份WP不同页面不同侧边栏神奇的钢琴嘲哳榜单推荐点击评论加入榜单唠叨几句流量超啦 准备跑路中..&nbsp唠叨于4小时前&nbsp回复累了 休息两天再折腾..&nbsp唠叨于17小时前&nbsp回复文章分类今日事 (165)WordPress (17)Code (6)术业攻 (5)他山石 (41)乱七杂八 (7)知识库 (8)眼耳口 (22)最新文章新主题呼之欲出(3) 乐铺送大礼,博主撰文喜 插件发布 Wp Plugin:MO Widgets 灵动边栏 通过Api调用腾讯微博到任何位置. 新主题呼之欲出(2) 新主题呼之欲出(1) Wordpress免插件实现五类文章输出 ThinkPad引发的血案 「暖暖为你」Doulex鼠标灯,温馨暖人间! vps更换php环境小计. 左邻右里够酷℃羽毛の家互联风尚创意星空老七博客可可美食闲云野鹤老孙博客链链更健康soluo博客歪歪八卦网友链联盟中国红酒网中国博客联盟 © 2006-2012 | 阿邙’S BlogBm|站点地图 var _bdhmProtocol = (("https:" == document.location.protocol) ? " https://&quot; : " http://"); document.write(unescape("%3Cscript src='" + _bdhmProtocol + "hm.baidu.com/h.js%3Fe101a1b399fbb159515843183b59037a' type='text/javascript'%3E%3C/script%3E")); (function(){ var corecss = document.createElement('link'); var themecss = document.createElement('link'); var corecssurl = "http://amangs.com/wp-content/plugins/syntaxhighlighter/syntaxhighlighter/styles/shCore.css?ver=2.1.364b"; if ( corecss.setAttribute ) { corecss.setAttribute( "rel", "stylesheet" ); corecss.setAttribute( "type", "text/css" ); corecss.setAttribute( "href", corecssurl ); } else { corecss.rel = "stylesheet"; corecss.href = corecssurl; } document.getElementsByTagName("head")[0].appendChild(corecss); var themecssurl = "http://amangs.com/wp-content/plugins/syntaxhighlighter/syntaxhighlighter/styles/shThemeRDark.css?ver=2.1.364b"; if ( themecss.setAttribute ) { themecss.setAttribute( "rel", "stylesheet" ); themecss.setAttribute( "type", "text/css" ); themecss.setAttribute( "href", themecssurl ); } else { themecss.rel = "stylesheet"; themecss.href = themecssurl; } document.getElementsByTagName("head")[0].appendChild(themecss); })(); SyntaxHighlighter.config.clipboardSwf = 'http://amangs.com/wp-content/plugins/syntaxhighlighter/syntaxhighlighter/scripts/clipboard.swf'; SyntaxHighlighter.config.strings.expandSource = 'show source'; SyntaxHighlighter.config.strings.viewSource = '查看源代码'; SyntaxHighlighter.config.strings.copyToClipboard = '复制到剪贴板'; SyntaxHighlighter.config.strings.copyToClipboardConfirmation = '代码现在在你的剪贴板'; SyntaxHighlighter.config.strings.print = '打印'; SyntaxHighlighter.config.strings.help = '帮助'; SyntaxHighlighter.config.strings.alert = 'SyntaxHighlighternn'; SyntaxHighlighter.config.strings.noBrush = '无法找到Brush:'; SyntaxHighlighter.config.strings.brushNotHtmlScript = 'Brush不能设置 html-script选项'; SyntaxHighlighter.defaults['auto-links'] = false; SyntaxHighlighter.defaults['gutter'] = false; SyntaxHighlighter.defaults['smart-tabs'] = false; SyntaxHighlighter.all();$(document).ready(function(){ DD_roundies.addRule('#sidebar-tab,.post, .sticky, .curved, .widget,.navigation,.submit', 12, true); DD_roundies.addRule('.downright', '0 0 0 6px', true); DD_roundies.addRule('.avli,.avatars,.postfeet,ol.commentlist li', '10px 30px 10px 6px', true); DD_roundies.addRule('.ta-pageimg-left a img,ol.commentlist li div.reply', 8, true); DD_roundies.addRule('#comment', '15px 15px 50px 10px', true); }) [...]

说两句吧!