ICEcoder 是輕量級瀏覽器端程式碼編輯器,但開啟含中文的檔案時會出現亂碼 (如 中文 實體字串直接顯示)。經追蹤原始碼發現,lib/file-control.php 讀取檔案內容後以 htmlentities() 輸出至 <textarea>,導致多位元組字元被轉為 HTML 實體,瀏覽器在 textarea 中不解析實體,故顯示原始碼。將其改為 htmlspecialchars() 即可修復。
# 檔案:lib/file-control.php 第 89 行 (版本可能略有差異) echo '</script><textarea name="loadedFile" id="loadedFile">' . htmlentities($loadedFile) . '</textarea><script>';
# 將 htmlentities 改為 htmlspecialchars echo '</script><textarea name="loadedFile" id="loadedFile">' . htmlspecialchars($loadedFile, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '</textarea><script>';
| 函數 | 行為 | 中文處理 | 適用場景 |
|---|---|---|---|
htmlentities() | 將所有有對應實體的字元轉換 (含中文、日文、符號) | 中文 → 中文 (數字實體) | 需輸出純 ASCII 的舊系統、郵件模板 |
htmlspecialchars() | 僅轉換 < > & " ' 五個特殊字元 | 中文保持原樣 (UTF-8 位元組序列) | HTML 屬性、<textarea>、JS 字串嵌入 |
ENT_QUOTES:同時轉換雙引號與單引號,防止屬性跳脫。ENT_SUBSTITUTE:無效碼位以 Unicode 替換字元 (U+FFFD) 取代,避免截斷 (PHP 5.4+)。'UTF-8':明確指定編碼,避免預設值隨 PHP 版本變更 (PHP 5.6+ 預設即為 UTF-8)。專案中其他將內容輸出至 <textarea>、<input>、JS 字串模板的位置,皆應檢查是否誤用 htmlentities():
# 錯誤示範 echo '<textarea>' . htmlentities($content) . '</textarea>'; echo '<input value="' . htmlentities($val) . '">'; echo 'var content = "' . htmlentities($str) . '";'; # 正確示範 echo '<textarea>' . htmlspecialchars($content, ENT_QUOTES, 'UTF-8') . '</textarea>'; echo '<input value="' . htmlspecialchars($val, ENT_QUOTES, 'UTF-8') . '">'; echo 'var content = "' . json_encode($str, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP) . '";'; // JS 建議用 json_encode
一行代碼修復,讓 ICEcoder 完美支援中文編輯,也提醒我們:輸出上下文決定編碼函數選擇,textarea/屬性值請用 htmlspecialchars。