У меня трудные времена, удаляя диакритические знаки из некоторых $string
, Мой код
<?php
$string = "Příliš žluťoučký kůň úpěl ďábelské ódy.";
$without_diacritics = strTr($string, "říšžťčýůúěďó", "risztcyuuedo");
echo $without_diacritics;
в то время как ожидаемый результат будет Prilis zlutoucky kun upel dabelske ody.
Вместо этого я получаю очень странный ответ:
Puiszliuc uuluueoudoks� ku�u� s�pd�l d�scbelsks� s�dy.
Я думал, что это может быть проблема с многобайтовыми символами, но я обнаружил, что strtr
многобайтовый сейф Мое предположение неверно? Что мне не хватает?
Проблема в том, что ваша входная строка перевода в два раза больше выходной строки перевода (из-за Unicode) и strtr()
работает с байтами вместо символов; В этом случае лучше использовать массив перевода:
$string = "Příliš žluťoučký kůň úpěl ďábelské ódy.";
echo strtr($string, [
'ř' => 'r',
'í' => 'i',
'š' => 's',
'ž' => 'z',
'ť' => 't',
'č' => 'c',
'ý' => 'y',
'ů' => 'u',
'ú' => 'u',
'ě' => 'e',
'ď' => 'd',
'ó' => 'o'
]);
Выход:
Prilis zlutoucky kuň upel dábelské ody.
Простое и проверенное решение (на основе этот ответ), жгуты iconv()
преобразовать строку «из заданной кодировки в символы ASCII».
$input = 'Příliš žluťoučký kůň úpěl ďábelské ódy.';
$input = iconv('UTF-8', 'ASCII//TRANSLIT', $input);
echo $input;
объяснение
Проблема, с которой вы сталкиваетесь, связана с кодировкой строки / документа. Вопрос с strtr()
является то, что он не знает многобайтовых, как @ChrisForrence заявил в своем комментарий.
Это может быть потому, что некоторые из этих символов имеют более одного байта, поэтому
это не отображается должным образом.