Php Unicode字符正在str_replace上更改

Php Unicode字符正在str_replace上更改,php,unicode,str-replace,Php,Unicode,Str Replace,我正在创建一个网站与搜索引擎优化友好的网址。但是,当我使用str_replace()将空格替换为-时,它会改变一些unicode字符 function create_slug($string){ $slug = str_replace(' ','-', $string); return strtolower($slug); } 当create_slug('Googleഎഴുത്ത് ഉപകരണങ്ങളുടെ 铬വിപുലീകരണം');时,我必须将输出作为 谷歌-എഴുത്ത്-ഉ

我正在创建一个网站与搜索引擎优化友好的网址。但是,当我使用
str_replace()
空格
替换为
-
时,它会改变一些unicode字符

function create_slug($string){
   $slug = str_replace(' ','-', $string);
   return strtolower($slug);
}
create_slug('Googleഎഴുത്ത് ഉപകരണങ്ങളുടെ 铬വിപുലീകരണം');时,我必须将输出作为

谷歌-എഴുത്ത്-ഉപകരണങ്ങളുടെ-铬-വിപുലീകരണം

但有时我会得到输出

谷歌-ഞഴുത്ത്-ഉപകരണങ്ങളു���െ-铬-വിപുലീകരണം


我做错了什么?

如果服务器的区域设置字符集设置不支持UTF-8,
strtolower
可能会将一些有效的多字节序列误认为其他内容。结果将是损坏的UTF-8字符串

改用

如果希望像
strtolower
strtoupper
这样的函数只考虑ASCII范围内的字符,可以使用以下命令覆盖服务器的区域设置:

setlocale(LC_CTYPE, 'C');

由于ASCII是UTF-8的一个子集,现在可以使用
strtolower
毫无问题地更改字符串。

这可能会对您有所帮助。在格式良好的UTF-8字符串中,我有时会遇到问题,这不应该是问题。您使用的是什么编码?我使用UTF-8编码,那么您不应该在其上使用
strtolower
,因为它可以破坏多字节字符
setlocale(LC_CTYPE, 'C');