我正在尝试,放入标题(“Content-Type:text / html; charset = 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 :(得分: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中的链接。
答案 1 :(得分:1)
问题是你正在组装一个随机的gobbledygook字节,并告诉浏览器将其解释为UTF-8。标准PHP str
函数假设一个字节=一个字符。通过随机选择一个多字节字符串与那些你不会得到整个字符的字符串,只有字节。
如果您需要在字符级别而非字节级别上运行编码感知函数,请使用mb_*
函数。
答案 2 :(得分: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
或类似函数,就好像它们是{{1}}函数一样。
有关详细信息,请参阅php.net – Function Overloading Feature。
另见: