的最佳实践

《PHP中的字符串、编码、UTF-8》一文中陈述了意气风发部分列的底子知识,相比较清淡,今后以来点有用的——PHP
字符串管理的特级施行,本文是“PHP、字符串、编码、UTF-8”相关文化的第二某些。先说结论——
PHP 中的各种方面使用 UTF-8
编码。

PHP 语言层面是不辅助 Unicode字符集的,可是足以经过 UTF-8
编码能管理超越52%主题材料。

最好实行正是引人瞩目精通输入编码(不驾驭就检查评定),内部统意气风发改换为 UTF-8
编码,输出编码也归并是 UTF-8编码。

PHP 层面如哪个地点理 UTF-8

当操作 Unicode 字符集的时候,请必需安装 mbstring
扩张,并运用相应的函数替代原生的字符串函数。举例,二个文书编码为
UTF-8 的 PHP 代码,假若使用 strlen(State of Qatar 函数是不当的,请使用 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(State of Qatar 函数的第八个参数字显示示写上 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-8

function 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"");
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注