Php str_replace не работает со специальными символами

почему это не работает должным образом:

echo str_replace("é","é","Fédération Camerounaise de Football"); 

результат:

 "Fédération Camerounaise de Football" 

я ожидаю иметь:

 "Fédération Camerounaise de Football" 

Ты делаешь это неправильно. Эта строка неверна и нуждается в замене, она просто кодируется с помощью UTF-8.

Все, что вам нужно сделать, это utf8_decode('Fédération Camerounaise de Football') .

Обновить:

Вы видите Fédération Camerounaise de Football как результат, потому что вы дважды передаете свои данные в UTF-8.

Заметим:

file1.php сохраняется в формате UTF-8:

 <?php echo "Fédération Camerounaise de Football"; 

Вывод:

FÃ © dation © Camerounaise de Football

Теперь, если вы сообщите браузеру, что используете UTF-8, он должен отображать контент прямо:

file2.php сохраняется в формате UTF-8:

 <?php header('Content-Type: text/html; charset=utf-8'); echo "Fédération Camerounaise de Football"; 

Вывод:

Фестиваль Camerounaise de Football

Отлично.

Howover, вы делаете что-то еще хуже. У вас есть кодированная строка в формате UTF-8, и она снова кодирует ее, записывая ее в кодированный файл UTF-8.

file3.php сохраняется в формате UTF-8:

 <?php echo "Fédération Camerounaise de Football"; 

Вывод:

Fà© dà© ration Camerounaise de Football

Какой беспорядок. Давайте сделаем это хуже, увидев, можем ли мы исправить это с помощью str_replace :

file4.php сохраняется в формате UTF-8:

 <?php echo str_replace("é","é","Fédération Camerounaise de Football"); 

Вывод:

FÃ © dation © Camerounaise de Football

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

Давайте попробуем это снова с ASCII:

file5.php сохранен в формате ASCII:

 <?php echo str_replace("é","é","Fédération Camerounaise de Football"); 

Вывод:

Фестиваль Camerounaise de Football

Магия! Браузер получил все прямо сейчас. Но каково реальное решение? Что ж. Если у вас есть строка, жестко закодированная в вашем PHP-файле, тогда вы должны просто написать Fédération Camerounaise de Football вместо того, чтобы поместить чертову черт неправильно. Но если вы извлекаете его из другого файла или базы данных, вы должны взять один из двух курсов:

  1. Используйте utf8_decode() чтобы преобразовать данные, которые вы извлекаете в ваш желаемый результат.

  2. Не трансформируйте ничего и используйте header('Content-Type: text/html; charset=utf-8'); чтобы сообщить браузеру, что вы печатаете контент в формате UTF-8, поэтому он будет отображать все правильно.

// редактировать после комментария

Fédération Camerounaise de Football – кодированная строка UTF-8 поэтому я не знаю, какой ввод не является utf-8 закодированным в вашем документе, но у вас есть два варианта.

  1. ваш вход, который передается в str_replace является utf-8 но символы, которые вы использовали в заменяемых ANSII это ANSII или что-то еще => не работает – это означает, что ваш документ не является utf-8 – вот почему uft8_decode работает str_replace(ANSII, ANSII, CONVERT_TO_ANSII(UTF-8))

  2. ваш вход не является utf-8 а ваш документ – это будет работать str_replace(UTF-8, UTF-8, CONVERT_TO_UTF-8(ANSII))


str_replace работает с многобайтными символами – ваша проблема не в функции, потому что вы пытаетесь заменить разные типы кодирования. вместо использования альтернативной функции – я предлагаю вам исправить входные данные, переданные в str_replace в utf-8 и убедиться, что ваш документ также закодирован в utf-8 .

если ваш источник поддерживает только кодировку utf-8 используйте utf8_encode для преобразования вашего ввода в utf-8

http://php.net/manual/de/function.utf8-encode.php

Проверьте следующий код:

 $chain="Fédération Camerounaise de Football"; $pattern = array("'é'"); $replace = array('é'); $chain = preg_replace($pattern, $replace, $chain); echo $chain;