2015-02-05 1 views
3

У меня с трудом удаляются диакритики от некоторых $string. Мой кодstrtr действующий странный - удаление диакритических знаков из строки

<?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 является многобайтовым. Я ошибаюсь в своем предположении? Что мне не хватает?

+1

[Это] (http://stackoverflow.com/a/3635607/2518525) может быть (использование функции) или [это] (http://stackoverflow.com/a/1770306/2518525). – Darren

+2

Или [это] (http://stackoverflow.com/questions/2758736/multibyte-strtr-mb-strtr) ("multibyte strtr() -> mb_strtr()") – Matmarbon

+0

Спасибо за ваши предложения, я решу использовать один из них наверняка, но я все еще с нетерпением жду, чтобы узнать, почему мой код не работает должным образом. –

ответ

4

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

Demo

1

Простое и проверенное решение (основываясь на this answer), жгуты 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 заявила в своем comment.

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

+0

К сожалению, это решение дает мне «P ?? li? ? Л? НУ? К? к ?? ? p? l? belsk? «почему-то». Должен ли быть установлен какой-то внутренний параметр PHP? –

+0

Какую версию PHP вы используете и какая кодировка документа является вашим файлом '.php'? – Darren

+0

Он кодируется в UTF-8 без спецификации. Версия PHP 5.4.36-1 –