使用一个函数将ASCII和UTF-8转换为非特殊字符

Kok*_*kos 5 php ascii utf-8 special-characters

因此,我正在构建一个使用已经设置的数据库源的网站,并且已经被客户端用于所有其他网站已有一段时间了.

他们通过外部程序填充这个数据库,我无法改变我获取数据的方式.

现在我有以下问题,有时候我会得到UTF-8字符串,有时候是ASCII字符串(我希望我的这些条款正确,有时它们对我来说仍然有点模糊).

所以我可以得到这个:Scénic或者Scénic.

现在的问题是,我必须将其转换为非特殊字符(因此它会成为Scenic).

我不认为有一个转换ée(如果有告诉)的功能所以我可能需要为包含所有源和目的地的数组创建一个数组,但更大的问题是转换é到它时é不会破坏é那个功能.

或者我应该只创建一个包含所有内容 的数组
(例如:array('é'=>'e','é'=>'e');等等

我知道怎么去éé,这样做utf8_encode(html_entity_decode('é')),但是将é通过此相同的函数将返回é.

也许我接近这个错误的方式,但在那种情况下,我很想知道我应该如何接近它.

Kok*_*kos 12

感谢@XzKto和PHP.net上的这条评论,我将slug函数更改为以下内容:

static function slug($input){

    $string = html_entity_decode($input,ENT_COMPAT,"UTF-8");

    $oldLocale = setlocale(LC_CTYPE, '0');  

    setlocale(LC_CTYPE, 'en_US.UTF-8');
    $string = iconv("UTF-8","ASCII//TRANSLIT",$string);

    setlocale(LC_CTYPE, $oldLocale);

    return strtolower(preg_replace('/[^a-zA-Z0-9]+/','-',$string));

}
Run Code Online (Sandbox Code Playgroud)

我觉得这个setlocale部分有点脏,但这非常适合将特殊字符转换为它们的"普通"等价物.

输入a áñö ïß éèé回报a-ano-iss-eee

  • 它应该是`$ oldLocal = setlocale(LC_CTYPE,'0');`只使用一个参数使用`setlocale`会导致错误.如果要获取当前区域设置,则应使用字符串"0"作为第二个参数.http://php.net/manual/en/function.setlocale.php (4认同)