<?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>爱周末 &#187; php中文乱码</title>
	<atom:link href="http://zhoumo123.cn/tag/php%e4%b8%ad%e6%96%87%e4%b9%b1%e7%a0%81/feed" rel="self" type="application/rss+xml" />
	<link>http://zhoumo123.cn</link>
	<description>知识分享，共同进步。zhoumo123.cn</description>
	<lastBuildDate>Thu, 07 Nov 2019 05:53:49 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.0.1</generator>
	<item>
		<title>php mysql乱码php中文乱码解决方法总结</title>
		<link>http://zhoumo123.cn/php/3163.html</link>
		<comments>http://zhoumo123.cn/php/3163.html#comments</comments>
		<pubDate>Tue, 11 Aug 2015 02:09:55 +0000</pubDate>
		<dc:creator><![CDATA[zhangc]]></dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[php中文乱码]]></category>

		<guid isPermaLink="false">http://zhoumo123.cn/?p=3163</guid>
		<description><![CDATA[PHP中文乱码是PHP开发中的常见问题之一。PHP中文乱码有时发生在网页本身，有些产生在于MySQL交互的过程中，有时与操作系统有关。下面进行一番总结。 一．首先是PHP网页的编码 1. php文件本身的编码与网页的编码应匹配 a. 如果欲使用gb2312编码，那么php要输出头：header(“Content-Type: text/html; charset=gb2312&#8243;)，静态页面添加&#60;meta http-equiv=&#8221;Content-Type&#8221; content=&#8221;text/html; charset=gb2312&#8243;&#038;gt ...  <a href="http://zhoumo123.cn/php/3163.html">  阅读全文 </a>]]></description>
				<content:encoded><![CDATA[<p>PHP中文乱码是PHP开发中的常见问题之一。PHP中文乱码有时发生在网页本身，有些产生在于MySQL交互的过程中，有时与操作系统有关。下面进行一番总结。</p>
<p><strong>一．首先是PHP网页的编码</strong></p>
<p>1. php文件本身的编码与网页的编码应匹配</p>
<p>a. 如果欲使用gb2312编码，那么php要输出头：header(“Content-Type: text/html; charset=gb2312&#8243;)，静态页面添加&lt;meta http-equiv=&#8221;Content-Type&#8221; content=&#8221;text/html; charset=gb2312&#8243;&gt;，所有文件的编码格式为ANSI，可用记事本打开，另存为选择编码为ANSI，覆盖源文件。</p>
<p>b. 如果欲使用utf-8编码，那么php要输出头 ：header(“Content-Type: text/html; charset=utf-8&#8243;)，静态页面添加&lt;meta http-equiv=&#8221;Content-Type&#8221; content=&#8221;text/html; charset=utf-8&#8243;&gt;，所有文件的编码格式为utf-8。保存为utf-8可能会有点麻烦，一般utf-8文件开头会有BOM，如果使用 session就会出问题，可用editplus来保存，在editplus中，工具-&gt;参数选择-&gt;文件-&gt;UTF-8签名，选择总 是删除，再保存就可以去掉BOM信息了。</p>
<p>2. php本身不是Unicode的，所有substr之类的函数得改成mb_substr（需要装mbstring扩展）；或者用iconv转码。</p>
<p><strong>二．PHP与Mysql的数据交互</strong></p>
<p>PHP与数据库的编码应一致</p>
<p>1. 修改mysql配置文件my.ini或my.cnf，mysql最好用utf8编码</p>
<p>[mysql]<br />
default-character-set=utf8<br />
[mysqld]<br />
default-character-set=utf8<br />
default-storage-engine=MyISAM<br />
在[mysqld]下加入:<br />
default-collation=utf8_bin<br />
init_connect=&#8217;SET NAMES utf8&#8242;</p>
<p>2. 在需要做数据库操作的php程序前加mysql_query(&#8220;set names &#8216;编码'&#8221;);，编码和php编码一致，如果php编码是gb2312那mysql编码就是gb2312，如果是utf-8那mysql编码就是 utf8，这样插入或检索数据时就不会出现乱码了</p>
<p><strong>三．PHP与操作系统相关</strong></p>
<p>Windows和Linux的编码是不一样的，在Windows环境下，调用PHP的函数时参数如果是utf-8编码会出现错误，比如 move_uploaded_file()、filesize()、readfile()等，这些函数在处理上传、下载时经常会用到，调用时可能会出现下 面的错误:</p>
<p>Warning: move_uploaded_file()[function.move-uploaded-file]:failed to open stream: Invalid argument in &#8230;</p>
<p>Warning: move_uploaded_file()[function.move-uploaded-file]:Unable to move &#8221; to &#8221; in &#8230;</p>
<p>Warning: filesize() [function.filesize]: stat failed for &#8230; in &#8230;</p>
<p>Warning: readfile() [function.readfile]: failed to open stream: Invalid argument in ..</p>
<p>在Linux环境下用gb2312编码虽然不会出现这些错误，但保存后的文件名出现乱码导致无法读取文件，这时可先将参数转换成操作系统识别的编 码，编码转换可用mb_convert_encoding(字符串,新编码,原编码)或iconv(原编码,新编码,字符串)，这样处理后保存的文件名就 不会出现乱码，也可以正常读取文件，实现中文名称文件的上传、下载。</p>
<p>其实还有更好的解决方法，彻底与系统脱离，也就不用考虑系统是何编码。可以生成一个只有字母和数字的序列作为文件名，而将原来带有中文的名字保存在 数据库中，这样调用move_uploaded_file()就不会出现问题，下载的时候只需将文件名改为原来带有中文的名字。实现下载的代码如下</p>
<p>header(&#8220;Pragma: public&#8221;);</p>
<p>header(&#8220;Expires: 0&#8243;);</p>
<p>header(&#8220;Cache-Component: must-revalidate, post-check=0, pre-check=0&#8243;);</p>
<p>header(&#8220;Content-type: $file_type&#8221;);</p>
<p>header(&#8220;Content-Length: $file_size&#8221;);</p>
<p>header(&#8220;Content-Disposition: attachment; filename=\&#8221;$file_name\&#8221;&#8221;);</p>
<p>header(&#8220;Content-Transfer-Encoding: binary&#8221;);</p>
<p>readfile($file_path);</p>
<p>$file_type是文件的类型，$file_name是原来的名字，$file_path是保存在服务上文件的地址。</p>
<p><strong>四．再来总结一下为什么会乱码</strong></p>
<p>一般来说，乱码的出现有2种原因，首先是由于编码(charset) 设置错误，导致浏览器以错误的编码来解析，从而出现了满屏乱七八糟的“天书”，其次是文件被以错误的编码打开，然后保存，比如一个文本文件原先是 GB2312 编码的，却以UTF-8 编码打开再保存。要解决上述乱码问题，首先需要知道开发中哪些环节涉及到了编码：</p>
<p>1、文件编码：指的是页面文件(.html,.php等)本身是以何种编码来保存的。记事本和Dreamweaver 在打开页面时候会自动识别文件编码因而不太会出问题。而ZendStudio却不会自动识别编码，它只会根据首选项的配置固定以某种编码打开文件，如果工 作时候一不注意，用错误编码打开文件，做了修改之后一保存，乱码就出现了（我深有体会）。</p>
<p>2、页面申明编码：在HTML代码HEAD里面，可以用&lt;meta http-equiv=&#8221;Content-Type&#8221; content=&#8221;text/html; charset=&#8221;XXX&#8221; /&gt; 来告诉浏览器网页采用了什么编码，目前中文网站开发中XXX主要用的是GB2312和UTF-8 两种编码。</p>
<p>3、数据库连接编码：指的是进行数据库操作时候以哪种编码与数据库传输数据，这里需要注意的是不要与数据库本身的编码混淆，比如MySQL内部默认 是latin1编码，也就是说Mysql是以latin1编码来存储数据，以其他编码传输给Mysql的数据会被转换成latin1编码。<br />
知道了WEB开发中哪些地方涉及到了编码，也就知道了乱码产生的原因：上述3项编码设置不一致，由于各种编码绝大部分是兼容ASCII的，所以英文符号不会出现，中文就倒霉了。</p>
<p><strong>五．决战一些常见的错误情况与解决：</strong></p>
<p>1、数据库采用UTF8 编码，而页面申明编码是GB2312 ，这是最常见的产生乱码的原因。这时候在PHP脚本里面直接SELECT数据出来的就是乱码，需要在查询前先使用： mysql_query(&#8220;SET NAMES GBK&#8221;); 来设定MYSQL连接编码，保证页面申明编码与这里设定的连接编码一致（GBK是GB2312的扩展 ）。如果页面是UTF-8 编码的话，可以用： mysql_query(&#8220;SET NAMES UTF8&#8243;);<br />
注意是UTF8而不是一般用的UTF-8。假如页面申明的编码与数据库内部编码一致可以不设定连接编码。</p>
<p>注：事实上MYSQL的数据输入输出比上面讲的更复杂一些，MYSQL配置文件my.ini中定义了2个默认编码，分别是[client]里的 default -character-set和[mysqld] 里的default-character-set 来分别设定默认时候客户端连接和数据库内部所采用的编码。我们上面指定的编码其实是MYSQL客户端连接服务器时候的命令行参数 character_set_client，来告诉MYSQL服务器接受到的客户端数据是什么编码的，而不是采用默认编码。</p>
<p>2、页面申明编码与文件本身编码不一致，这种情况很少发生，因为如果编码不一致美工做页面时候在浏览器看到的就是乱码了。更多时候是发布以后修改一 些小BUG，以错误编码打开页面然后保存导致的。或者是用某些FTP软件直接在线修改文件，比如CuteFTP，由于软件编码配置错误而导致转换错了编 码。</p>
<p>3、一些租用虚拟主机的朋友，明明上述3项编码都设置正确了还是有乱码。比方说网页是GB2312 编码的，IE等浏览器打开却总是识别成UTF-8 ，网页HEAD里面已经申明是GB2312 了，手动修改浏览器编码为GB2312 后页面显示正常。产生原因是服务器Apache设定了服务器全局的默认编码，在httpd.conf里面加了AddDefaultCharset UTF-8 。这时候服务器会首先发送HTTP头给浏览器，其优先级比页面里申明编码高，自然浏览器就识别错了。解决办法有2个，请管理员在配置文件自己的虚机里加上 一条AddDefaultCharset GB2312 来覆盖全局配置，或者在自己目录的.htaccess里配置。</p>
<p>总结:总之一句话,要解决PHP中文乱码最好最快的解决办法就是,页面申明的编码与数据库内部编码一致,如果页面申请的页码与数据库内部编码不一致 时,就设定连接编码 ,mysql_query(&#8220;SET NAMES XXX &#8220;); XXX为连接编码.一定可以解决乱码的问题.</p>
<p>&nbsp;</p>
<p>http://www.cnblogs.com/echohao/archive/2015/08/10/4719688.html</p>
]]></content:encoded>
			<wfw:commentRss>http://zhoumo123.cn/php/3163.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
