Лучшим решением может быть транслитерация этих символов автоматически с использованием iconv()
.
По той причине, что ваша функция не 'Это может быть связано с тем, что echo strlen('Š');
выводит 2. Документация явно ссылается на однобайтовые символы .
Также,
$a = 'Š';
var_dump(strtr('Š', 'Š', '!')); // string(2) "!�"
Таким образом, первый байт соответствует, но второй (оставшийся) не является байтом, указывающим на действительный символ Unicode.
Обновление
Вот рабочий знакпример использования iconv()
.
$str = 'ŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚ';
$str = iconv("utf-8", "us-ascii//TRANSLIT", $str);
var_dump($str); // string(37) "OEZsoezY?uAAAAAAAECEEEEIIII?NOOOOO?UU"
Некоторые символы не совсем переведены, например ¥
и Ø
, но большинство сделали.Вы можете добавить //IGNORE
к выходному набору символов, чтобы молча отбросить те, которые не транслитерируются.
Вы также можете отбросить все несловарные символы, используя регулярное выражение Unicode с \pL
.