strtoupper回導致中文亂碼麼
本帖最後由 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 中是用於提示資訊的多語言轉換的,所以也不大可能用中文做鍵
一旦程式文本中出現中文,那麼這個程式文本在執行時就有可能出現亂碼問題。所以應避免在程式文本中出現中文
這就是這個函數的精髓所在