<address id="ousso"></address>
<form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
  1. php語言

    PHP與UTF-8的最佳實踐

    時間:2025-02-07 01:21:23 php語言 我要投稿

    PHP與UTF-8的最佳實踐

      《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中配置。

      從PHP5.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);

      瀏覽器和 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\"");

      }

    【PHP與UTF-8的最佳實踐】相關文章:

    PHP與UTF-8 的最佳實踐介紹08-04

    PHP與UTF-8的最佳實踐要點07-11

    PHP與UTF-8之間的最佳實踐10-31

    初學者的30條PHP最佳實踐08-06

    php實現utf-8轉unicode函數分享09-17

    PHP如何實現Unicode和Utf-8編碼相互轉換07-28

    最佳薪酬實踐的誤區07-08

    最佳薪酬實踐的誤區08-29

    作為程序員必知的16個最佳PHP庫09-24

    <address id="ousso"></address>
    <form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
    1. 日日做夜狠狠爱欧美黑人