2013-10-30 65 views
1

我想,放在標題(「Content-Type:text/html; charset = utf-8」);但不行php utf-8不起作用

<?PHP 
    header("Content-Type: text/html; charset=utf-8"); 
    function randStr($rts=20){ 
    $act_chars = "ABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZ"; 
    $act_val = ""; 
    for($act=0; $act <$rts ; $act++) 
    { 
    mt_srand((double)microtime()*1000000); 
    $act_val .= $act_chars[mt_rand(0,strlen($act_chars)-1)]; 
    } 

    return $act_val; 
    } 
    $dene = randStr(16); 
    print "$dene"; 
    ?> 

輸出

K��A�CÞZU����EJ 
+0

該編碼不你的PHP文件有哪些? –

+1

notapad ++ utf-8 without BOM – ncinar

+0

有幾個錯誤。不要在多字節字符串中使用'[]'或'strlen()'。使用['mb_substr()'](http://php.net/mb_substr)和['mb_strlen()'](http://php.net/mb_strlen)。 – ComFreek

回答

3

有幾個錯誤。不要在多字節字符串上使用[]strlen()。使用mb_substr()mb_strlen()

同時設定多字節擴展的內部編碼UTF-8

mb_internal_encoding("UTF-8"); 

您還可以設置編碼在每個函數基礎。有關更多詳細信息,請參閱特定功能簽名。

這裏是你的代碼的改進版本:

header('Content-Type: text/html; charset=utf-8'); 
mb_internal_encoding("UTF-8"); 

function randStr($rts = 20) { 
    $act_chars = 'ABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZ'; 
    $act_val = ''; 
    $act_chars_last = mb_strlen($act_chars); 

    for($act = 0; $act < $rts; $act++) { 
    $act_val .= mb_substr($act_chars, mt_rand(0, $act_chars_last), 1); 
    } 

    return $act_val; 
} 
$dene = randStr(16); 
print $dene; 

  • 替換雙引號用單引號(節省的時間很少量)

  • 刪除mt_srand()電話,因爲他們從PHP 4.2.0開始自動完成(感謝feeela提及的在comment中)

  • 在變量中保存字符串長度-1,所以PHP不需要在每個循環步驟中重新計算它。

如果你想在該主題的更多見解,從deceze in the answer below結帳鏈接:What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text

+0

多數民衆贊成,很好,謝謝 – ncinar

+0

單獨使用'mb_ *'功能沒有解決問題; +1提及'mb_internal_encoding('UTF-8');' – feeela

+0

@feeela文件需要保存爲UTF-8「沒有」BOM「才能工作。我測試了它,它工作100%。 –

1

問題是,你正在組裝一個隨機的字節gobbledygook,並告訴瀏覽器將其解釋爲UTF-8。標準的PHP str函數假設一個字節=一個字符。通過隨機選擇一個多字節字符串與那些你不會得到整個字符,只有字節。

如果您需要在人物等級而不是字節級操作編碼意識到功能,使用mb_*功能。

並閱讀What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text

0

除了使用mb_*功能,你可以或者設置下列變量php.ini,如果你有機會獲得它:

# following mbstring-variables should be set via php.ini or vhost-configuration (httpd.conf); 
# does not work per directory/via .htaccess 
mbstring.language = Neutral 
mbstring.internal_encoding = UTF-8 
mbstring.func_overload = 7 

這種方法你可以使用目前的功能,因爲它是和使用strlen或類似功能就好像它們是一個mb_strlen函數。

請參閱php.net – Function Overloading Feature瞭解更多詳情。

參見:

+0

我絕不會推薦重載'str'函數。期望他們使用字節的開發人員會突然發現錯誤,並且幾乎沒有其他工具可以使用字節字符串。 – deceze

+0

@deceze如果有文檔記載,這是使用多字節函數的完美方法。 – feeela

+0

是的,沒有。由於它完全改變了現有函數的行爲,它可能會或可能不會導致與不知道此配置更改的代碼的兼容性問題。既然你很少在真空中開發,並經常使用其他第三方庫,這是一個壞主意。即使你現在沒有這樣做,將來當你的代碼遇到一些第三方代碼時,你可能會遇到這些問題。 – deceze