Проблема с функцией удаления акцентов и других символов в PHP

Я нашел простую функцию для удаления некоторых нежелательных символов из строки.

function strClean($input){ $input = strtolower($input); $b = array("á","é","í","ó","ú", "ñ", " "); //etc... $c = array("a","e","i","o","u","n", "-"); //etc... $input = str_replace($b, $c, $input); return $input; } 

Когда я использую его на акцентах или других персонажах, как это слово «á é ñ», он печатает эти вопросительные знаки или странные символы, например: output http://img217.imageshack.us/img217/6794/59472278.jpg

Примечание. Я использую strclean.php (который содержит эту функцию) и index.php, как в UTF-8. index.php выглядит следующим образом:

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title></title> </head> <body> <?php include('strclean.php'); echo 'óóóáà'; echo strClean('óóóáà'); ?> </body> </html> в <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title></title> </head> <body> <?php include('strclean.php'); echo 'óóóáà'; echo strClean('óóóáà'); ?> </body> </html> 

Что я делаю не так?

Related of "Проблема с функцией удаления акцентов и других символов в PHP"

Я проверил ваш код, и ошибка в функции strtolower …

Замените его mb_strtolower, как рев

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> </head> <body> <?php function strClean($input) { $input = mb_strtolower($input, 'UTF-8'); $b = array("á","é","í","ó","ú", "n", " "); $c = array("a","e","i","o","u","n", "-"); return str_replace($b, $c, $input); } $string = 'á é í ó ú n abcdef ghij'; echo $string ."<br />". strClean($string); ?> </body> </html> 

использование

 iconv('UTF-8', 'ASCII//TRANSLIT', $input); 

Возможно, вы захотите попробовать iconv .

Выполняется ли замена вообще, т. Е. Вы получаете одни и те же странные символы, когда вы заранее печатаете $ input? Если это так, наборы символов вашего исходного кода PHP и ввода не совпадают, и вам, возможно, потребуется использовать iconv () на входе перед заменой.

edit: Я взял оба файла, загрузил их на свой веб-сервер, а работа по печати и очистке прекрасна (см. http://www.tag-am-meer.com/test1/ ). Это на PHP 4.4.9 и Firefox 3.0.6. Больше потенциальных проблем, которые мне приходят в голову:

  • Он работает для вас в Firefox? Я смутно помню, что IE6 (и, вероятно, более поздние версии) ожидают, что кодировка в разделе заголовка HTML будет записана в нижнем регистре («utf-8»)
  • Ваш редактор включает в себя байтовые байты (BOM) в файлах кода? Моя не делает, может быть, PHP задыхается от этих проблем.
  • Можете ли вы посмотреть заголовки HTTP, чтобы узнать, происходит ли что-то необычное, например, плохой тип MIME? Надстройка Tamper Data для Firefox может помочь в этом.

Почему вы хотите удалить акценты? Возможно ли, что вы просто хотите их игнорировать? Если это так, в этом ответе есть решение Perl, которое демонстрирует, как это сделать. Обратите внимание, что Perl находится на иностранном языке. 🙂

Я столкнулся с этой проблемой раньше, и я попытался следить за выводами этого сообщения и другими, которые я нашел по дороге, и не было простого решения, потому что вам нужно знать кодировку, используемую вашей системой (в моем случае ISO-8859 -1), и это то, что я сделал:

  function quit_accenture($str){ $pattern = array(); $pattern[0] = '/[Á|Â|À|Å|Ä]/'; $pattern[1] = '/[É|Ê|È]/'; $pattern[2] = '/[Í|Î|Ì|Ï]/'; $pattern[3] = '/[Ó|Ô|Ò|Ö]/'; $pattern[4] = '/[Ú|Û|Ù|Ü]/'; $pattern[5] = '/[á|â|à|å|ä]/'; $pattern[6] = '/[ð|é|ê|è|ë]/'; $pattern[7] = '/[í|î|ì|ï]/'; $pattern[8] = '/[ó|ô|ò|ø|õ|ö]/'; $pattern[9] = '/[ú|û|ù|ü]/'; $replacement = array(); $replacement[0] = 'A'; $replacement[1] = 'E'; $replacement[2] = 'I'; $replacement[3] = 'O'; $replacement[4] = 'U'; $replacement[5] = 'a'; $replacement[6] = 'e'; $replacement[7] = 'i'; $replacement[8] = 'o'; $replacement[9] = 'u'; return preg_replace($pattern, $replacement, $str); } $txt = $_POST['your_htmled_text']; //Convert to your system's charset. I checked this on the php.ini $txt = iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $txt); //Apply your function $txt = quit_accenture($txt); //output print_r($txt); 

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