strtr действует странно — удаляет диакритические знаки из строки

У меня трудные времена, удаляя диакритические знаки из некоторых $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 многобайтовый сейф Мое предположение неверно? Что мне не хватает?

3

Решение

Проблема в том, что ваша входная строка перевода в два раза больше выходной строки перевода (из-за 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.

демонстрация

4

Другие решения

Простое и проверенное решение (на основе этот ответ), жгуты iconv() преобразовать строку «из заданной кодировки в символы ASCII».

$input = 'Příliš žluťoučký kůň úpěl ďábelské ódy.';
$input = iconv('UTF-8', 'ASCII//TRANSLIT', $input);
echo $input;

Example


объяснение

Проблема, с которой вы сталкиваетесь, связана с кодировкой строки / документа. Вопрос с strtr() является то, что он не знает многобайтовых, как @ChrisForrence заявил в своем комментарий.

Это может быть потому, что некоторые из этих символов имеют более одного байта, поэтому
это не отображается должным образом.

1

По вопросам рекламы [email protected]