汉语乱码的化解措施大集,又一标题

By admin in 4858.com on 2019年6月22日

明天基本上产生了系统的编排职业,在新生的测试中发生了有的标题.
基本是有四个方面.一是由于从前的数据库中有多个外键的安装,那几个在sae上是特其他,同时自己也不再用那一个了,重新做了须臾间数据库就能够了.
另三个是难点是让自个儿特别发天性的叁个主题素材,与从前同样也是叁个thinkphp的欠缺产生的,让作者花了3-4h.
难点的展现是网页现身乱码,header()无法健康职业.最终笔者意识是TeacherAction.class.php的终极多了4个空行.
笔者不是很能明白空行与乱码,还会有header()之间的关系.
小编不精晓自身后一次是否还大概会用thinkphp了.听闻一个叫yii的是四个不利的东西.

1、版本,以3.1为主,因为手册是基于那些的,最新的本子,还未曾相应的手册

率先是PHP网页的编码

一.首先是PHP网页的编码 1. php文件本身的编码与网页的编码应拾壹分
a. 如若欲使用gb2312编码,那么php要输出头:header(“Content-Type:
text/html; charset=gb2312″),静态页面增添<meta
http-equiv=”Content-Type” content=”text/html;
charset=gb2312″>,全体文件的编码格式为ANSI,可用记事本展开,另存为选用编码为ANSI,覆盖源文件。
b. 即便欲使用utf-8编码,那么php要输出头:header(“Content-Type:
text/html; charset=utf-8″),静态页面增加<meta
http-equiv=”Content-Type” content=”text/html;
charset=utf-8″>,全部文件的编码格式为utf-8。保存为utf-8或然会略微麻烦,一般utf-8文件初步会有BOM,如若选拔session就能够出标题,可用editplus来保存,在editplus中,工具->参数选拔->文件->UTF-8具名,选用总是删除,再保存就能够去掉BOM新闻了。
2.
php本人不是Unicode的,全体substr之类的函数得改成mb_substr(需要装mbstring扩展);或者用iconv转码。
二.PHP与Mysql的数目交互 PHP与数据库的编码应一律


 

1.    
php教程文件本身的编码与网页的编码应极度

  1. 修改mysql配置文件my.ini或my.cnf,mysql最佳用utf8编码
    [mysql]
    default-character-set=utf8
    [mysqld]
    default-character-set=utf8
    default-storage-engine=MyISAM
    在[mysqld]下加入:
    default-collation=utf8_bin
    init_connect=’SET NAMES utf8′
  2. 在急需做数据库操作的php程序前加mysql_query(”set names
    ‘编码’”);,编码和php编码一致,假设php编码是gb2312那mysql编码正是gb2312,假若是utf-8那mysql编码即是utf8,那样插入或索求数据时就不会现身乱码了
    三.PHP与操作系统相关
    Windows和Linux的编码是不等同的,在Windows情况下,调用PHP的函数时参数假诺是utf-8编码见面世错误,比如move_uploaded_file()、filesize()、readfile()等,那个函数在管理上传、下载时平常会用到,调用时只怕会出现上边包车型大巴失实:
    Warning: move_uploaded_file()[function.move-uploaded-file]:failed to
    open stream: Invalid argument in …
    Warning: move_uploaded_file()[function.move-uploaded-file]:Unable to
    move ” to ” in …
    Warning: filesize() [function.filesize]: stat failed for … in …
    Warning: readfile() [function.readfile]: failed to open stream:
    Invalid argument in ..
    在Linux情况下用gb2312编码纵然不会现出这一个不当,但保留后的文件名出现乱码导致力不从心读取文件,那时可先将参数转变到操作系统识别的编码,编码转变可用mb_汉语乱码的化解措施大集,又一标题。convert_encoding(字符串,新编码,原编码)或iconv(原编码,新编码,字符串),这样管理后保存的文件名就不会现出乱码,也可以符合规律读取文件,达成汉语名称文件的上传、下载。
    骨子里还应该有越来越好的消除形式,通透到底与系统脱离,也就绝不思量系统是何编码。能够生成二个唯有字母和数字的体系作为文件名,而将本来带有粤语的名字保存在数据库中,那样调用move_uploaded_file()就不会并发难点,下载的时候只需将文件名改为本来带有普通话的名字。达成下载的代码如下
    header(”Pragma: public”);
    header(”Expires: 0″);
    header(”Cache-Component: must-revalidate, post-check=0, pre-check=0″);
    header(”Content-type: $file_type”);
    header(”Content-Length: $file_size”);
    header(”Content-Disposition: attachment; filename=\”$file_name\””);
    header(”Content-Transfer-Encoding: binary”);
    readfile($file_path);
    $file_type是文本的花色,$file_name是原先的名字,$file_path是保留在劳务上文件的地方。
    四.再来总括一下为啥会乱码
    相似的话,乱码的出现有2种原因,首先是由于编码(charset)设置错误,导致浏览器以错误的编码来深入分析,从而现身了满屏杂乱无章的“天书”,其次是文件被以错误的编码张开,然后保留,举例贰个文本文件原先是GB2312编码的,却以UTF-8编码展开再保存。要解决上述乱码难题,首先供给精晓开垦中怎么着环节涉及到了编码:
    1、文件编码:指的是页面文件(.html,.php等)本人是以何种编码来保存的。记事本和Dreamweaver
    在开拓页面时候会自动识别文件编码由此不太会出标题。而ZendStudio却不会自动识别编码,它只会基于首荐项的陈设定位以某种编码张开文件,假设职业时候一不注意,用错误编码伸开文件,做了改换之后一保存,乱码就涌出了(小编深有体会)。
    2、页面证明编码:在HTML代码HEAD里面,能够用<meta
    http-equiv=”Content-Type” content=”text/html; charset=”XXX”
    />来报告浏览器网页采取了何等编码,这段日子粤语网址支付中XXX主要用的是GB2312和UTF-8二种编码。
    3、数据库连接编码:指的是进展数据库操作时候以哪个种类编码与数据库传输数据,这里必要留意的是永不与数据库自身的编码混淆,比方MySQL内部暗中认可是latin1编码,也正是说Mysql是以latin1编码来囤积数据,以其余编码传输给Mysql的数据会被调换到latin1编码。
    领会了WEB开垦中哪些地点涉及到了编码,也就知道了乱码发生的缘故:上述3项编码设置差别等,由于种种编码绝大多数是包容ASCII的,所以英文符号不会师世,中文就命途多舛了。
    五.决战一些科学普及的谬误情形与消除: 1、数据库选用UTF8编码,而页面评释编码是GB2312,这是最广大的产生乱码的由来。那时候在PHP脚本里面一直SELECT数据出来的正是乱码,供给在查询前先利用:
    mysql_query(”SET NAMES GBK”);
    来设定MYSQL连接编码,保障页面评释编码与这里设定的连日编码一致(GBK是GB2312的恢弘)。即便页面是UTF-8编码的话,能够用:
    mysql_query(”SET NAMES UTF8″);
    在意是UTF8而不是形似用的UTF-8。若是页面阐明的编码与数据库内部编码一致方可不设定连接编码。
    注:事实上MYSQL的数量输入输出比上边讲的更复杂一些,MYSQL配置文件my.ini中定义了2个默许编码,分别是[client]里的default
    -character-set和[mysqld]里的default-character-set来分别设定私下认可时候客户端连接和数据库内部所利用的编码。我们地点点名的编码其实是MYSQL客户端连接服务器时候的命令行参数character_set_client,来告诉MYSQL服务器接受到的客户端数据是什么样编码的,而不是使用默许编码。
    2、页面表明编码与公事自己编码分裂样,这种情状相当的少爆发,因为只要编码不等同美术工作做页面时候在浏览器看到的正是乱码了。越来越多时候是公布之后修改部分小BUG,以错误编码展开页面然后保留导致的。大概是用某个FTP软件直接在线修改文件,例如CuteFTP,由于软件编码配置错误而导致调换错了编码。
    3、一些租用虚拟主机的相恋的人,明明上述3项编码都安装科学了照旧有乱码。举例说网页是GB2312编码的,IE等浏览器张开却接连识别成UTF-8,网页HEAD里面已经表明是GB2312了,手动修改浏览器编码为GB2312
    后页面展现平常。发生原因是服务器Apache设定了服务器全局的默许编码,在httpd.conf里面加了AddDefaultCharset
    UTF-8。那时候服务器会率首发送HTTP头给浏览器,其事先级比页面里阐明编码高,自然浏览器就识别错了。消除办法有2个,请管理员在布局文件自个儿的虚机里拉长一条AddDefaultCharset
    GB2312来覆盖全局配置,也许在温馨目录的.htaccess里布署。

2、开掘二个难点,echo 国语时,出现乱码,而调用模版则不荒谬。

a.     借使欲使用gb2312编码,那么php要输出头:header(“Content-Type:
text/html; charset=gb2312″),静态页面增多<meta
http-equiv=”Content-Type” content=”text/html;
charset=gb2312″>,全部文件的编码格式为ANSI,可用记事本张开,另存为采取编码为ANSI,覆盖源文件。

总计:总之一句话,要缓和PHP汉语乱码最佳最快的消除办法便是,页面阐明的编码与数据库内部编码一致,如若页面申请的页码与数据库内部编码分歧时,就设定连接编码,mysql_query(”SET
NAMES XXX”); XXX为总是编码.一定能够减轻乱码的难题.

 

b.     若是欲使用utf-8编码,那么php要输出头:header(“Content-Type:
text/html; charset=utf-8″),静态页面增加<meta
http-equiv=”Content-Type” content=”text/html;
charset=utf-8″>,全体文件的编码格式为utf-8。保存为utf-8也许会稍稍辛劳,一般utf-8文件起始会有BOM,固然利用session就能够出难点,可用editplus来保存,在editplus中,工具->参数采用->文件->UTF-8具名,选用总是删除,再保存就足以去掉BOM音信了。

你或者感兴趣的稿子:

  • MySQL字符集 GBK、GB2312、UTF8分消除决MYSQL汉语乱码难题
  • mysql query
    browser普通话乱码的缓和办法
  • 在PHP中PDO解决中文乱码难点的一部分补给
  • php
    url地址栏传中文乱码消除办法集合
  • 实战mysql导出中文乱码及phpmyadmin导入中文乱码的化解措施
  • 到家化解PHP汉语乱码
  • php PDO普通话乱码消除办法
  • mysql 普通话乱码
    消除方法集锦
  • PHP
    Ajax普通话乱码难点解决方法
  • 小结下MySQL汉语乱码,phpmyadmin乱码,php乱码
    发生原因及其化解办法
  • MySQL汉语乱码难题的减轻
  • PHP+MySQL5.0中文乱码消除办法
  • mysql导入导出数据中文乱码消除办法小结

3、写url的令人瞩目分寸写。index和Index是区别的

2.    
php本身不是Unicode的,全体substr之类的函数得改成mb_substr(需要装mbstring扩展);或者用iconv转码。

 

二.         PHP与Mysql的数量交互

 

PHP与数据库教程的编码应同等

为了学习thinkphp

1.    
修改mysql教程配置文件my.ini或my.cnf,mysql最佳用utf8编码

此地结合和讯的阳台进行操作

[mysql]
default-character-set=utf8
[mysqld]
default-character-set=utf8
default-storage-engine=MyISAM
在[mysqld]下加入:
default-collation=utf8_bin
init_connect=’SET NAMES utf8′

 

2.     在供给做数据库操作的php程序前加mysql_query(“set names
‘编码'”);,编码和php编码一致,借使php编码是gb2312那mysql编码就是gb2312,假设是utf-8那mysql编码正是utf8,那样插入或探究数据时就不会并发乱码了

中期是应用thinkphp做一个官方网站,因而这里必要先做三个小卖部网址的例子

三.         PHP与操作系统相关

 

 

        
Windows和Linux的编码是差别的,在Windows情况下,调用PHP的函数时参数假设是utf-8编码会现身错误,比如move_uploaded_file()、filesize()、readfile()等,那一个函数在管理上传、下载时日常会用到,调用时大概会并发上面包车型地铁谬误:

Warning: move_uploaded_file()[function.move-uploaded-file]:failed
to open stream: Invalid argument in …

Warning: move_uploaded_file()[function.move-uploaded-file]:Unable
to move ” to ” in …

Warning: filesize() [function.filesize]: stat failed for … in …

Warning: readfile() [function.readfile]: failed to open stream:
Invalid argument in ..

这里先达成三个铺面网址的首页

    
在Linux蒙受下用gb2312编码即使不会现出这几个错误,但保留后的文书名出现乱码导致力不从心读取文件,那时可先将参数转变来操作系统识其余编码,编码调换可用mb_convert_encoding(字符串,新编码,原编码)或iconv(原编码,新编码,字符串),那样管理后保存的文书名就不会冒出乱码,也能够平日读取文件,完结普通话名称文件的上传、下载。

 

   
其实还会有越来越好的消除方法,彻底与系统脱离,也就不要思索系统是何编码。能够生成贰个只有字母和数字的队列作为文件名,而将原先带有汉语的名字保存在数据库中,那样调用move_uploaded_file()就不会出现难点,下载的时候只需将文件名改为本来带有汉语的名字。完毕下载的代码如下

珍视模仿 山东皖讯的功能

header(“Pragma: public”);

header(“Expires: 0”);

header(“Cache-Component: must-revalidate, post-check=0, pre-check=0”);

header(“Content-type: $file_type”);

header(“Content-Length: $file_size”);

       header(“Content-Disposition: attachment;
filename=”$file_name””);

header(“Content-Transfer-Encoding: binary”);

readfile($file_path);  

 

$file_type是文件的品类,$file_name是原来的名字,$file_path是保存在服务上文件的地址

此地先依旧写一个对准数据库的增加和删除改查
则模仿官方网址,因为官方网址偏于前端的意义,与thinkphp没多大关系

php文件与静态网页的编码要一致。

 

1.使用utf-8编码的时候,php文件在具备出口以前拉长:

欣逢五个发烧的,最新的版本是3.3。当时看的是3.1 后来用真的是3.2

header(“Content-Type: text/html; charset=utf-8″);
静态页面增加:
<meta http-equiv=”Content-Type” content=”text/html;
charset=utf-8″>。

 

富有文件的编码格式为utf-8。保存为utf-8恐怕会稍为艰辛,类似WINDOWS自带的记事本等软件,在保存叁个以UTF-8编码的文本时,会在文书开端的地点插入三个不可见的字符(0xEF
0xBB 0xBF,即BOM——Byte Order
马克)。它是一串隐藏的字符,用于让记事本等编辑器度和胆识别这一个文件是还是不是以UTF-8编码。对于一般的文本,那样并不会时有发生什么样麻烦。

意识:使用zendstudio
时,thinkphp报错,但不影响使用,那是因为IDE远远不足智能,不能够识别thinkphp的语法

但对此
PHP来讲,PHP在设计时就从未有过设想BOM的题目,不会忽略UTF-8编码的公文起头BOM的这七个字符,会把BOM作为该文件初叶正文的一某些。由于必须在<?恐怕<?php前面的代码才会作为PHP代码实行,所以将会促成在页面上输出这两个字符,显示效果将在看浏览器了,一般是二个空行或是三个乱码。由于受CEOKIE送出机制的限量,在这几个文件开端已经有BOM的文本中,老董KIE无法送出(因为在
高管KIE送出前PHP已经送出了文本头),所以登陆和公布功效失效。一切正视COOKIE、SESSION完毕的成效全体空头。
可用Em艾德itor来保存,在Em艾德itor中,另存为->去掉unicode具名(BOM)前的勾,再保存就足以去掉BOM新闻了。

 

2.利用gb2312编码,php文件在具备出口在此之前增加:

二〇一六.07.11 注意引进js与css的门路难题。 不要写相对路线,直接利用模版变量
 __PUBLIC__ 

header(“Content-Type: text/html; charset=gb2312″),
页面增添
<meta http-equiv=”Content-Type” content=”text/html;
charset=gb2312″>

只要使用./public/那样的艺术,会促成url变化的时候,出现js,css
不可能符合规律引进

有着文件的编码格式为ANSI。

 

二.PHP与数据库的编码应一律
以Mysql数据库为例,在急需做数据库操作的php程序前加mysql_query(“set
names ‘xx'”);,如若php编码是gb2312那xx正是gb2312,要是是utf-8那xx正是utf8(是utf8 而不是utf-8),那样操作数据时就不会油但是生乱码了。

 

其它mysql最棒用utf8编码,修改mysql配置文件 my.ini或my.cnf

模型的命名必须和数据库的表名要一律,不然导致 自动实现与活动验证
不能执行

[mysql]
default-character-set=utf8
[mysqld]
default-character-set=utf8
default-storage-engine=MyISAM

在 [mysqld]下加入:
default-collation=utf8_bin
init_connect=’SET NAMES utf8′

数据库的评说表 为comments 而模型 小编用了comment  二者差三个字符s

echo输出的中文显示成乱码,
实质上应当是各样服务器脚本都会遇上那个难点,
常有如故编码难题,
一般的话出于编码包容思索多数的页面都将页面字符集定义为utf-8

 

<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″
/>
那儿要健康展现中文须求转接一下编码格局,比如
echo iconv(“GB2312″,”UTF-8”,’汉语’);就不会乱码了
还恐怕有其余艺术,比方
在php的echo后边参与header(“Content-Type:text/html;charset=gb2312”);
本来简体普通话页面也得以干脆地,
把<meta http-equiv=”Content-Type” content=”text/html;
charset=UTF-8″ />中的UTF-8改成gb2312

以至一贯有不当,那是二个血的教训

 
其实中遇见奇异的场所,
在本机服务器上健康展现的页面,传上服务器就echo出来乱码,
没仔细雕刻过这一个缘故,因为经过iconv函数GB2312、UTF-8换换个方式置再一次编码下就不奇怪了,
然则猜测一定是APACHE,更确切说是PHP服务端的装置差异产生的,
探访PHP.INI应该就能够减轻

 

 

 

再来总结一下为何会乱码

2015.07.11 在出口2个结实集时,使用了voilist标签

貌似的话,乱码的现身有2种原因,首先是由于编码(charset)
设置错误,导致浏览器以错误的编码来分析,从而出现了满屏杂乱无章的“天书”,其次是文本被以错误的编码展开,然后保留,比方贰个文书文件原先是GB2312
编码的,却以UTF-8
编码打开再保存。要消除上述乱码难题,首先需求理解开荒中什么环节涉嫌到了编码:

标签的属性 选取了 name=”{$data[‘comments’]}” 一贯报错,不能够实践

1、文件编码:指的是页面文件(.html,.php等)本人是以何种编码来保存的。记事本和Dreamweaver
在开拓页面时候会自动识别文件编码由此不太会出标题。而ZendStudio却不会自动识别编码,它只会基于首要推荐项的安插定位以某种编码张开文件,假设专门的学问时候一不注意,用错误编码展开文件,做了改动之后一保存,乱码就应际而生了(作者深有体会)。

 

2、页面申明编码:在HTML代码HEAD里面,能够用<meta
http-equiv=”Content-Type” content=”text/html; charset=”XXX” />
来告诉浏览器网页接纳了如何编码,方今华语网站开辟中XXX首要用的是GB2312和UTF-8
三种编码。

修改为 name=”data[‘comments’]”后正常

3、数据库连接编码:指的是张开数据库操作时候以哪一种编码与数据库传输数据,这里供给小心的是决不与数据库本人的编码混淆,举个例子MySQL内部暗许是latin1编码,也正是说Mysql是以latin1编码来囤积数据,以其余编码传输给Mysql的数额会被转换到latin1编码。
知晓了WEB开辟中哪些地点涉及到了编码,也就知晓了乱码产生的原故:上述3项编码设置不同,由于各类编码绝超过二分一是包容ASCII的,所以英文符号不会产出,中文就命途多舛了。

 

 

那点要那些专注

<html>
<head>
<title></title>
</head>
<body>
<?php
$mysql_server_name=’localhost’;
$mysql_username=’root’;
$mysql_password=’000000′;
$mysql_database=’lib’;
$conn=mysql_connect($mysql_server_name,$mysql_username,$mysql_password,$mysql_database);
$sql=”select name,age from
mytb”;
print($conn);
$rs=mysql_db_query(“lib”,”select * from mytb”,$conn);
print(“
<br>”);
while($row = mysql_fetch_object($rs)){
print ($row->name.”:”.$row->age.”<br>”);
}
mysql_close($conn);
?>

 

  呈现如下:

 

Resource id #1
dd:54
ddd:8
??:15
???:25
??:32
4858.com,  mysql编码:utf8,GBK都试过了。mysql font 和命令行显示都毋庸置疑。

2014.07.11

  难题补充:

<include file=”Common:header” />

  乱码:

行使了该标签。有利于页面包车型地铁轻易化

???:15
???:25
??:32
  这几行,数据Curry的值是汉字.展现出来的是问号.

 

  化解办法:

2014.07.13

  在$rs=mysql_db_query(“lib”,”select * from mytb”,$conn);

察觉thinkphp能够自动发出目录,在输入文件中写入

  后边加上

//define(‘BIND_MODULE’,’Admin’); 就可以发生Admin模块

  mysql_query(“set names gb2312”);或者mysql_query(“set names gbk”);

 

 

 

五.决战一些宽广的荒唐情形与减轻:

 

1、数据库选取UTF8 编码,而页面申明编码是GB2312
,这是最广大的产生乱码的原由。这时候在PHP脚本里面一贯SELECT数据出来的就是乱码,必要在询问前先使用:
mysql_query(“SET NAMES GBK”);
来设定MYSQL连接编码,保险页面声明编码与这里设定的连天编码一致(GBK是GB2312的扩大)。假使页面是UTF-8 编码的话,可以用: mysql_query(“SET NAMES UTF8”);
只顾是UTF8而不是一般用的UTF-8。纵然页面证明的编码与数据库内部编码一致方可不设定连接编码。

 

注:事实上MYSQL的数据输入输出比地点讲的更扑朔迷离一些,MYSQL配置文件my.ini中定义了2个私下认可编码,分别是[client]里的default
-character-set和[mysqld] 里的default-character-set
来分别设定默许时候客户端连接和数据库内部所运用的编码。我们地点点名的编码其实是MYSQL客户端连接服务器时候的命令行参数character_set_client,来告诉MYSQL服务器接受到的客户端数据是什么样编码的,而不是选拔私下认可编码。

 

2、页面证明编码与公事自己编码不相同,这种情状不多产生,因为如果编码不雷同美术职业做页面时候在浏览器看到的就是乱码了。越来越多时候是发布之后修改部分小BUG,以错误编码张开页面然后保留导致的。只怕是用一些FTP软件间接在线修改文件,比如CuteFTP,由于软件编码配置错误而致使调换错了编码。

 

3、一些租用虚拟主机的仇敌,明明上述3项编码都安装科学了还是有乱码。譬喻说网页是GB2312
编码的,IE等浏览器张开却总是识别成UTF-8 ,网页HEAD里面早就申明是GB2312
了,手动修改浏览器编码为GB2312
后页面显示平常。产生原因是服务器Apache设定了服务器全局的默许编码,在httpd.conf里面加了AddDefaultCharset
UTF-8
。那时候服务器会率头阵送HTTP头给浏览器,其优先级比页面里声明编码高,自然浏览器就识别错了。消除办法有2个,请管理员在布局文件自个儿的虚机里增加一条AddDefaultCharset
GB2312 来掩盖全局配置,只怕在友好目录的.htaccess里布署。

 

 


发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有