<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Dominic.Xu&#039;s 博客 &#187; PHP</title>
	<atom:link href="http://xuplus.com/article/category/web/php-web/feed" rel="self" type="application/rss+xml" />
	<link>http://xuplus.com</link>
	<description>Web 2.0 生活</description>
	<lastBuildDate>Wed, 24 Aug 2011 05:26:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>给CodeIgniter 2.0.1中的PostgreSQL 数据库驱动打两个补丁</title>
		<link>http://xuplus.com/article/2011/03/a223.html</link>
		<comments>http://xuplus.com/article/2011/03/a223.html#comments</comments>
		<pubDate>Sat, 26 Mar 2011 04:32:16 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[PostgreSQL]]></category>

		<guid isPermaLink="false">http://xuplus.com/article/2011/03/a223.html</guid>
		<description><![CDATA[近期帮朋友用CodeIgniter基于PostgreSQL做了个小东西，发现CodeIgniter2.0.0在实现PostgreSQL数据库驱动是有两个小缺陷。 一个是CI的数据库通用接口insert_batch，CI2.0发布包中的PosgreSQL驱动实现，并没有实现该接口，可以在system\database\drivers\postgre\postgre_driver.php文件中的_insert函数下添加如下函数。 // -------------------------------------------------------------------- /** * Insert_batch statement * * Generates a platform-specific insert string from the supplied data * * @access public * @param string the table name * @param array the insert keys * @param array the insert values * @return string */ function _insert_batch($table, $keys, $values) { return &#34;INSERT INTO &#34;.$table.&#34; (&#34;.implode(', [...]]]></description>
			<content:encoded><![CDATA[<p>近期帮朋友用CodeIgniter基于PostgreSQL做了个小东西，发现CodeIgniter2.0.0在实现PostgreSQL数据库驱动是有两个小缺陷。</p>
<p>一个是CI的数据库通用接口insert_batch，CI2.0发布包中的PosgreSQL驱动实现，并没有实现该接口，可以在system\database\drivers\postgre\postgre_driver.php文件中的_insert函数下添加如下函数。</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:56c1e069-d5d8-441e-a25f-2f25bd6335aa" class="wlWriterEditableSmartContent">
<pre style=" width: 600px; height: 339px;background-color:White;overflow: auto;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #000000;">    </span><span style="color: #008000;">//</span><span style="color: #008000;"> --------------------------------------------------------------------</span><span style="color: #008000;">
</span><span style="color: #000000;">    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
     * Insert_batch statement
     *
     * Generates a platform-specific insert string from the supplied data
     *
     * @access    public
     * @param    string    the table name
     * @param    array    the insert keys
     * @param    array    the insert values
     * @return    string
     </span><span style="color: #008000;">*/</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">function</span><span style="color: #000000;"> _insert_batch(</span><span style="color: #800080;">$table</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$keys</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$values</span><span style="color: #000000;">)
    {
        </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #000000;">&quot;</span><span style="color: #000000;">INSERT INTO </span><span style="color: #000000;">&quot;</span><span style="color: #000000;">.</span><span style="color: #800080;">$table</span><span style="color: #000000;">.</span><span style="color: #000000;">&quot;</span><span style="color: #000000;"> (</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">.</span><span style="color: #008080;">implode</span><span style="color: #000000;">(</span><span style="color: #000000;">'</span><span style="color: #000000;">, </span><span style="color: #000000;">'</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$keys</span><span style="color: #000000;">)</span><span style="color: #000000;">.</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">) VALUES </span><span style="color: #000000;">&quot;</span><span style="color: #000000;">.</span><span style="color: #008080;">implode</span><span style="color: #000000;">(</span><span style="color: #000000;">'</span><span style="color: #000000;">, </span><span style="color: #000000;">'</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$values</span><span style="color: #000000;">);
    }
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> --------------------------------------------------------------------</span><span style="color: #008000;">
</span></div>
</pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<p>另一个是insert_id()函数，该函数如果在数据表没有serial字段可能无法返回数值，导致问题，特别是主从表而从表不需要serial字段的情况下。</p>
<p>如果碰到这个问题可以把原来的：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:ef1bb250-26e5-4a8d-be70-b94787eb5ee2" class="wlWriterEditableSmartContent">
<pre style=" width: 600px; height: 160px;background-color:White;overflow: auto;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #0000FF;">elseif</span><span style="color: #000000;"> (</span><span style="color: #800080;">$table</span><span style="color: #000000;"> </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;"> </span><span style="color: #800080;">$column</span><span style="color: #000000;"> </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;"> </span><span style="color: #800080;">$v</span><span style="color: #000000;"> </span><span style="color: #000000;">&gt;=</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">8.0</span><span style="color: #000000;">'</span><span style="color: #000000;">)
        {
            </span><span style="color: #800080;">$sql</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #008080;">sprintf</span><span style="color: #000000;">(</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">SELECT pg_get_serial_sequence('%s','%s') as seq</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$table</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$column</span><span style="color: #000000;">);
            </span><span style="color: #800080;">$query</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$this</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">query(</span><span style="color: #800080;">$sql</span><span style="color: #000000;">);
            </span><span style="color: #800080;">$row</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$query</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">row();
            </span><span style="color: #800080;">$sql</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #008080;">sprintf</span><span style="color: #000000;">(</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">SELECT CURRVAL('%s') as ins_id</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$row</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">seq);
        }</span></div>
</pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<p>修改成：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:a019abdb-182a-4895-b778-f4fe70626d09" class="wlWriterEditableSmartContent">
<pre style=" width: 600px; height: 195px;background-color:White;overflow: auto;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #000000;">        </span><span style="color: #0000FF;">elseif</span><span style="color: #000000;"> (</span><span style="color: #800080;">$table</span><span style="color: #000000;"> </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;"> </span><span style="color: #800080;">$column</span><span style="color: #000000;"> </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;"> </span><span style="color: #800080;">$v</span><span style="color: #000000;"> </span><span style="color: #000000;">&gt;=</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">8.0</span><span style="color: #000000;">'</span><span style="color: #000000;">)
        {
            </span><span style="color: #800080;">$sql</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #008080;">sprintf</span><span style="color: #000000;">(</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">SELECT pg_get_serial_sequence('%s','%s') as seq</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$table</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$column</span><span style="color: #000000;">);
            </span><span style="color: #800080;">$query</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$this</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">query(</span><span style="color: #800080;">$sql</span><span style="color: #000000;">);
            </span><span style="color: #800080;">$row</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$query</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">row();
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;">(</span><span style="color: #800080;">$row</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">seq</span><span style="color: #000000;">!=</span><span style="color: #000000;">''</span><span style="color: #000000;">)
                </span><span style="color: #800080;">$sql</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #008080;">sprintf</span><span style="color: #000000;">(</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">SELECT CURRVAL('%s') as ins_id</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$row</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">seq);
            </span><span style="color: #0000FF;">else</span><span style="color: #000000;">
                </span><span style="color: #800080;">$sql</span><span style="color: #000000;">=</span><span style="color: #000000;">'</span><span style="color: #000000;">SELECT LASTVAL() as ins_id</span><span style="color: #000000;">'</span><span style="color: #000000;">;
        }</span></div>
</pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>

	标签： <a href="http://xuplus.com/article/tag/codeigniter" title="CodeIgniter" rel="tag">CodeIgniter</a>, <a href="http://xuplus.com/article/tag/postgresql" title="PostgreSQL" rel="tag">PostgreSQL</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2011/03/a223.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHPMailer类发送中文邮件兼谈解决XOOPS中文发送邮件乱码</title>
		<link>http://xuplus.com/article/2007/08/a57.html</link>
		<comments>http://xuplus.com/article/2007/08/a57.html#comments</comments>
		<pubDate>Tue, 07 Aug 2007 05:25:41 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[XOOPS]]></category>

		<guid isPermaLink="false">http://xuplus.com/?p=57</guid>
		<description><![CDATA[xoops.org.cn论坛上又有人问xoops发送中文邮件乱码的问题。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-&#62;CharSet = “UTF-8&#8243;; // 设置字符集编码，GB2312 GBK $mail-&#62;Encoding = “base64&#8243;;//设置文本编码方式 …… 这样保证了邮件标题和正文内容全部不会乱码，当然邮件内容的字符集需要和给定的CharSet内容一致。 回过头来看看xoops中为什么邮件乱码，在xoops中发送邮件首先我们使用了具体语言的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-&#62;multimailer-&#62;CharSet = $this-&#62;charSet;         $this-&#62;multimailer-&#62;Encoding = $this-&#62;encoding; 这样导致前面在构造multimailer的时候指定了字符集为XOOPS系统字符集strtolower( _CHARSET )（utf-8或者gb2312），到sendMail方法中却换成了XoopsMailer的成员charSet的值，而XoopsMailer的构造函数并没有让charSet随系统变化，而是取默认值：iso-8859-1。邮件客户端收到邮件按照iso-8859-1来显示邮件内容当然会乱码。所以我们只要正确的给XoopsMailer类实体赋给正确字符集（_CHARSET）即可。 解决办法是： 打开htdocs\class\xoopsmailer.php ，137行附近 $this-&#62;multimailer = new XoopsMultiMailer(); $this-&#62;reset(); 后面添加一行： $this-&#62;charSet = strtolower( _CHARSET ); $this-&#62;encoding = &#8216;base64&#8242;; 更完美的解决办法是： 打开htdocs\language\schinese\xoopsmailerlocal.php和htdocs\language\schinese_utf8\xoopsmailerlocal.php 修改为： &#60;?php class XoopsMailerLocal [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://xuplus.com/article/tag/xoops" class="st_tag internal_tag" rel="tag" title="标签 XOOPS 下的日志">xoops</a>.org.cn论坛上又有人问xoops发送中文邮件乱码的问题。domecc给出了一个临时办法，还提供一个网址<a href="http://www.thedevlog.com/dev/log-29.html" title="http://www.thedevlog.com/dev/log-29.html">http://www.thedevlog.com/dev/log-29.html</a>来对utf8编码系统做修正。</p>
<p>其实PHPMailer已经是非常成熟的PHP类了（当然需要打上前一段时间出现的bug的补丁），对于邮件头和邮件体的编码处理已经非常好了，<a href="http://www.thedevlog.com/dev/log-29.html" title="http://www.thedevlog.com/dev/log-29.html">http://www.thedevlog.com/dev/log-29.html<font color="#333333">中提到修改EncodeHeader</font></a>并编码，实际上EncodeHeader后面的代码就是完成将头部编码的功能，所以不需要修改该函数。</p>
<p>要成功实现发送中文邮件，设置phpmailer类两个值即可。</p>
<blockquote><p>$mail = new PHPMailer();<br />
$mail-&gt;CharSet = “UTF-8&#8243;; // 设置字符集编码，GB2312 GBK<br />
$mail-&gt;Encoding = “base64&#8243;;//设置文本编码方式<br />
……</p></blockquote>
<p>这样保证了邮件标题和正文内容全部不会乱码，当然邮件内容的字符集需要和给定的CharSet内容一致。</p>
<p>回过头来看看xoops中为什么邮件乱码，在xoops中发送邮件首先我们使用了具体语言的xoopsmailerlocal.php文件中XoopsMailerLocal类，而XoopsMailerLocal类继承自class\xoopsmailer.php中的XoopsMailer类，而XoopsMailer类的multimailer成员指向自class\mail\xoopsmultimailer.php中的XoopsMultiMailer类的实体，XoopsMultiMailer类是从PHPMailer派生的。</p>
<p>问题就出在XoopsMailer的构造函数上。在XoopsMultiMailer类的构造函数中（xoopsmultimailer.php中177行）指定了CharSet值为strtolower( _CHARSET )，这样做本来在绝大多数邮件系统中均不会出现乱码，但在XoopsMailer类的sendMail方法（xoopsmailer.php中378行）却重新指定了字符集和文本编码方式：</p>
<blockquote><p>$this-&gt;multimailer-&gt;CharSet = $this-&gt;charSet;<br />
        $this-&gt;multimailer-&gt;Encoding = $this-&gt;encoding;</p></blockquote>
<p>这样导致前面在构造multimailer的时候指定了字符集为XOOPS系统字符集strtolower( _CHARSET )（utf-8或者gb2312），到sendMail方法中却换成了XoopsMailer的成员charSet的值，而XoopsMailer的构造函数并没有让charSet随系统变化，而是取默认值：iso-8859-1。邮件客户端收到邮件按照iso-8859-1来显示邮件内容当然会乱码。所以我们只要正确的给XoopsMailer类实体赋给正确字符集（_CHARSET）即可。</p>
<p>解决办法是：</p>
<blockquote><p>打开htdocs\class\xoopsmailer.<a href="http://xuplus.com/article/tag/php" class="st_tag internal_tag" rel="tag" title="标签 PHP 下的日志">php</a> ，137行附近<br />
$this-&gt;multimailer = new XoopsMultiMailer();<br />
$this-&gt;reset();<br />
后面添加一行：<br />
$this-&gt;charSet = strtolower( _CHARSET );<br />
$this-&gt;encoding = &#8216;base64&#8242;;</p></blockquote>
<p>更完美的解决办法是：</p>
<blockquote><p>打开htdocs\language\schinese\xoopsmailerlocal.php和htdocs\language\schinese_utf8\xoopsmailerlocal.php 修改为：<br />
&lt;?php<br />
class XoopsMailerLocal extends XoopsMailer {</p>
<p>    function XoopsMailerLocal(){<br />
        $this-&gt;XoopsMailer();<br />
        $this-&gt;charSet = strtolower( _CHARSET );<br />
        $this-&gt;encoding = &#8216;base64&#8242;;<br />
    }<br />
}<br />
?&gt;</p></blockquote>
<p>实则是xoops 中文版bug。</p>
<p>另外，为什么要指定encoding呢，这里涉及到email的原理，email产生的年代用7bit就足够表示所有ASCII字符可打印字符了，email发展到全世界之后，多字节语种的需要，需要使用8bit或者16bit或者更多bit来表示一个完整的字，但老式的网络设备和一些邮件系统并不能很好的处理不是7bit的内容或者并不能很好处理多字节的文本内容，这样就需要将文本做一个编码，base64和quoted-printable便是email中用来解决这个问题的最流行方法。email中附件都是用base64来编码具体内容的，用base64编码之后的邮件除非文本内容和指定字符集不一致或者本身就是乱码，否则不会出现乱码的。</p>
<p>当时给ceiea做Windows下邮件系统时候对email做了全面的分析，还是有些用处的。</p>
<p>[tags]PHPMailer,<a href="http://xuplus.com/article/tag/%e4%b8%ad%e6%96%87" class="st_tag internal_tag" rel="tag" title="标签 中文 下的日志">中文</a>,邮件,XOOPS[/tags]</p>

	标签： <a href="http://xuplus.com/article/tag/php" title="PHP" rel="tag">PHP</a>, <a href="http://xuplus.com/article/tag/xoops" title="XOOPS" rel="tag">XOOPS</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2007/08/a57.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>XOOPS的Page模组UTF-8字符编码下的使用方法</title>
		<link>http://xuplus.com/article/2007/06/a38.html</link>
		<comments>http://xuplus.com/article/2007/06/a38.html#comments</comments>
		<pubDate>Mon, 25 Jun 2007 07:06:14 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[XOOPS]]></category>
		<category><![CDATA[Page]]></category>
		<category><![CDATA[UTF 8]]></category>
		<category><![CDATA[xajax]]></category>
		<category><![CDATA[中文]]></category>

		<guid isPermaLink="false">http://xuplus.com/?p=38</guid>
		<description><![CDATA[文明猪汉化了非常好用的Page模组，其功能强大得过了头，充分体现了数据展现分离思想，将Xoops中原本主题、布局、区块的概念扩充到主题、布局、区块、皮肤，将原来相对固定的布局方式更改为随意布局的形式（如果可以直接拖动就更完美了），将然来局限于系统提供的区块提升到可以随意创建区块和随意利用区块的高度，但是目前Page模组仅仅只能使用GB2312编码上，如果网站采用UTF-8编码这不能利用这个Page模组。之前就找到了解决的办法，这次乘解决xajax中文显示的问题一并写出来吧。 其实这个bug是由xajax库引起的（参见我另外一篇文章：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目录下xajax目录下所有的php文件全部使用UTF-8无BOM格式保存。一般即可。 之前的一个项目中使用了UTF-8格式的Page模组，这个模组的UTF-8格式支持包还是让文明猪来发布吧，不过有需要的也可以联系我。   标签： Page, PHP, UTF 8, xajax, XOOPS, 中文]]></description>
			<content:encoded><![CDATA[<p><font size="3">文明猪汉化了非常好用的Page模组，其功能强大得过了头，充分体现了数据展现分离思想，将Xoops中原本主题、布局、区块的概念扩充到主题、布局、区块、皮肤，将原来相对固定的布局方式更改为随意布局的形式（如果可以直接拖动就更完美了），将然来局限于系统提供的区块提升到可以随意创建区块和随意利用区块的高度，但是目前Page模组仅仅只能使用GB2312编码上，如果网站采用UTF-8编码这不能利用这个Page模组。之前就找到了解决的办法，这次乘解决xajax中文显示的问题一并写出来吧。</font></p>
<p><font size="3">其实这个bug是由xajax库引起的（参见我另外一篇文章：<a href="http://xuplus.com/article/2007/06/a35.html">PHP中xajax库中文问题及提示返回XML文件无效的解决办法 </a>），解决办法是：</font></p>
<p><font size="3">将page目录下所有文件全部采用UTF-8无BOM格式保存（当然语言文件不必要），至少server/<a href="http://xuplus.com/article/tag/page" class="st_tag internal_tag" rel="tag" title="标签 Page 下的日志">page</a>.server.php这个文件需要采用UTF-8无BOM格式保存（UltraEdit 操作方法：F12或另存为界面中格式下拉框选择‘UTF-8－无 BOM’），index.php这个也需要UTF-8无BOM格式保存，另外建立对应的UTF-8编码的语言文件。再将Framework目录下xajax目录下所有的php文件全部使用UTF-8无BOM格式保存。一般即可。</font></p>
<p><font size="3">之前的一个项目中使用了UTF-8格式的Page模组，这个模组的UTF-8格式支持包还是让文明猪来发布吧，不过有需要的也可以联系我。</font></p>
<p> </p>

	标签： <a href="http://xuplus.com/article/tag/page" title="Page" rel="tag">Page</a>, <a href="http://xuplus.com/article/tag/php" title="PHP" rel="tag">PHP</a>, <a href="http://xuplus.com/article/tag/utf-8" title="UTF 8" rel="tag">UTF 8</a>, <a href="http://xuplus.com/article/tag/xajax" title="xajax" rel="tag">xajax</a>, <a href="http://xuplus.com/article/tag/xoops" title="XOOPS" rel="tag">XOOPS</a>, <a href="http://xuplus.com/article/tag/%e4%b8%ad%e6%96%87" title="中文" rel="tag">中文</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2007/06/a38.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP中xajax库中文问题及提示返回XML文件无效的解决办法</title>
		<link>http://xuplus.com/article/2007/06/a37.html</link>
		<comments>http://xuplus.com/article/2007/06/a37.html#comments</comments>
		<pubDate>Mon, 25 Jun 2007 06:31:26 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[xajax]]></category>
		<category><![CDATA[中文]]></category>
		<category><![CDATA[编码]]></category>

		<guid isPermaLink="false">http://xuplus.com/?p=37</guid>
		<description><![CDATA[xajax是PHP下一个非常好的ajax框架，虽然xajax自己说自己是一个库(Library)，但是我觉得它更像一个框架（Framework）。xajax是一个开源的 PHP 类库 它能够让你黏合HTML、CSS、Javascript和PHP，并可以结合Smarty模板系统使用。 在运用Xoops的Page模组的时候，发现其不能和中文正常工作，特别是不能和UTF-8编码的页面一起工作，昨天在利用这个实现DataGrid的时候发现完全不能正常工作了，一直报“the XML response that was returned from the server is invalid”这个错误，Google了一下，发现不少人也有这个问题。结合之前解决Xoops的Page模组（感谢文明猪）的UTF-8使用问题的方法，终于发现了完美解决xajax库使用中文的方法。 如果页面采用GB2312或GBK作为编码或字符集，一般网络上面提到的方法可以解决：需要注意的是common.php、server.php及server.php用到的php文件（特别是生成数据的文件）全部不要使用UTF-8编码格式保存而使用ASCII格式保存。同时server.php输出的数据内容最好也采用gb2312编码。 在common.php前面定义 define(&#8216;XAJAX_DEFAULT_CHAR_ENCODING&#8217;,'GB2312&#8242;); 再在调用时使用： $xajax = new xajax(); $xajax-&#62;decodeUTF8InputOn(); 或者 $xajax = new xajax(&#8216;gb2312&#8242;); $xajax-&#62;setCharEncoding(); $xajax-&#62;decodeUTF8InputOn(); $objResponse = new xajaxResponse(&#8216;gb2312&#8242;); 如果页面采用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 [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-size: small;">xajax是PHP下一个非常好的ajax框架，虽然xajax自己说自己是一个库(Library)，但是我觉得它更像一个框架（Framework）。xajax是一个开源的 <a href="http://xuplus.com/article/tag/php" class="st_tag internal_tag" rel="tag" title="标签 PHP 下的日志">PHP</a> 类库 它能够让你黏合HTML、CSS、Javascript和PHP，并可以结合Smarty模板系统使用。</span></p>
<p><span style="font-size: small;">在运用Xoops的Page模组的时候，发现其不能和中文正常工作，特别是不能和UTF-8编码的页面一起工作，昨天在利用这个实现DataGrid的时候发现完全不能正常工作了，一直报“the XML response that was returned from the server is invalid”这个错误，Google了一下，发现不少人也有这个问题。结合之前解决Xoops的Page模组（感谢文明猪）的UTF-8使用问题的方法，终于发现了完美解决xajax库使用中文的方法。</span></p>
<p><span style="font-size: small;">如果页面采用GB2312或GBK作为编码或字符集，一般网络上面提到的方法可以解决：需要注意的是common.php、server.php及server.php用到的php文件（特别是生成数据的文件）全部不要使用UTF-8编码格式保存而使用ASCII格式保存。同时server.php输出的数据内容最好也采用gb2312<a href="http://xuplus.com/article/tag/%e7%bc%96%e7%a0%81" class="st_tag internal_tag" rel="tag" title="标签 编码 下的日志">编码</a>。<br />
在common.php前面定义<br />
define(&#8216;<a href="http://xuplus.com/article/tag/xajax" class="st_tag internal_tag" rel="tag" title="标签 xajax 下的日志">XAJAX</a>_DEFAULT_CHAR_ENCODING&#8217;,'GB2312&#8242;);<br />
再在调用时使用：<br />
$xajax = new xajax();<br />
$xajax-&gt;decodeUTF8InputOn();<br />
或者<br />
$xajax = new xajax(&#8216;gb2312&#8242;);<br />
$xajax-&gt;setCharEncoding();<br />
$xajax-&gt;decodeUTF8InputOn();<br />
$objResponse = new xajaxResponse(&#8216;gb2312&#8242;); </span></p>
<p><span style="font-size: small;">如果页面采用UTF-8字符集的话，网上一些人说使用UTF-8格式编码就可以了，实际上即使全部使用UTF-8编码也不能正常工作，还是会报错：“the XML response that was returned from the server is invalid”。联想到之前在IE下碰到UTF-8 BOM Bug（文章：<a href="http://xuplus.com/article/2007/04/a6.html">IE下页面无端端空出一行及utf8页面无法显示的解决方法 </a>），会不会这个地方服务器传回的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’），页面包括xajax库文件、common.php文件、server.php文件。供访问的页面也可以使用无UTF-8 BOM保存。</span></p>
<p><span style="font-size: small;">有时候返回的参数（特别是中文部分）被url编码了，这个时候需要我们将返回的数据使用Urldecode进行处理，以便能够正常完成后面的数据库操作。 </span></p>
<p><span style="font-size: small;">最新xajax 0.25下载地址：<a title="http://prdownloads.sourceforge.net/xajax/xajax_0.2.5.zip?download" href="http://prdownloads.sourceforge.net/xajax/xajax_0.2.5.zip?download">http://prdownloads.sourceforge.net/xajax/xajax_0.2.5.zip?download</a></span></p>
<p><span style="font-size: small;">xajax中文手册（HonestQiao第一版，FlyingHail修改版） <a href="http://www.flyinghail.net/?p=44">http://www.flyinghail.net/?p=44</a></span></p>
<p><span style="font-size: small;">UTF-8 BOM解释：”EF BB BF” 这三个字节就叫BOM，BOM的全称叫做”Byte Order Mard”。在UTF-8文件中常用BOM来表明这个文件是UTF-8文件，而BOM的本意实在UTF-16中用来表示高低字节序列的。</span></p>
<p><span style="font-size: small;">另外，PHP网站上说使用&#8211;enable-zend-multibyte可以解决这类问题，不过没有尝试，并且预计在PHP 6.0中会对Unicode做完美的支持。</span></p>

	标签： <a href="http://xuplus.com/article/tag/php" title="PHP" rel="tag">PHP</a>, <a href="http://xuplus.com/article/tag/xajax" title="xajax" rel="tag">xajax</a>, <a href="http://xuplus.com/article/tag/%e4%b8%ad%e6%96%87" title="中文" rel="tag">中文</a>, <a href="http://xuplus.com/article/tag/%e7%bc%96%e7%a0%81" title="编码" rel="tag">编码</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2007/06/a37.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Delphi For PHP</title>
		<link>http://xuplus.com/article/2007/05/a23.html</link>
		<comments>http://xuplus.com/article/2007/05/a23.html#comments</comments>
		<pubDate>Wed, 09 May 2007 07:20:46 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[软件应用]]></category>
		<category><![CDATA[Borland]]></category>
		<category><![CDATA[CodeGear]]></category>
		<category><![CDATA[Delphi]]></category>
		<category><![CDATA[IDE]]></category>

		<guid isPermaLink="false">http://xuplus.com/?p=23</guid>
		<description><![CDATA[周一的International PHP Magazine有一篇文章“Overview of Delphi for PHP”，初看以为是用Delphi来做PHP项目，仔细一看原来是用Delphi的IDE来开发PHP。 Delphi for PHP是Borland公司在出售其开发部门未果之后下了个蛋：CodeGear的产品，以前一直很喜欢Delphi 7的开发环境赶紧上0day上下了.Delphi.for.PHP.v1.0.1.414，装上之后感觉非常happy。PHP的IDE用了很多种，几乎用遍了可以下载到的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。支持Smarty模板引擎、对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这样的优良的IDE的PHPer还用了“对web技术前所未有的震撼”来评价它。 现在动态语言的风生水起，或许Delphi for PHP（Delphi for [...]]]></description>
			<content:encoded><![CDATA[<p><font size="3">周一的International <a href="http://xuplus.com/article/tag/php" class="st_tag internal_tag" rel="tag" title="标签 PHP 下的日志">PHP</a> Magazine有一篇文章<a href="http://www.pgregg.com/forums/viewtopic.php?tid=76">“Overview of Delphi for PHP”</a>，初看以为是用Delphi来做PHP项目，仔细一看原来是用Delphi的IDE来开发PHP。</font></p>
<p><font size="3"><a href="http://xuplus.com/article/tag/delphi" class="st_tag internal_tag" rel="tag" title="标签 Delphi 下的日志">Delphi</a> for PHP是<a href="http://www.borland.com">Borland</a>公司在出售其</font><font size="3">开发部门未果之后下了个蛋：<a href="http://www.CodeGear.com">CodeGear</a>的产品，以前一直很喜欢Delphi 7的开发环境赶紧上<a href="http://0daycheck.eastgame.net/0day">0day</a>上下了.Delphi.for.PHP.v1.0.1.414，装上之后感觉非常happy。PHP的IDE用了很多种，几乎用遍了可以下载到的PHP开发工具，甚至尝试过<a href="http://www.jcxsoftware.com/vs.php">VS.PHP</a>， 就是为了寻找一个能够自动实现MVC的，可以用拖拽的方式实现Delphi那种开发快感，但是上下寻觅不可得，只好用最顺手的UltraEdit开完成开发工作，辅以Zend Studio 5.2 来调试。看了Delphi for PHP之后我觉得可以卸载掉所有的其它的PHP开发工具了，PHP终于可以像JSP、ASP.Net那样用拖拽的方式实现变成，可以完全基于面向对象（以前好痛苦呀，一直手写PHP Class代码）和基于事件机制来开发PHP应用了。</font></p>
<p><font size="3">Delphi for PHP 的启动画面，非常漂亮也很具有Web2.0气息：</font></p>
<p><font size="3"><img src="http://xuplus.com/uploads/Image/delphiphp1.jpg" alt="启动画面" /></font></p>
<p><font size="3">Delphi for PHP 的运行界面，非常类似Delphi 2006。左侧上方是代码浏览区，左侧下方是对象查看器。右侧是数据库设置区及控件面板。中间工作区是代码和设计界面。</font></p>
<p><font size="3">完全支持现有PHP项目。手头的PHP5项目用Delphi for PHP打开，即可Run了，Delphi for PHP也内建了一个Apache。支持Smarty模板引擎、对CSS和Ajax都有很好的支持等技术。代码编辑器理所当然的支持CodeInsight功能了，调试功能可以和Zend Stuio和VS 2005 媲美了。将Delphi中的VCL、Object、Controls、Components和Packages概念全部带到Delphi for PHP中了，而且Delphi for PHP 本身Vcl组件是开源的，源代码可以手工更新（鄙视国内某些看似很好，代码质量糟糕还用盗版<a href="http://www.zend.com">Zend Guard</a>加密的软件），目前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这样的优良的IDE的PHPer还用了“对web技术前所未有的震撼”来评价它。</font></p>
<p><font size="3">现在动态语言的风生水起，或许Delphi for PHP（Delphi for Ruby什么时候面世哦）可能挽救Borland公司，或许能够让PHP从JSP、ASP.Net夺回部分市场份额。不知道有没有人在着手写Delphi for PHP的中文技术文章了，有时间可以写点。</font></p>
<p><font size="3">相关文章：</font></p>
<p><font size="3"><a href="http://www.lupaworld.com/viewnews_14487.html">动态语言崛起Delphi For PHP横空出世</a></font></p>
<p><font size="3"><a href="http://www.wesoho.com/article.asp?id=2165">Delphi for PHP 测试手记</a> （有不少截图）</font></p>

	标签： <a href="http://xuplus.com/article/tag/borland" title="Borland" rel="tag">Borland</a>, <a href="http://xuplus.com/article/tag/codegear" title="CodeGear" rel="tag">CodeGear</a>, <a href="http://xuplus.com/article/tag/delphi" title="Delphi" rel="tag">Delphi</a>, <a href="http://xuplus.com/article/tag/ide" title="IDE" rel="tag">IDE</a>, <a href="http://xuplus.com/article/tag/php" title="PHP" rel="tag">PHP</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2007/05/a23.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

