查看所有包含 PHP 标签的文章
八月
7

PHPMailer类发送中文邮件兼谈解决XOOPS中文发送邮件乱码

Author Dominic    Category PHP, XOOPS     Tags ,

.org.cn论坛上又有人问发送中文邮件乱码的问题。domecc给出了一个临时办法,还提供一个网址http://www.thedevlog.com/dev/log-29.html来对utf8编码系统做修正。

其实PHPMailer已经是非常成熟的PHP类了(当然需要打上前一段时间出现的bug的补丁),对于邮件头和邮件体的编码处理已经非常好了,http://www.thedevlog.com/dev/log-29.html中提到修改EncodeHeader并编码,实际上EncodeHeader后面的代码就是完成将头部编码的功能,所以不需要修改该函数。

要成功实现发送中文邮件,设置phpmailer类两个值即可。

$mail = new PHPMailer();
$mail->CharSet = “UTF-8″; // 设置字符集编码,GB2312 GBK
$mail->Encoding = “base64″;//设置文本编码方式
……

这样保证了邮件标题和正文内容全部不会乱码,当然邮件内容的字符集需要和给定的CharSet内容一致。

回过头来看看中为什么邮件乱码,在中发送邮件首先我们使用了具体语言的xoopsmailerlocal.php文件中XoopsMailerLocal类,而XoopsMailerLocal类继承自class\xoopsmailer.php中的XoopsMailer类,而XoopsMailer类的multimailer成员指向自class\mail\xoopsmultimailer.php中的XoopsMultiMailer类的实体,XoopsMultiMailer类是从PHPMailer派生的。

问题就出在XoopsMailer的构造函数上。在XoopsMultiMailer类的构造函数中(xoopsmultimailer.php中177行)指定了CharSet值为strtolower( _CHARSET ),这样做本来在绝大多数邮件系统中均不会出现乱码,但在XoopsMailer类的sendMail方法(xoopsmailer.php中378行)却重新指定了字符集和文本编码方式:

$this->multimailer->CharSet = $this->charSet;
        $this->multimailer->Encoding = $this->encoding;

这样导致前面在构造multimailer的时候指定了字符集为系统字符集strtolower( _CHARSET )(utf-8或者gb2312),到sendMail方法中却换成了XoopsMailer的成员charSet的值,而XoopsMailer的构造函数并没有让charSet随系统变化,而是取默认值:iso-8859-1。邮件客户端收到邮件按照iso-8859-1来显示邮件内容当然会乱码。所以我们只要正确的给XoopsMailer类实体赋给正确字符集(_CHARSET)即可。

解决办法是:

打开htdocs\class\xoopsmailer.php ,137行附近
$this->multimailer = new XoopsMultiMailer();
$this->reset();
后面添加一行:
$this->charSet = strtolower( _CHARSET );
$this->encoding = ‘base64′;

更完美的解决办法是:

打开htdocs\language\schinese\xoopsmailerlocal.php和htdocs\language\schinese_utf8\xoopsmailerlocal.php 修改为:
<?php
class XoopsMailerLocal extends XoopsMailer {

    function XoopsMailerLocal(){
        $this->XoopsMailer();
        $this->charSet = strtolower( _CHARSET );
        $this->encoding = ‘base64′;
    }
}
?>

实则是 中文版bug。

另外,为什么要指定encoding呢,这里涉及到email的原理,email产生的年代用7bit就足够表示所有ASCII字符可打印字符了,email发展到全世界之后,多字节语种的需要,需要使用8bit或者16bit或者更多bit来表示一个完整的字,但老式的网络设备和一些邮件系统并不能很好的处理不是7bit的内容或者并不能很好处理多字节的文本内容,这样就需要将文本做一个编码,base64和quoted-printable便是email中用来解决这个问题的最流行方法。email中附件都是用base64来编码具体内容的,用base64编码之后的邮件除非文本内容和指定字符集不一致或者本身就是乱码,否则不会出现乱码的。

当时给ceiea做Windows下邮件系统时候对email做了全面的分析,还是有些用处的。

[tags]PHPMailer,中文,邮件,[/tags]

六月
25

XOOPS的Page模组UTF-8字符编码下的使用方法

Author Dominic    Category PHP, XOOPS     Tags , , , , ,

文明猪汉化了非常好用的Page模组,其功能强大得过了头,充分体现了数据展现分离思想,将中原本主题、布局、区块的概念扩充到主题、布局、区块、皮肤,将原来相对固定的布局方式更改为随意布局的形式(如果可以直接拖动就更完美了),将然来局限于系统提供的区块提升到可以随意创建区块和随意利用区块的高度,但是目前Page模组仅仅只能使用GB2312编码上,如果网站采用UTF-8编码这不能利用这个Page模组。之前就找到了解决的办法,这次乘解决中文显示的问题一并写出来吧。

其实这个bug是由库引起的(参见我另外一篇文章:PHP中xajax库中文问题及提示返回XML文件无效的解决办法 ),解决办法是:

将page目录下所有文件全部采用UTF-8无BOM格式保存(当然语言文件不必要),至少server/page.server.php这个文件需要采用UTF-8无BOM格式保存(UltraEdit 操作方法:F12或另存为界面中格式下拉框选择‘UTF-8-无 BOM’),index.php这个也需要UTF-8无BOM格式保存,另外建立对应的UTF-8编码的语言文件。再将Framework目录下目录下所有的php文件全部使用UTF-8无BOM格式保存。一般即可。

之前的一个项目中使用了UTF-8格式的Page模组,这个模组的UTF-8格式支持包还是让文明猪来发布吧,不过有需要的也可以联系我。

 

六月
25

PHP中xajax库中文问题及提示返回XML文件无效的解决办法

Author Dominic    Category PHP     Tags , , ,

是PHP下一个非常好的ajax框架,虽然自己说自己是一个库(Library),但是我觉得它更像一个框架(Framework)。是一个开源的 PHP 类库 它能够让你黏合HTML、CSS、Javascript和PHP,并可以结合模板系统使用。

在运用的Page模组的时候,发现其不能和中文正常工作,特别是不能和UTF-8编码的页面一起工作,昨天在利用这个实现DataGrid的时候发现完全不能正常工作了,一直报“the XML response that was returned from the server is invalid”这个错误,Google了一下,发现不少人也有这个问题。结合之前解决的Page模组(感谢文明猪)的UTF-8使用问题的方法,终于发现了完美解决库使用中文的方法。

如果页面采用GB2312或GBK作为编码或字符集,一般网络上面提到的方法可以解决:需要注意的是common.php、server.php及server.php用到的php文件(特别是生成数据的文件)全部不要使用UTF-8编码格式保存而使用ASCII格式保存。同时server.php输出的数据内容最好也采用gb2312编码。
在common.php前面定义
define(‘XAJAX_DEFAULT_CHAR_ENCODING’,'GB2312′);
再在调用时使用:
$ = new ();
$->decodeUTF8InputOn();
或者
$ = new (‘gb2312′);
$->setCharEncoding();
$->decodeUTF8InputOn();
$objResponse = new xajaxResponse(‘gb2312′);

如果页面采用UTF-8字符集的话,网上一些人说使用UTF-8格式编码就可以了,实际上即使全部使用UTF-8编码也不能正常工作,还是会报错:“the XML response that was returned from the server is invalid”。联想到之前在IE下碰到UTF-8 BOM Bug(文章:IE下页面无端端空出一行及utf8页面无法显示的解决方法 ),会不会这个地方服务器传回的XML文件中也包含多个UTF-8 BOM内容呢?通过ethereal截获数据包发现,服务器返回的内容中还真是包含了多个UTF-8 BOM,可能还是IE使用的Microsoft XML Parser的UTF-8 BOM Bug吧。这样解决办法就出来了:所有页面全部采用UTF8编码并使用无UTF-8 BOM保存(UltraEdit 操作方法:F12或另存为界面中格式下拉框选择‘UTF-8-无 BOM’),页面包括库文件、common.php文件、server.php文件。供访问的页面也可以使用无UTF-8 BOM保存。

有时候返回的参数(特别是中文部分)被url编码了,这个时候需要我们将返回的数据使用Urldecode进行处理,以便能够正常完成后面的数据库操作。

最新 0.25下载地址:http://prdownloads.sourceforge.net/xajax/xajax_0.2.5.zip?download

中文手册(HonestQiao第一版,FlyingHail修改版) http://www.flyinghail.net/?p=44

UTF-8 BOM解释:”EF BB BF” 这三个字节就叫BOM,BOM的全称叫做”Byte Order Mard”。在UTF-8文件中常用BOM来表明这个文件是UTF-8文件,而BOM的本意实在UTF-16中用来表示高低字节序列的。

另外,PHP网站上说使用–enable-zend-multibyte可以解决这类问题,不过没有尝试,并且预计在PHP 6.0中会对Unicode做完美的支持。

五月
9

Delphi For PHP

Author Dominic    Category PHP, 软件应用     Tags , , , ,

周一的International PHP Magazine有一篇文章“Overview of Delphi for PHP”,初看以为是用Delphi来做PHP项目,仔细一看原来是用Delphi的来开发PHP。

Delphi for PHP是Borland公司在出售其开发部门未果之后下了个蛋:CodeGear的产品,以前一直很喜欢Delphi 7的开发环境赶紧上0day上下了.Delphi.for.PHP.v1.0.1.414,装上之后感觉非常happy。PHP的用了很多种,几乎用遍了可以下载到的PHP开发工具,甚至尝试过VS.PHP, 就是为了寻找一个能够自动实现MVC的,可以用拖拽的方式实现Delphi那种开发快感,但是上下寻觅不可得,只好用最顺手的UltraEdit开完成开发工作,辅以Zend Studio 5.2 来调试。看了Delphi for PHP之后我觉得可以卸载掉所有的其它的PHP开发工具了,PHP终于可以像JSP、ASP.Net那样用拖拽的方式实现变成,可以完全基于面向对象(以前好痛苦呀,一直手写PHP Class代码)和基于事件机制来开发PHP应用了。

Delphi for PHP 的启动画面,非常漂亮也很具有Web2.0气息:

启动画面

Delphi for PHP 的运行界面,非常类似Delphi 2006。左侧上方是代码浏览区,左侧下方是对象查看器。右侧是数据库设置区及控件面板。中间工作区是代码和设计界面。

完全支持现有PHP项目。手头的PHP5项目用Delphi for PHP打开,即可Run了,Delphi for PHP也内建了一个Apache。支持模板引擎、对CSS和Ajax都有很好的支持等技术。代码编辑器理所当然的支持CodeInsight功能了,调试功能可以和Zend Stuio和VS 2005 媲美了。将Delphi中的VCL、Object、Controls、Components和Packages概念全部带到Delphi for PHP中了,而且Delphi for PHP 本身Vcl组件是开源的,源代码可以手工更新(鄙视国内某些看似很好,代码质量糟糕还用盗版Zend Guard加密的软件),目前Delphi for PHP有50多个控件,这些组件都可以像Delphi 7中和VS 2003/2005开发ASP.Net那样直接拖放使用,最好的是可以自行开发Components和Packages扩充组件库。在ASP.Net中有很多很适用控件都实现了(不在需要去手工用div+css+javascript实现复杂的效果了)。我用Google Map VCL组件做了一个Demo,没有写一句代码就实现了Google Map所有功能,改动一下Google Map VCL组件就实现了Google Map中文版的功能。没用过Delphi 7和VS这样的优良的的PHPer还用了“对web技术前所未有的震撼”来评价它。

现在动态语言的风生水起,或许Delphi for PHP(Delphi for Ruby什么时候面世哦)可能挽救公司,或许能够让PHP从JSP、ASP.Net夺回部分市场份额。不知道有没有人在着手写Delphi for PHP的中文技术文章了,有时间可以写点。

相关文章:

动态语言崛起Delphi For PHP横空出世

Delphi for PHP 测试手记 (有不少截图)

四月
25

调整Smarty 模板引擎参数提高cache、templates_c目录读写性能

Author Dominic    Category Web应用, XOOPS     Tags , , ,

在用建立一个站点(只用引擎也一样)时,开启缓存之后cache和templates_c这两个目录用不了多长时间就充满了上千个文件乃至几十万个文件,操作一个包含数量巨大的文件的目录本来就很慢,这样会导致这两个目录的文件读取、删除、更新都很慢,本打算写一个cache handler来解决这个问题,在跟踪代码的时候发现已经解决了这个问题,那就是use_sub_dirs属性,将该属性设置为true即可。PHP示例代码

[coolcode lang="php"]<?php
 
require ‘../libs/.class.php’;
 
$ = new ;
 
$->use_sub_dirs = true;
 
$->compile_check = true;
$->debugging = true;
$->caching = true;
$->cache_lifetime = 60;
$->assign(“Name”,”Fred Irving Johnathan Bradley Peppergill”);
$->assign(“FirstName”,array(“John”,”Mary”,”James”,”Henry”));
$->assign(“LastName”,array(“Doe”,”Smith”,”Johnson”,”Case”));
$->assign(“Class”,array(array(“A”,”B”,”C”,”D”), array(“E”, “F”, “G”, “H”),
      array(“I”, “J”, “K”, “L”), array(“M”, “N”, “O”, “P”)));
 
$->assign(“contacts”, array(array(“phone” => “1″, “fax” => “2″, “cell” => “3″),
      array(“phone” => “555-4444″, “fax” => “555-3333″, “cell” => “760-1234″)));
 
$->assign(“option_values”, array(“NY”,”NE”,”KS”,”IA”,”OK”,”TX”));
$->assign(“option_output”, array(“New York”,”Nebraska”,”Kansas”,”Iowa”,”Oklahoma”,”Texas”));
$->assign(“option_selected”, “NE”);
 
$->display(‘index.tpl’);
 
?>
[/coolcode]

对应中编辑Class\template.php文件第58行附近更改var $use_sub_dirs = false;var $use_sub_dirs = true;即可。

专题推荐

标签

404错误 apache article CSS dotNet fckeditor Hack iOS iTouch javascript PayPal PHP rar ubuntu utf8 VMware VMware Tools weblinks Win2008 Windows Server 2008 Wordpress xajax XOOPS 上传 个人 中文 中文习惯 关键词 合肥 域名 安全 工作 文件类型 文章管理 时区 未分类 模块 模板 模组 电子地图 界面友好 禅意花园 网速 腾讯 配置管理

分类目录

新浪微博

存档

最近文章

近期评论

友情链接

分享按钮