仓酷云

标题: PHP编程:技能文章:UTF8下的中文PHP编程 [打印本页]

作者: 老尸    时间: 2015-2-3 23:58
标题: PHP编程:技能文章:UTF8下的中文PHP编程
咱们就开始学习动态语言的概念吧,刚一接触动态语言,可能很多人都会蒙了,怎么这乱七八糟的东西,在网页里显示的时候却是另外一码事?其实这并不算乱七八糟,你写的HTML代码不也一样是一堆堆的字符吗?毕竟,代码并不是作为直接输出的,而是经过处理的,说白了,HTML是经过HTML解析器,而PHP当然也就通过PHP解析器了,跟学习HTML一样的道理,想让任何的解析器完成操作,就必须使用它们专用的语法结构,所以PHP长相奇怪也就不足为奇了。   媒介:
说假话,
凉鞋也感觉 UTF8 是好器材……
究竟同屏显示中日韩对东亚人的吸引力是不小的……
(固然优点不但是这点啦……)
不但是网页程式……
良多使用程式的内核都入手下手利用 Unicode 编码……
目标是不言而喻的:增援多言语显示……
微软的一切软体都是 Unicode 内核……
所以日文软体拿到你的中文 XP 上是可以正常显示的……
而中文 98 就会由于 GB 内核装置其他言语软体时形成乱码……
至于 UTF8 ,
可以说是 Unicode 的一个分支,
它用三个字节保留一个汉字……
(Unicode 用四个字节)
使用软体都个人投靠 Unicode 了……
就不答应咱们弄网页程式的用 UTF8?
本文中凉鞋就尽可能多方位引见一下 UTF8 编码下的 PHP 编程……
至于为何独自引见“中文”……
一来是由于英文这玩意其实不需求思索 UTF8 ……
除非你筹办做多言语体系……
(我要发些怨言:如今的老外写程式时基本不正视这个成绩……)
二来是中日韩等多字节语系在 UTF8 编码下的处置体例其实迥然不同……
依葫芦画瓢便可……
好……先从数据库处置局部入手下手吧……

==========================================
毗连数据库
良多人刚晋级到 Mysql 4.1 时会发明数据乱失落了……
实际上是由于 Mysql 从 4.1 入手下手增援字符集了……
并且默许字符集恰是 UTF8 ……
(充实证实与国际接轨的主要性…… 嘿嘿……)
而之前咱们大多利用 utf8 或是 GBK 编码……
如许以来输入的数据固然是乱码……
要处理乱码……
就得让法式晓得该获得甚么编码的数据……
咱们假定你之前的数据库是 utf8 编码的……
那末你可以在查询前添加一句
mysql_query('SET CHARACTER SET utf8') or die("Query failed : " . mysql_error());
固然,因为 4.1 以上才需求如许处置,
因而咱们可以加上判别:
$mysqlversion = $db->query_first("SELECT VERSION() AS version");
if ($mysqlversion['version'] >= '4.1')
{
mysql_query('SET CHARACTER SET utf8') or die("Query failed : " . mysql_error());
}
如许以来不论 Mysql 默许编码是甚么都可以正常存取了……
(不管您是存活期,仍是存按期,乃至是零存整取都没有成绩鸟……)
然而,人家都国际化鸟……
您还在用 utf8 行么?
若何转码呢?
还有……
数据晋级时呈现乱码怎样办?
凉拌!
且听下回分化……
============================================
数据晋级至 4.1
要晋级……
就得先导出……
要说老外还真不担任……
之前的导出体例老是弄丢一些中文字符……
好比把“我爱你娘”弄成“我爱你”啦……
(凡是是丧失一段数据最末尾的字)
全部儿差了一辈儿……
(用石榴姐的话说就是“这么离经叛道的现实在是太安慰了”……)
为了回护您懦弱的心脏……
也为了保护中国传统伦理道义……
您可以把数据包括中文字符的字段改成二进制(Binary)编码……
详细办法嘛……
可以运转这个语句:
ALTER TABLE `表名` CONVERT TO CHARACTER SET binary;
如许,那些字符类型字段,如:
CHAR、VARCHAR 和 TEXT
将转换为
BINARY、VARBINARY 和 BLOB
然后再导出并导入到 4.1 情况中……
固然,最初一项繁琐的任务是:
你需求把它们的类型再改回来……
有往 4.1 晋级的……
固然也有往下落级的……
怎样升级???
凉鞋去上个茅厕……
而您请翻下页……
=============================================
数据从 4.1 升级
有人发明从4.1导出的 SQL 文件没法导入低版本法式……
成绩其实很复杂……
并且 Mysql 已为咱们想好了一切……
导出时请添加 Ccompatible 参数……
咱们假定您的数据库是 utf8 编码的……
并且方针数据库版本为 4.0 ……
那末号令行下这么写:
shell>mysqldump --user=username --password=password --compatible=mysql40 --default-character-set=utf8 database > db.sql
如许导出的 SQL 文件就可以够顺遂导入低版本数据库了……
数据库局部算是弄定了……
但 PHP 编程方面要若何注重呢?
还得劳您翻下页……
http://www.knowsky.com
=============================================
PHP 文件编码
是不是一切 PHP 文件都必需转成 UTF8 编码呢?
凉鞋告知您是 NO ……
这么说吧……
假如文件中包括需求显示出来的中文字符……
就应当转为 UTF8 编码……
举例子吧:
// 我是凉鞋
echo time();
下面的代码虽有代码……
然而因为存在于正文中……
不会输入……
所以这个页面可以不必转换为 UTF8 格局……
再如:
echo "我是凉鞋";
这个分明有中文字符输入……
您仍是老厚道实转换为 UTF8 吧……
固然如今良多程式都采取模板(言语包)手艺……
程式(非言语包文件)里是看不就任何供输入的字符的……
如许以来咱们只需求将言语包文件转成 UTF8 编码便可……
(言语包的优势就在这里啊…… 啊哈哈哈哈哈……)
'http://www.knowsky.com
==================================================
UTF8 中文截取
因为 UTF8 利用三个字节……
所以传统的 substr 函数就没辙了……
良多高手都写了 UTF8 中文字符截取函数……
这里奉上几种:
1.先算再取
/**
* Author : Dummy | Zandy
* Email : lianxiwoo@gmail.com | hotmail.com
* Create : 200512
* Usage : echo join('', String::subString_UTF8('汉字', 0, 1));
*/
ini_set('display_errors', 1);
error_reporting(E_ALL ^ E_NOTICE);
class String {
function subString_UTF8($str, $start, $lenth)
{
$len = strlen($str);
$r = array();
$n = 0;
$m = 0;
for($i = 0; $i < $len; $i++) {
$x = substr($str, $i, 1);
$a = base_convert(ord($x), 10, 2);
$a = substr('00000000'.$a, -8);
if ($n < $start){
if (substr($a, 0, 1) == 0) {
}elseif (substr($a, 0, 3) == 110) {
$i += 1;
}elseif (substr($a, 0, 4) == 1110) {
$i += 2;
}
$n++;
}else{
if (substr($a, 0, 1) == 0) {
$r[] = substr($str, $i, 1);
}elseif (substr($a, 0, 3) == 110) {
$r[] = substr($str, $i, 2);
$i += 1;
}elseif (substr($a, 0, 4) == 1110) {
$r[] = substr($str, $i, 3);
$i += 2;
}else{
$r[] = '';
}
if (++$m >= $lenth){
break;
}
}
}
return $r;
} // End subString_UTF8
}// End String
echo join('', String::subString_UTF8('汉字', 0, 1));
2.先截后取
这类体例凉鞋感觉很奇妙……
用传统截取函数先截断……
然后判别中文单个字符是不是被朋分开……
假如是……则处置之……
要出格注重的是 substr 函数的第三个参数必需大于 3 ……
至于为何不必凉鞋注释了吧?
// A trim function to remove the last character of a utf-8 string
// by following instructions on http://en.wikipedia.org/wiki/UTF-8
// dotann
// usage: $str = utf8_trim(substr($str,0,50));
function utf8_trim($str) {
$len = strlen($str);
for ($i=strlen($str)-1; $i>=0; $i-=1){
$hex .= ' '.ord($str[$i]);
$ch = ord($str[$i]);
if (($ch & 128)==0) return(substr($str,0,$i));
if (($ch & 192)==192) return(substr($str,0,$i));
}
return($str.$hex);
}
$str = '汉字';
echo utf8_trim(substr($str,0,3));
3.还有其它办法,
好比 007pig 为咱们 vBulletin 中文版里所写的函数……
短小精干……
源码方便放出……
对不住鸟……
根据功能来进行封装等。很多的不懂,在使用搜索引擎查找,或者请教老师和在老师详细的讲解、指导下,都能顺利解决。
作者: 若相依    时间: 2015-2-4 07:54
没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。
作者: 第二个灵魂    时间: 2015-2-5 15:26
没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。
作者: 小妖女    时间: 2015-2-7 11:56
微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox  支持的不是很好,所以能少用还是少用的好。
作者: 灵魂腐蚀    时间: 2015-2-9 01:30
Ps:以上纯属原创,如有雷同,纯属巧合
作者: 不帅    时间: 2015-2-22 02:50
基础有没有对学习php没有太大区别,关键是兴趣。
作者: 深爱那片海    时间: 2015-2-28 19:40
作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。
作者: 因胸联盟    时间: 2015-3-7 22:49
我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。
作者: 莫相离    时间: 2015-3-11 16:58
有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。
作者: admin    时间: 2015-3-17 08:09
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线  \\\\\\\'_\\\\\\\' ;
作者: 简单生活    时间: 2015-3-22 21:52
首先我是坚决反对新手上来就用框架的,因为对底层的东西一点都不了解,造成知识上的真空,会对以后的发展不利。我的观点上手了解下框架就好,代码还是手写。当然啦如果是位别的编程语言的高手的话,这个就另当别论啦。
作者: 若天明    时间: 2015-3-24 19:11
兴趣是最好的老师,百度是最好的词典。
作者: 小魔女    时间: 2015-4-1 12:50
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
作者: 愤怒的大鸟    时间: 2015-4-11 01:12
对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。
作者: 金色的骷髅    时间: 2015-4-17 17:51
首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。
作者: 精灵巫婆    时间: 2015-5-10 15:23
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
作者: 冷月葬花魂    时间: 2015-6-5 22:49
Ps:以上纯属原创,如有雷同,纯属巧合
作者: 老尸    时间: 2015-6-27 16:52
使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的
作者: 爱飞    时间: 2015-7-7 22:24
我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能:




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2