почему это не работает должным образом:
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
вместо того, чтобы поместить чертову черт неправильно. Но если вы извлекаете его из другого файла или базы данных, вы должны взять один из двух курсов:
Используйте utf8_decode()
чтобы преобразовать данные, которые вы извлекаете в ваш желаемый результат.
Не трансформируйте ничего и используйте header('Content-Type: text/html; charset=utf-8');
чтобы сообщить браузеру, что вы печатаете контент в формате UTF-8, поэтому он будет отображать все правильно.
// редактировать после комментария
Fédération Camerounaise de Football
– кодированная строка UTF-8
поэтому я не знаю, какой ввод не является utf-8
закодированным в вашем документе, но у вас есть два варианта.
ваш вход, который передается в str_replace
является utf-8
но символы, которые вы использовали в заменяемых ANSII
это ANSII
или что-то еще => не работает – это означает, что ваш документ не является utf-8
– вот почему uft8_decode
работает str_replace(ANSII, ANSII, CONVERT_TO_ANSII(UTF-8))
ваш вход не является 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
Проверьте следующий код:
$chain="Fédération Camerounaise de Football"; $pattern = array("'é'"); $replace = array('é'); $chain = preg_replace($pattern, $replace, $chain); echo $chain;