|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
咱们就开始学习动态语言的概念吧,刚一接触动态语言,可能很多人都会蒙了,怎么这乱七八糟的东西,在网页里显示的时候却是另外一码事?其实这并不算乱七八糟,你写的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 中文版里所写的函数……
短小精干……
源码方便放出……
对不住鸟……
根据功能来进行封装等。很多的不懂,在使用搜索引擎查找,或者请教老师和在老师详细的讲解、指导下,都能顺利解决。 |
|