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

1

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

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>

Что я делаю неправильно?

  • 0
    Ваш пример работает со мной, поэтому у вас должны быть проблемы с кодировкой где-то ...
  • 0
    Хорошо спасибо. По крайней мере, я знаю, что все делаю правильно. Тем не менее, это не облегчает мою головную боль: S У меня уже давно проблемы с кодированием. До этого был в phpmyadmin.
Показать ещё 5 комментариев
Теги:
string
unicode
utf-8

6 ответов

2
Лучший ответ

Я проверил ваш код, и ошибка в функции 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>
5

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

iconv('UTF-8', 'ASCII//TRANSLIT', $input);
  • 0
    Это хороший способ сделать это. Многие (разговорные) языки используют различные акценты, а также множественные акценты (как в ê + `= ề). Это не будет работать с таблицей замены, если она не является исчерпывающей.
4

Вы можете попробовать iconv.

3

Есть ли замена вообще, т.е. вы получаете одни и те же странные символы, когда вы печатаете $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​​strong > для Firefox.
  • 0
    Да, заменяются пробелы, а также другие символы, которые я не включил, такие как «.» Все мои файлы находятся в UTF-8, и если я печатаю, я вижу это правильно, поэтому я думаю, что это странно ...
0

Я столкнулся с этой проблемой раньше, и я попытался следить за выводами этого сообщения и другими, которые я нашел по дороге, и не было простого решения, потому что вы должны знать кодировку, которую использует ваша система (в моем случае 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 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);

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

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню