的最佳实践

《PHP中的字符串、编码、UTF-8》一文中陈说了一些列的根底知识,比较单调,今后的话点有用的——PHP
字符串处理的精品实行,本文是“PHP、字符串、编码、UTF-8”相关文化的第二有的。先说结论——
PHP 中的各种方面使用 UTF-8
编码。

PHP 语言层面是不帮助 Unicode字符集的,不过能够透过 UTF-8
编码能处理超越49%主题素材。

一级实行即是明摆着知晓输入编码(不领会就检查测验),内部统生龙活虎更动为 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 。
永利澳门游戏网址304,别的多少个根本的构造便是 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-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"");
}

发表评论

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