新萄京计算机网络

 新萄京计算机网络     |      2020-01-18

《PHP中的字符串、编码、UTF-8》一文中陈诉了有个别列的幼功知识,对比单调,今后以来点有用的——PHP 字符串管理的顶尖推行,本文是“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-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"");
}