<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post//</link>
<title><![CDATA[utf8设置无效，apache+php 字符编码问题解决]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Wed, 07 May 2008 02:51:29 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	&lt;?php<br/>header(&quot;Content-type: text/html; charset=utf-8&quot;);<br/>?&gt;<br/>在前面加上一个这个玩意就可以了。。。！不用修改apache的设置！<br/><br/><br/>如果你在网上搜索 “apache配置”，搜到的页面大多都会建议你在httpd.conf中加上这么一句：AddDefaultCharset GB2312。对于新手而且是只用GB2312编码的开发人来说，这么做是ok的。<br/><br/>但是如果要想使用UTF-8字符集的话，比如 在test.php文件中需要有<br/>meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot; 这段代码。这时你再打开浏览器访问test.php页面的话，你看到的是正确的页面。但是如果实际上浏览器还是以GB2312编码解释从服务器返回的response，为什么呢？原因是浏览器是根据http应答消息头部中的 Content-type: text/html; charset=GB2312 来决定使用何种编码解释应答，也就是说apache服务器仍然用GB2312编码传递数据。<br/><br/>所以说如果apache的默认字符集被设置成了GB2312，即使在页面中声明使用UTF-8编码，apache服务器还是会按照GB2312编码来传送http response。<br/><br/>没关系，我们把AddDefaultCharset GB2312 改成 AddDefaultCharset UTF-8，看看什么结果？如果你看到乱码恭喜你，你还知道是乱码问题；如果你看到是空白页面，那么你就惨了，你可能会以为这是其他什么原因造成的，而不会从编码的角度去考虑怎么解决问题。这是为什么？<br/><br/>原因在于php文件本身是用系统字符集来编码的，中文的windows XP都是用GB2312，每一个文件头部都有字段指示该文件是用何种方式编码的。当apache接到浏览器的请求后，会让php去解释所请求的页面，比如 test.php。php会识别出test.php的编码方式是GB2312后(就像我们用javac编译java源文件时，编译器默认用系统编码读源文件里的内容。如果源文件不是用系统编码来保存的，可以用命令javac -encoding指定具体的编码)，把数据以GB2312的编码格式传递给apache，而apache服务器不会改变从php传来的数据，只是在应答消息头部中把字符集设置成UTF-8： Content-type: text/html; charset=UTF-8. 也就是说你传递的是GB2312编码的数据，而浏览器却以UTF-8编码来解释应答消息。<br/><br/>由于UTF-8为3个字节表示一个汉子，而普通的GB2312或BIG5是两个。页面输出时，由于上述原因，出现半个汉字的情况，这时该半个汉字会和的 &gt;结合成一个乱码字，导致IE无法读完的话，会发现实际上整个叶面全部已经输出了。如果使用的是Mozilla、Mozilla Firefox、Sarafi的浏览器这不会造成这个问题，而是一堆乱码。这是由于Firefox浏览器和IE解析网页编码的策略不同产生的。<br/><br/>OK,我们把test.php以UTF-8保存，再用浏览器访问时，就没有问题了。可这样做，会使得apache目录下的所有web应用只能用同一种编码。如何搞定？<br/><br/>解决办法：<br/><br/>首先，可以使用AddDefaultCharset off来关闭默认文件编码，这样apache服务器就不会在http应答消息头部设置charset，只是设置Content-type: text/html. 而浏览器就会依靠html文件中设置的harset来决定编码。其次，脚本php.ini文件中的default_charset = “UTF-8″作用同httpd.conf文件，把该行注释掉，使php自动识别文件的编码方式。<br/><br/>这样不论你用什么编码方式，只要test.php中的<br/>meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″ 与你test.php文件编码方式相同，就不会产生乱码问题。<br/><br/>用户提交数据的编码<br/><br/>浏览器提交的字符编码由客户端的characher encoding决定。例如，当前浏览器的编码是Gb2312，用户提交数据后，无论apache设置的编码方式是GB2312还是UTF-8，这时在服务器端接收到的仍是以Gb2312编码的数据。如果要在返回页面上显示用户刚才提交的数据，而该页面是用UTF-8编码的，或者要在数据库中存储的用户提交的数据，而数据库是UTF-8编码的，那就要做字符转换了。<br/><br/>照著 Jedi 翻譯的 Moveable 安裝手冊，會幫您做好 UTF-8 編碼必備的設定及更新，進入管理模式及寫文章都正常，但是可能會發生發布出去的文章在瀏覽器上看變成亂碼的問題。<br/><br/>這時就是 Apache 的預設 Charset 要改為 utf-8 了，只要修改 httpd.conf 裡的:<br/><br/>AddDefaultCharset utf-8<br/><br/>如此所有的網頁都會以預設 UTF-8 來瀏灠，但是問題來了!<br/><br/>1.如果你的網站裡的其它網頁都是 big5 怎麼辦?<br/>2.虛擬主機商也不可能為了你一個網站改他主機預設的 charset<br/><br/>這時只要設定 httpd.conf 中您發布文章的目錄設定即可:<br/><br/>&lt;Directory &quot;/var/www/html/mt&quot;&gt;<br/>AddDefaultCharset utf-8<br/>&lt;/Directory&gt;<br/><br/>若是您是虛擬主機，您也可以請您的主機商在 Directory 目錄比照做此設定:<br/><br/>&lt;Directory &quot;/home/yourname/public_html&quot;&gt;<br/>AddDefaultCharset utf-8<br/>Options FollowSymLinks<br/>AllowOverride None<br/>Order allow,deny<br/>Allow from all<br/>&lt;/Directory&gt;<br/><br/>若是您的 public_html 內有其它 big5 的網站，就要請您的虛擬主機商另外再幫您的 Moveable 開一個 Directory 設定囉! <br/><br/><br/><br/>
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] utf8设置无效，apache+php 字符编码问题解决]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>