千家信息网

如何理解PHP与UTF-8

发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,本篇内容主要讲解"如何理解PHP与UTF-8",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何理解PHP与UTF-8"吧!PHP 语言层面是不支持 Uni
千家信息网最后更新 2025年01月19日如何理解PHP与UTF-8

本篇内容主要讲解"如何理解PHP与UTF-8",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何理解PHP与UTF-8"吧!

PHP 语言层面是不支持 Unicode字符集的,但是可以通过 UTF-8 编码能处理大部分问题。

最佳实践就是明确知道输入编码(不知道就检测),内部统一转换为 UTF-8 编码,输出编码也统一是 UTF-8编码。

PHP 层面如何处理 UTF-8

当操作 Unicode 字符集的时候,请务必安装 mbstring 扩展,并使用相应的函数代替原生的字符串函数。举个例子,一个文件编码为 UTF-8 的 PHP 代码,假如使用 strlen() 函数是错误的,请使用 mb_strlen() 函数代替。

mbstring 扩展大部分的函数都需要基于一个编码(内部编码)来处理,请务必统一使用 UTF-8 编码,这个大部分可以在 PHP.INI 中配置。

从 PHP 5.6 开始,default_charset 配置可以替换 mbstring.http_input,mbstring.http_output 。

另外一个重要的配置就是 mbstring.language,这个默认值是 Neutral(UTF-8)。

注意文件编码和 mbstring 扩展的内部编码不是同一个概念。

概括的说来:

  • PHP.INI 中涉及到 mbstring 扩展的部分尽量使用 UTF-8。

  • 请用 mbstring 扩展函数代替原生字符串操作函数。

  • 在使用相关函数的时候,请务必了解你操作的字符的编码是什么,在使用对应函数的时候,显示的写上 UTF-8 编码参数,比如 htmlentities() 函数的第三个参数显示写上 UTF-8。

文件 IO 操作 如何处理 UTF-8

这里举个例子,假如你要打开一个文件,但是不知道文件内容是什么编码的,那么如何处理呢?

最佳实践就是,在打开的时候统一转换成 UTF-8,修改内容后就再转回原来的编码并保存到文件。看代码把:

if ( mb_internal_encoding()!="UTF-8") {    mb_internal_encoding("UTF-8");}$file = "file.txt"; //一个编码为gbk的中文文件$str= file_get_contents($file);//不管来源是什么编码,统一显示的时候转换为 UTF-8 if (mb_check_encoding($str,"GBK"))   $str = mb_convert_encoding($str,"UTF-8","GBK"); $str ="修改内容";$str = mb_convert_encoding($str,$srcbm,"UTF-8"); //原样转回去file_put_contents($file,$str);

Mysql 和 UTF-8 的最佳实践

这个相对简单,首先保证你的 Mysql 都是 UTF-8。然后 Mysql 客户端连接的时候也保持 UTF-8,具体到 PHP 中,就是 imysql 或者 PDO 扩展连接 Mysql 的时候都设置 UTF-8 作为连接编码,二边保持一致,一般就不会遇到问题。

浏览器和 UTF-8 的最佳实践

这个也比较简单,就是你的输出内容假如是网页,那么你的字符串处理输出最总请保持为 UTF-8 ;同时 PHP.INI 中也明确设定 default_charset 为 UTF-8;HTML 的 Meta Tag 也明确标识为 UTF-8。

现在万事大吉了吗,并没有,虽然服务器和浏览器让用户使用 UTF-8 编码,但是用户的行为并没有约束性,他可能输入的是其他编码的字符,或者上传的文件名是其他编码的字符,那么怎么办呢?可以通过 mb_http_input() 和 mb_check_encoding() 函数来检测用户的编码,然后内部转换为 UTF-8。确保在任何一个层面,最终处理的是 UTF-8 编码。换句话说,需要手段能够知晓你的输入是什么编码的,处理完成后控制输出的编码是 UTF-8。

不建议使用 mbstring.encoding_translation 指令 和 mb_detect_encoding() 函数。折磨我半天。

操作系统和 UTF-8 的最佳实践

由于操作系统的原因,PHP 处理 Unicode 文件名的时候会有不同的处理机制。

在 Linux 中,文件名始终是 UTF-8 编码的,而在中文 Windows 环境下,文件名始终是 GBK 编码的,记住这一点就可以了。

通过例子说明下:

//命令行程序函数,运行在中文版 Windows 10 操作系统 ,文件编码为 UTF-8function filenameexample() {  $filename = "测试.txt" ;  $gbk_filename = iconv("UTF-8","GBK",$filename);  file_put_contents($gbk_filename, "测试");  echo file_get_contents($gbk_filename);}function scandirexample() {  $arr = scandir("./tmp");  foreach ($arr as $v) {    if ($v == "." || $v =="..")      continue ;    $filename = iconv( "GBK","UTF-8",$v ) ;    $content = file_get_contents("./tmp/" . $v );  }}

假如不想写写兼容 Windows 和 linux 的程序,可以对文件名进行 urlencode 编码,比如:

function urlencodeexample() {  $filename = "测试2.txt" ;  $urlencodefilename = urlencode($filename) ;  file_put_contents($urlencodefilename, "测试");  echo file_get_contents($urlencodefilename); }

在用 PHP 通过 header() 函数下载文件的时候,也要考虑浏览器和操作系统(大部分人使用的是 Windows),对于 Chrome 来说,输出的文件名编码可以是 UTF-8,Chrome 会自动将文件名转换为 GBK 编码。

而对于低版本的 IE 来说,它继承了操作系统的环境,所以下载文件名假如是中文必须转码为 UTF-8 编码,否则下载的时候用户看到的是乱码文件名。通过代码来说明:

$agent=$_SERVER["HTTP_USER_AGENT"];if(strpos($agent,'MSIE')!==false {  $filename = iconv("UTF-8","GBK","附件.txt");  header("Content-Disposition: attachment; filename=\"$filename\"");}

到此,相信大家对"如何理解PHP与UTF-8"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

UTF-8 编码 文件 函数 时候 文件名 字符 处理 内容 操作系统 就是 系统 实践 统一 输出 大部分 用户 中文 测试 代码 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 连接发信服务器 能不能把手机改成服务器 数据库宕机怎么处理 dell电脑从服务器安装系统 我的世界精灵宝可梦服务器对战 河南质量工程职业学院网络技术 基于体系结构的软件开发模型图 西安建筑科技大学互联网 大赛 国内发生的重大网络安全事件 网络安全中年危机 苹果手机软件开发开发 奇迹服务器购买 阿里云服务器有哪些规格 大型网站服务器租用需要考虑哪些 宝山区工商数据库系统研发收购价 一年的数据库运维 数据库自动化管理系统 网络安全等级保护管理条例 如何组建域控服务器 共享文件网络安全密码忘记 外包软件开发 免增值税吗 网络安全保护移动 ps4 构筑数据库失败 网络安全防护和保护的主要策略 数据库的表单控件 登录数据库. 德惠数据库存储服务器找哪家 方维数据库 宿迁工业网络技术联系方式 绍兴电脑软件开发计划
0