首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 自動偵測字串編碼並轉碼實作

     編輯:PHP 相關知識

原理分析

  • GB2312/GBK:中文字符佔 2 位元組,各位元組有特定取值範圍。
  • UTF-8:中文字符佔 3 位元組,同樣有位元組範圍規則。
  • ASCII 字符(<128)在所有編碼中均佔 1 位元組。

透過逐位元組檢測範圍,即可判斷字串編碼。檔案形式還可檢查 UTF-8 BOM(EF BB BF)。

核心函數

<?php
function safeEncoding($string, $outEncoding = 'UTF-8') {
    $encoding = "UTF-8";
    for ($i = 0; $i < strlen($string); $i++) {
        if (ord($string[$i]) < 128) continue;
        // UTF-8 三位元組檢測
        if ((ord($string[$i]) & 224) == 224) {
            $char = $string[++$i];
            if ((ord($char) & 128) == 128) {
                $char = $string[++$i];
                if ((ord($char) & 128) == 128) {
                    $encoding = "UTF-8";
                    break;
                }
            }
        }
        // GB2312/GBK 兩位元組檢測
        if ((ord($string[$i]) & 192) == 192) {
            $char = $string[++$i];
            if ((ord($char) & 128) == 128) {
                $encoding = "GB2312";
                break;
            }
        }
    }
    if (strtoupper($encoding) == strtoupper($outEncoding)) return $string;
    return iconv($encoding, $outEncoding, $string);
}
?>

BOM (Byte Order Mark) 補充

  • UTF-8 BOM:EF BB BF,位於檔案開頭,標示編碼。Windows 記事本儲存 UTF-8 預設加 BOM,但 Unix 系統不建議,會干擾 Shebang、HTTP Header 輸出等。
  • UTF-16/32 BOM:用於標示大小端序,FE FF (BE)、FF FE (LE)。
  • PHP 中若未啟用輸出緩衝,BOM 會導致 Header 無法發送。

實際專案中,建議統一專案編碼為 UTF-8 無 BOM,儲存、輸出、資料庫連線皆設定一致,避免編碼地獄。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved