UTF8下的中文PHP编程

编程|中文

【摘 要】 本文中凉鞋就尽量多方位介绍一下 UTF8 编码下的 PHP 编程,至于为什么单独介绍“中文”,一来是因为英文这玩意实在不需要考虑 UTF8 …… 除非你准备做多语言系统,(我要发些牢骚:现在的老外写程式时根本不重视这个问题……),二来是中日韩等多字节语系在 UTF8 编码下的处理方式其实大同小异……
说实话,我也觉得 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 已经为我们想好了一切……
导出时请添加 –compatible 参数……
我们假设您的数据库是 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 中文版里所写的函数……
短小精悍……
源码不便放出……
对不住鸟……

时间: 2024-09-16 18:59:01

UTF8下的中文PHP编程的相关文章

技巧文章:UTF8下的中文PHP编程

前言: 说实话,凉鞋也觉得 UTF8 是好东西--毕竟同屏显示中日韩对东亚人的吸引力是不小的--(当然好处不仅是这点啦--)不仅是网页程式--很多应用程式的内核都开始使用 Unicode 编码--目的是显而易见的:支援多语言显示--微软的所有软体都是 Unicode 内核--所以日文软体拿到你的中文 XP 上是可以正常显示的--而中文 98 就会因为 GB 内核安装其他语言软体时造成乱码-- 至于 UTF8 ,可以说是 Unicode 的一个分支,它用三个字节保存一个汉字--(Unicode 用

c++ 编程问题-c++与java通信(socket TCP)c++用的默认的编码,java用的UTF-8 怎么解决中文乱码问题

问题描述 c++与java通信(socket TCP)c++用的默认的编码,java用的UTF-8 怎么解决中文乱码问题 c++代码如下,谁可以试着尝试一下,谢谢 #include #include #include #pragma comment(lib,"ws2_32.lib") void main() { //创建套接字 WORD myVersionRequest; WSADATA wsaData; myVersionRequest=MAKEWORD(1,1); int err;

在.NET下编写中文代码程序

程序|中文 在.NET下编写中文代码程序 郑佐2005-3-9 一年前,有一次在用Access数据库编程的时候,通过VS.NET数据设计器向导生成数据层代码,查看生成的代码,发现有许多中文,原来数据库中的表名和字段名用的就是中文,程序正常运行,查看相关文档才知道原来VS.NET默认的编码是UTF-8.不久前在一篇blog上看到讲易语言,所以干脆用VS.NET写一些中文代码来玩一下,结果就像平常写程序一样没有什么区别. 有点怪怪的味道,故把代码贴出来. using System; namespac

《C语言编程魔法书:基于C11标准》——3.2 macOS系统下搭建C语言编程环境

3.2 macOS系统下搭建C语言编程环境 macOS系统也不默认自带C语言编译器.然而,用户可以自己去Mac App Store免费下载macOS下的强大开发工具--Xcode.该集成开发工具采用Apple定制版本的Clang编译器,称为Apple LLVM编译器.它自带C.C++.Objective-C以及Apple自己新推出的Swift编程语言编译器,还有一系列功能强大的代码静态分析以及性能剖析工具. 下载完Xcode之后,把它打开.如果是第一次启动,Xcode会自动更新一些资源,完了之后

Delphi下汉字输入法的编程及使用

许多Windows应用程序的中西文录入界面中,中西文的录入需要反复切换汉字输入法,这样使用起来非常麻烦,下面来介绍一种比较简便的解决方法.本文的程序设计环境为Delphi Client/Server Suit Ver 3.0(以下简称Delphi 3.0)和中文Windows 95. 1.Delphi下的Imename.Imemode属性 在Delphi 3.0中的Tedit.Tmemo.TmaskEdit等编辑元件在应用程序中经常使用,这三种元件都具有ImeName.ImeMode属性.其中I

Xcode下的中文乱码问题

=========== 问题原因 绝大部分的中文乱码是因为文件编码不对导致的: 使用了GBK的文件编码方式在Xcode下是无法识别的 老版本的Xcode对带BOOM头的UTF8文件编码也是无法识别的(我的Xcode 5.0.2已经支持带BOM头的UTF8文件了) 出现上述情况一般都是因为跨平台共用文件导致的,Windows,Mac共同使用的代码文件会出现乱码的问题. 最好的解决方案 Windows和Mac下统一使用UTF8带BOM头的文件编码格式. 特别解释下 以前是这样的: UTF8不带BOM

《精通QTP——自动化测试技术领航》—第1章1.6节对象库(下)之进阶编程篇

1.6 对象库(下)之进阶编程篇 精通QTP--自动化测试技术领航 阶段要点 掌握手写代码的3种方式. 明确测试对象(TO)与运行时对象(RO)的区别. 4种操作对象封装属性的方法. 你也可以是一名魔术师.黑客. 几种常见的QTP无法识别或识别错误的原因. 1.6.1 引言 在对象库上篇这个章节中,相信读者已经对对象库的使用以及其他各个方面有了一个全面的了解.那么从现在开始,作者将引领读者开始基于对象库编程的学习,从而掌握对象库编程的知识与技巧.读者如果觉得在对象库上篇中还有不能够完全掌握的地方

mysql 中文 linux-mysql在linux下的中文乱码问题

问题描述 mysql在linux下的中文乱码问题 我的一个网站分别部署在windows下/linux,使用myeclipse/tomcat/mysql, mysql和相应数据库及相应表编码都已经设置为utf-8,测试在两个系统下数据的crud都正常, 但是我有一段存储过程(数据库函数),会执行一些数据的拼凑,然后我再获取这些数据,在windows下面一切正常,但在linux下这些数据中的中文会变成乱码. 两个系统下部署的程序完全相同,mysql的设置也完全相同.实在找不到解决办法了,又不想用wi

《C语言编程魔法书:基于C11标准》——第3章 C语言编程的环境搭建3.1 Windows操作系统下搭建C语言编程环境

第3章 C语言编程的环境搭建 我们在第2章讲述了学习C语言所必需的一些预备知识.本章将给大家介绍常用桌面操作系统下的C语言环境搭建.这里所讲述的C语言编译器以及集成开发环境(IDE)都是可合法免费下载的,本书不鼓励各位使用盗版或破解软件,所以下面会列出下载这些合法免费软件的官方链接,大家把编程环境搭建完之后即可上机实践编程. 3.1 Windows操作系统下搭建C语言编程环境 Windows操作系统下默认不自带任何C语言编译器,大家必须从网上下载自己所需要的C语言编译器.如果各位想通过C语言开发