2013-10-30 40 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