首页 > 新闻动态 >  

新闻动态
NEWS

解析php开辟中的中文编码题目

添加时间:2013-8-9 点击量:

其实php开辟中的中文编码并没有想像的那么错杂,固然定位和解决题目没有定规,各类运行景象也各不尽然,但后面的道理是一样的。懂得字符集的常识是解决字符题目的根蒂根基


PHP法度设计中中文编码题目曾经困扰很多人,导致这个题目的原因其实很简单,每个国度(或区域)都规定了策画机信息互换用的字符编码集,如美国的扩大 ASCII 码, 中国的 GB2312-80,日本的 JIS 等。作为该国度/区域内信息处理惩罚的根蒂根基,字符编码集起着同一编码的首要感化。字符编码集按长度分为 SBCS(单字节字符集),DBCS(双字节字符集)两大类。早期的软件(尤其是操纵体系),为懂得决本地字符信息的策画机处理惩罚,呈现了各类本地化版本(L10N),为了区分,引进了 LANG, Codepage 等概念。然则因为各个本地字符集代码局限重叠,彼此间信息互换艰苦;软件各个本地化版本自力保护本钱较高。是以有须要将本地化工作中的共性抽取出来,作一致处理惩罚,将特此外本地化处理惩罚内容降落到起码。这也就是所谓的国际化(118N)。各类说话信息被进一步规范为 Locale 信息。处理惩罚的底层字符集变成了几乎包含了所有字形的 Unicode。


如今大项目组具有国际化特点的软件核心字符处理惩罚都是以 Unicode 为根蒂根基的,在软件运行时按照当时的ocale/Lang/Codepage 设置断定响应的本地字符编码设置,并依此处理惩罚本地字符。在处理惩罚过程中须要实现 Unicode 和本地字符集的彼此转换,甚或以 Unicode 为中心的两个不合本地字符集的彼此转换。这种体式格式在收集景象下被进一步延长,任何收集两端的字符信息也须要按照字符集的设置转换成可接管的内容。


数据库中的字符集编码题目
风行的关系数据库体系都支撑数据库字符集编码,也就是说在创建数据库时可以指定它本身的字符集设置,数据库的数据以指定的编码情势存储。当应用法度接见数据时,在进口和出口处都邑有字符集编码的转换。对于中文数据,数据库字符编码的设置该当包管数据的完全性。GB2312、GBK、UTF-8 等都是可选的数据库字符集编码;当然我们也可以选择 ISO8859-1 (8-bit),只是我们得在应


用法度写数据之前先将 16Bit 的一个汉字或 Unicode 拆分成两个 8-bit 的字符,读数据之后也须要将两个字节归并起来,同时还要判别此中的 SBCS 字符,是以我们并不推荐采取 ISO8859-1 作为数据库字符集编码。如许不单没有充沛哄骗数据库自身的字符集编码支撑,并且同时也增长了编程的错杂度。编程时,可以先用数据库经管体系供给的经管功能搜检此中的中文数据是否正确。


PHP 法度在查询数据库之前,起首履行 mysql_query(SET NAMES xxxx); 此中 xxxx 是你网页的编码(charset=xxxx),若是网页中 charset=utf8,则 xxxx=utf8,若是网页中 charset=gb2312,则xxxx=gb2312,几乎所有 WEB 法度,都有一段连接数据库的公共代码,放在一个文件里,在这文件里,参加 mysql_query(SET NAMES xxxx) 就可以了。


SET NAMES 显示客户端发送的 SQL 语句中应用什么字符集。是以,SET NAMES utf-8 语句告诉办事器“将来从这个客户端传来的信息采取字符集 utf-8”。它还为办事器发送回客户端的成果指定了字符集(例如,若是你应用一个 SELECT 语句,它默示列值应用了什么字符集)。


定位题目时常用的技能
定位中文编码题目凡是采取最笨的也是有效的办法―在你认为有嫌疑的法度处理惩罚后打印字符串的内码。经由过程打印字符串的内码,你可以发明什么时辰中文字符被转换成 Unicode,什么时辰Unicode 被转回中文内码,什么时辰一个中文字成了两个 Unicode 字符,什么时辰中文字符串被转成了一串问号,什么时辰中文字符串的高位被截掉了……


取用合适的样本字符串也有助于区分题目的类型。如:aa啊 aa?@aa 等中英相间,GB、GBK特点字符均有的字符串。一般来说,英文字符无论怎么转换或处理惩罚,都不会失真(若是碰到了,可以测验测验着增长连气儿的英文字母长度)。


解决各类应用的乱码题目


1) 应用<meta http-equiv=content-type content=text/html;charset=xxx>标签设置页面编码
这个标签的感化是声明客户端的浏览器用什么字符集编码显示该页面,xxx 可认为 GB2312、GBK、UTF-8(和 MySQL 不合,MySQL 是 UTF8)等等。是以,大项目组页面可以采取这种体式格式来告诉浏览器显示这个页面的时辰采取什么编码,如许才不会造成编码错误而产生乱码。然则有的时辰我们会发明有了这句还是不可,不管 xxx 是哪一种,浏览器采取的始终都是一种编码,这个景象我后面闲谈到。


请重视<meta>是属于 HTML 信息的,仅仅是一个声明,仅注解办事器已经把 HTML 信息传到了浏览器。


2) header(content-type:text/html; charset=xxx);
这个函数 header() 的感化是把括号里面的信息发到 http 标头。若是括号里面的内容为文中所说那样,那感化和 标签基同,大师对比第一个看发明字符都差不久不多的。然则不合的是若是有这段函数,浏览器就会永远采取你所请求的 xxx 编码,绝对不会不听话,是以这个函数是很有效的。为什么会如许呢?那就得说说 http 标头和 HTML信息的差别了:


http 标头是办事器以 http 和谈传送 HTML 信息到浏览器前所送出的字串。而 标签是属于 HTML 信息的,所以 header() 发送的内容先达到浏览器,通俗点就是 header() 的优先级高于<meta> (不知道可不成以如许讲)。假如一个 php 页面既有header(content-type:text/html;charset=xxx),又有,浏览器就只认前者 http 标头而不认 meta 了。当然这个函数只能在 php 页面内应用。


同样也留有一个题目,为什么前者就绝对起感化,而后者有时辰就不可呢?这就是接下来要谈的Apache 的原因了。


3) AddDefaultCharset
Apache 根目次的 conf 文件夹里,有全部 Apache 的设备文档 httpd.conf。


用文本编辑器打开 httpd.conf,第 708 行(不合版本可能不合)有 AddDefaultCharset xxx,xxx为编码名称。这行代码的意思:设置全部办事器内的网页文件 http 标头里的字符集为你默认的 xxx字符集。有这行,就相当于给每个文件都加了一行 header(content-type:text/html; charset=xxx)。这下就熟悉打听为什么明明<meta>设置了是 utf-8,可浏览器始终采取 gb2312 的原因。


若是网页里有 header(content-type:text/html; charset=xxx),就把默认的字符集改为你设置的字符集,所以这个函数永远有效。若是把 AddDefaultCharset xxx 前面加个#,注释掉这句,并且页面里不含 header(content-type…),那这个时辰就轮到 meta 标签起感化了。


下面列出以上的优先次序:
.. header(content-type:text/html; charset=xxx)
.. AddDefaultCharset xxx
.. <meta http-equiv=content-type content=text/html;charset=xxx>


若是你是 web 法度员,建议给你的每个页面都加个header(content-type:text/html;charset=xxx),如许就可以包管它在任何办事器都能正确显示,可移植性也斗劲强。


4) php.ini 中的 default_charset 设备:
php.ini 中的 default_charset = gb2312 定义了 php 的默认说话字符集。一般推荐注释掉此行,让浏览器按照网页头中的 charset 来主动选择说话而非做一个强迫性的规定,如许就可以在同台办事器上供给多种说话的网页办事。


停止语
其实php开辟中的中文编码并没有想像的那么错杂,固然定位和解决题目没有定规,各类运行景象也各不尽然,但后面的道理是一样的。懂得字符集的常识是解决字符题目的根蒂根基。不过,跟着中文字符集的变更,不仅仅是 php 编程,中文信息处理惩罚中的题目还是会存在一段时候的。
有关php编码的更多内容,请参考如下文章:


php数组编码转换的办法参考
php获取字符串的编码格局的函数
PHP字符串编码题目解析
php实现utf-8和GB2312编码彼此转换
php进行GB2312与UTF8编码转换的代码
php编码转换函数mb_convert_encoding与iconv应用申明

原来,再大的房子,再大的床,没有相爱的人陪伴,都只是冰冷的物质。而如果身边有爱人陪伴,即使房子小,床小,也觉得无关紧要,因为这些物质上面有了爱的温度,成了家的元素。—— 何珞《婚房》#书摘#
分享到: