Unicode 字符在 str_replace 发生变化

Unicode character is changing on str_replace

我正在创建一个 seo 友好的网站 url。但是当我使用 str_replace()spaces 替换为 - 时,它改变了一些 unicode 字符。

function create_slug($string){
   $slug = str_replace(' ','-', $string);
   return strtolower($slug);
}

当调用 create_slug('Google എഴുത്ത് ഉപകരണങ്ങളുടെ Chrome വിപുലീകരണം'); 时,我必须将输出设为

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

但有时我得到的输出是

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

我做错了什么?

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

改用mb_strtolower

mb_strtolower($slug, 'UTF-8');

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

setlocale(LC_CTYPE, 'C');

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