php utf-8不起作用

php utf-8不起作用,php,utf-8,character-encoding,Php,Utf 8,Character Encoding,我正在尝试,放入标题(“内容类型: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++) {

我正在尝试,放入标题(“内容类型: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";
  ?>

有几个错误。不要在多字节字符串上使用
[]
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;
header('Content-Type:text/html;charset=utf-8');
mb_内部_编码(“UTF-8”);
函数randStr($rts=20){
$act_chars='ABCĞDEFGĞHIİJKLMNOÖPRSŞTUÜVYZ';
$act_val='';
$act\u chars\u last=mb\u strlen($act\u chars);
对于($act=0;$act<$rts;$act++){
$act_val.=mb_substr($act_chars,mt_rand(0,$act_chars_last),1);
} 
返回$act_val;
} 
$dene=randStr(16);
打印$dene;

  • 将双引号替换为单引号(节省少量时间)

  • 删除了
    mt_srand()
    调用,因为这些调用从PHP 4.2.0开始自动完成(感谢feeela在a中提到)

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


如果您想了解该主题的更多信息,请查看以下链接:。

有几个错误。不要在多字节字符串上使用
[]
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;
header('Content-Type:text/html;charset=utf-8');
mb_内部_编码(“UTF-8”);
函数randStr($rts=20){
$act_chars='ABCĞDEFGĞHIİJKLMNOÖPRSŞTUÜVYZ';
$act_val='';
$act\u chars\u last=mb\u strlen($act\u chars);
对于($act=0;$act<$rts;$act++){
$act_val.=mb_substr($act_chars,mt_rand(0,$act_chars_last),1);
} 
返回$act_val;
} 
$dene=randStr(16);
打印$dene;

  • 将双引号替换为单引号(节省少量时间)

  • 删除了
    mt_srand()
    调用,因为这些调用从PHP 4.2.0开始自动完成(感谢feeela在a中提到)

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


如果您想了解更多关于该主题的信息,请查看以下链接:。

问题在于,您正在组装一个随机的字节库,并告诉浏览器将其解释为UTF-8。标准PHP
str
函数假定一个字节=一个字符。通过随机选取一个多字节的字符串,你不会得到完整的字符,只有字节

如果需要在字符级别而不是字节级别上运行编码感知函数,请使用
mb.*
函数


和读取。

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

如果需要在字符级别而不是字节级别上运行编码感知函数,请使用
mb.*
函数


并阅读。

如果您有权访问
php.ini
,则可以在
php.ini
中设置以下变量,而不是使用
mb.*
函数:

# 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.ini
中的以下变量,则可以在
mb.*
函数中设置这些变量:

# 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文件采用哪种编码?没有BOMThere的notapad++utf-8有几个错误。不要在多字节字符串上使用
[]
strlen()。注意:从PHP4.2.0开始,不需要使用srand()或mt_srand()为随机数生成器种子,因为这现在是自动完成的。我还将存储字符串长度以避免循环内重复计算:
$actCharLength=mb_strlen($act_chars)-1检查文本编辑器的设置。您的php文件采用哪种编码?不带BOM的notapad++utf-8有几个错误。不要在多字节字符串上使用
[]
strlen()。注意:从PHP4.2.0开始,不需要使用srand()或mt_srand()为随机数生成器种子,因为这现在是自动完成的。我还将存储字符串长度以避免循环内重复计算:
$actCharLength=mb_strlen($act_chars)-1检查文本编辑器的设置。仅使用
mb.*
函数并不能解决问题+1用于提及
mb_内部编码('UTF-8')@feeela文件需要保存为UTF-8“无”BOM才能工作。我对它进行了测试,它100%工作。它在我的测试设置中,但我需要添加
mb_内部编码('UTF-8')
以使
mb.*
函数正常工作。@feeela Me。我的系统上的默认编码是
ISO-8859-1
(调用
mb\u internal\u encoding()
,无需参数即可检索)。仅使用
mb\u*
函数并不能解决问题+1用于提及
mb_internal_enco