1

我正在尝试,放入 header("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
4

3 回答 3

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 在评论中提及)

  • 将字符串长度 - 1 保存在变量中,因此 PHP 不需要在每个循环步骤中重新计算它。

如果您想了解有关该主题的更多见解,请查看以下答案中 deceze的链接:每个程序员绝对、肯定需要了解的有关编码和字符集以处理文本的内容。

于 2013-10-30T12:27:15.180 回答
1

问题是您正在组装一个随机的 gobbledygook 字节,并告诉浏览器将其解释为 UTF-8。标准 PHPstr函数假定一个字节 = 一个字符。通过随机选择一个多字节字符串与那些你不会得到整个字符,只有字节。

如果您需要在字符级别而不是字节级别上操作的编码感知函数,请使用这些函数。mb_*

并阅读每个程序员绝对、积极需要了解的关于编码和字符集以使用文本的知识。

于 2013-10-30T12:28:02.497 回答
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 – 函数重载功能

也可以看看:

于 2013-10-30T12:42:21.660 回答