网站开发日志

2008年11月6日星期四

分享家:Addthis中国

Smarty显示页面出现乱码的探究

公司的网站使用Smarty,Smarty是一种功能强大的模板引擎(Template Engine)。使用Smarty可以让HTML代码从PHP代分离出来,这样我们就用不着在PHP代码中加入无数的echo "<html>";,只要用$smarty->display('html.tpl');就可以把相关的HTML代码显示在浏览器上,这会让PHP代码简洁而便于阅读。

HTML的编码方式通常可以在HTML模板里定义的,比如说,在html.tpl里我们定义了:

<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

该模板就会用“iso-8859-1”的编码方式来显示代码。但是当要显示的模板是一个弹出层(通常这个弹出层只包含部分的HTML代码,然后显示在当前页面上)。例如:

<div id="add_overlay" style="border-color: rgb(58, 137, 201);">
  <div style="padding: 10px 5px 5px; width: 250px;">
    <div style="text-align: center; width: 250px; float: left;">
      <div style="font-size: 16px; margin-bottom: 5px;">
        {$cart.items[0].title}has been added into your cart!
      </div>
      <a href="/cart">
        <img src="/images/checkout.gif" alt="checkout" width="68" height="25">
      </a>
      <a href="Javascript:history.go(0)">
        <img src="/images/continue.gif" alt="continue" width="123" height="25">
      </a>
    </div>
  </div>
</div>

这时Smarty会用UTF-8来显示这个HTML层(layer)。问题是数据库里用的iso-88590-1为编码方式,如果用UTF-8来显示就会造成有些字符出现乱码,像注册商标"®"。我开始以为只要给弹出层加上header来定义正确的编码就可以了,其实不然,Smarty仍旧用UTF-8来显示。最终的解决办法是,在调用Smarty的display函数前,加入PHP的header函数来定义编码,如下:

if (isset($_GET['popin'])){
   header('Content-Type:text/html;charset=iso-8859-1');
   $smarty->display('cart/popin.tpl');
}

标签: ,

相关文章:

0 条评论:

发表评论

指向此帖子的链接: