本帖最後由 molaifeng 於 2013-11-25 09:04:16 編輯
在部署項目時,遇到一個奇怪的問題,頁面開啟後,php指令碼嵌套在html頁面裡的部分出現亂碼,資料庫是沒問題的。後來定位,發現問題出現在這段代碼上(tp架構)。
/** * 擷取和設定語言定義(不區分大小寫) * @param string|array $name 語言變數 * @param string $value 語言值 * @return mixed */function L($name=null, $value=null) { static $_lang = array(); // 空參數返回所有定義 if (empty($name)) return $_lang; // 判斷語言擷取(或設定) // 若不存在,直接返回全大寫$name if (is_string($name)) { echo $name, ' '; $name = strtoupper($name);echo $name; if (is_null($value)) return isset($_lang[$name]) ? $_lang[$name] : $name; $_lang[$name] = $value; // 語言定義 return; } // 批量定義 if (is_array($name)) $_lang = array_merge($_lang, array_change_key_case($name, CASE_UPPER)); return;}
後來,把那個strtoupper該成了mb_strtoupper
$name = mb_strtoupper($name, 'UTF-8');
這個項目部署在其他伺服器時沒出現這個問題啊,哪位大大解釋下,謝謝!!!
回複討論(解決方案)
圖沒發全
是否是瀏覽器編碼問題造成,檢查下檔案編碼。
不是,問題已經定位了,就是上面的那個代碼
strtoupper、strtolower 在以前某些 php 版本中曾出現過對中文產生影響的問題
但早已經糾正過了
感覺你對這個函數的使用存在一些問題
離開這個函數原來的語境,這個函數只不過是設定一些索引值對
和定義常量相似
比如
L('x', '這是個問題');
echo L('X'); // 這是個問題
L('x', '這不是個問題');
echo L('X'); //這不是個問題
echo L('x'); //這不是個問題
因此,在一般思維中,總是用簡單的字元組合去對應複雜的字元組合(這就是縮減詞)
這個函數在 TP 中是用於提示資訊的多語言轉換的,所以也不大可能用中文做鍵
一旦程式文本中出現中文,那麼這個程式文本在執行時就有可能出現亂碼問題。所以應避免在程式文本中出現中文
這就是這個函數的精髓所在
謝謝大大的回答!!!