首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

PHP 上傳中文文件名圖片入庫顯示亂碼(問號)的終極解決方案

     編輯:程式設計綜合問答

現象

  • 前端上傳中文名圖片(如 風景.jpg),頁面能正常顯示。
  • 數據庫 filename 字段存入後變成 ????.jpg 或亂碼。
  • 環境:PHP header('charset=gbk')、MySQL 連接 SET NAMES gbk、腳本文件 ANSI 編碼、表校對 gbk_general_ci、數據庫字符集 utf8。

根因分析

編碼鏈路不一致:PHP 腳本文件編碼(ANSI/GBK)與數據庫字符集(UTF8)不匹配,導致中文在寫入時按錯誤編碼解析,存入問號。

  • PHP 內部字符串編碼取決於源文件保存編碼。
  • SET NAMES gbk 告訴 MySQL「客戶端發送的是 GBK」,但實際 PHP 發送的是 UTF-8(若文件存為 UTF-8)或 ANSI,導致 MySQL 按 GBK 解碼失敗。

統一為 UTF-8 的標準化步驟

  1. PHP 源文件保存為 UTF-8 無 BOM(編輯器如 VS Code、PhpStorm、Notepad++ 另存為 UTF-8)。
  2. 移除 header('charset=gbk'),改為 header('Content-Type: text/html; charset=utf-8')。
  3. 數據庫連接設置 UTF-8:
    mysqli_set_charset($link, 'utf8mb4'); // 推薦 utf8mb4 支援 Emoji
    // 或 PDO
    $pdo = new PDO("mysql:host=...;dbname=...;charset=utf8mb4", $user, $pass);
  4. 數據庫/表/列字符集統一為 utf8mb4:
    ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
    ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  5. HTML 頁面聲明:<meta charset="utf-8">。
  6. 文件系統層面:Linux 文件系統通常支援 UTF-8 文件名;Windows 下 PHP 可用 iconv('utf-8', 'gbk', $filename) 轉碼後再 move_uploaded_file。

驗證

上傳 測試圖片.png,檢查數據庫 SELECT filename FROM pics 應顯示正確中文;前端 <img src="..."> 正常加載。

避坑提示

  • 不要混用 GBK/UTF-8,全鏈路統一 UTF-8(含 utf8mb4)。
  • SET NAMES 僅影響當前連接,推薦在連接參數中指定 charset。
  • 舊項目若必須維持 GBK,需確保 PHP 文件、HTML、數據庫連接、表字符集全部為 GBK,但強烈建議遷移至 UTF-8。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved