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 条评论:
发表评论
指向此帖子的链接: