《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(State of Qatar 函数是八花九裂的,请使用 mb_strlen()函数取代。

mbstring
扩充超过四分之大器晚成的函数都亟待依据叁个编码(内部编码)来管理,请必得统生龙活虎接受UTF-8 编码,那个当先1/4足以在 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(State of Qatar函数下载文件的时候,也要思考浏览器和操作系统(大部分人选用的是
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\"");
}
admin

相关文章

发表评论

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