|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
多个成员之间重复做相同的工作,很容易因为交流沟通的时候没有进行一致性的文档要求而出现不明错误,严重影响开发进度,导致在预定时间内无法完成该项目或者完成的项目跟原先计划所要实现的项目功能不符合。 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 语句,它暗示列值利用了甚么字符集)。
定位成绩经常用的技能
定位中文编码成绩凡是采取最笨的也是最无效的举措D在你以为有嫌疑的法式处置后打印字符串的内码。经由过程打印字符串的内码,你可以发明甚么时分中文字符被转换成 Unicode,甚么时分Unicode 被转回中文内码,甚么时分一个中文字成了两个 Unicode 字符,甚么时分中文字符串被转成了一串问号,甚么时分中文字符串的高位被截失落了……
取用适合的样本字符串也有助于辨别成绩的类型。如:"aa啊 aa?@aa" 等中英相间,GB、GBK特点字符均有的字符串。普通来讲,英文字符不管怎样转换或处置,都不会掉真(假如碰到了,可以测验考试着增添一连的英文字母长度)。
处理各类使用的乱码成绩
1) 利用 标签设置页面编码
这个标签的感化是声明客户真个阅读器用甚么字符集编码显示该页面,xxx 可觉得 GB2312、GBK、UTF-8(和 MySQL 分歧,MySQL 是 UTF8)等等。因而,大局部页面可以采取这类体例来告知阅读器显示这个页面的时分采取甚么编码,如许才不会形成编码毛病而发生乱码。然而有的时分咱们会发明有了这句仍是不可,不论 xxx 是哪种,阅读器采取的一直都是一种编码,这个情形我前面漫谈到。
请注重, 是属于 HTML 信息的,仅仅是一个声明,仅标明办事器已把 HTML 信息传到了阅读器。
2) header("content-type:text/html; charset=xxx");
这个函数 header() 的感化是把括号外面的信息发到 http 标头。假如括号外面的内容为文中所说那样,那感化和 标签根基不异,人人对比第一个看发明字符都差不多的。然而分歧的是假如有这段函数,阅读器就会永久采取你所请求的 xxx 编码,相对不会不听话,因而这个函数是很有效的。为何会如许呢?那就得说说 http 标头和 HTML信息的不同了:
http 标头是办事器以 http 协定传送 HTML 信息到阅读器前所送出的字串。而 标签是属于 HTML 信息的,所以 header() 发送的内容先抵达阅读器,浅显点就是 header() 的优先级高于 (不晓得可不成以如许讲)。假设一个 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")。这下就分明为何明明 设置了是 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
..
假如你是 web 法式员,建议给你的每一个页面都加个header("content-type:text/html; charset=xxx"),如许就能够包管它在任何办事器都能准确显示,可移植性也对照强。
4) php.ini 中的 default_charset 设置装备摆设:
php.ini 中的 default_charset = "gb2312" 界说了 php 的默许言语字符集。普通保举正文失落此行,让阅读器依据网页头中的 charset 来主动选择言语而非做一个强迫性的划定,如许就能够在同台办事器上供应多种言语的网页办事。
停止语
其实 php 开辟中的中文编码并没有想像的那末庞杂,固然定位息争决成绩没有定例,各类运转情况也各不尽然,但前面的道理是一样的。懂得字符集的常识是处理字符成绩的基本。不外,跟着中文字符集的变更,不单单是 php 编程,中文信息处置中的成绩仍是会存在一段工夫的。怎么配置呢 ,问最好的老实百度,问啥都有答案。所以用好搜索引擎是学好的令1个关键,程序会出各样的问题,没有1个人可能会碰到所有的问题,所有就可以问百度这个大家精华的集合了。 |
|