PHP: Substituir tremas com mais próximo ASCII equivalente de 7 bits em uma string UTF-8

StackOverflow https://stackoverflow.com/questions/158241

  •  03-07-2019
  •  | 
  •  

Pergunta

O que eu quero fazer é remover todos os acentos e tremas de uma corda, girando "Lärm" em "Larm" ou "André" em "andre". O que eu tentei fazer foi utf8_decode a corda e, em seguida, uso strtr sobre ele, mas desde que meu arquivo de origem é salvo como UTF-8 arquivo, eu não posso digitar os caracteres ISO-8859-15 para todos os tremas - o editor insere o caracteres UTF-8.

Obviamente, uma solução para isso seria ter uma inclusão que é uma-ISO 8859-15 arquivo, mas deve haver uma maneira melhor do que ter outra necessário incluir?

echo strtr(utf8_decode($input), 
           'ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ',
           'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy');

UPDATE: Talvez eu estivesse um pouco imprecisa com o que eu tento fazer:. Eu realmente não deseja remover os tremas, mas para substituí-los com o seu mais próximo "um ASCII caráter" equivalente

Foi útil?

Solução

iconv("utf-8","ascii//TRANSLIT",$input);

Outras dicas

Um pequeno truque que não requer configuração locais ou ter grandes tabelas de tradução:

function Unaccent($string)
{
    if (strpos($string = htmlentities($string, ENT_QUOTES, 'UTF-8'), '&') !== false)
    {
        $string = html_entity_decode(preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|tilde|uml);~i', '$1', $string), ENT_QUOTES, 'UTF-8');
    }

    return $string;
}

O único requisito para que ele funcione corretamente é salvar seus arquivos em UTF-8 (como você já deve).

Você também pode tentar este

$string = "Fóø Bår";
$transliterator = Transliterator::createFromRules(':: Any-Latin; :: Latin-ASCII; :: NFD; :: [:Nonspacing Mark:] Remove; :: Lower(); :: NFC;', Transliterator::FORWARD);
echo $normalized = $transliterator->transliterate($string);

mas você precisa ter http://php.net/manual/en/book .intl.php disponível

Ok, encontrou uma solução óbvia a mim mesmo, mas não é a melhor sobre o desempenho ...

echo strtr(utf8_decode($input), 
           utf8_decode('ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ'),
           'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy');

Para usuários árabes e persas eu recomendo este maneira de remover diacríticos:

    $diacritics = array('َ','ِ','ً','ٌ','ٍ','ّ','ْ','ـ');
    $search_txt = str_replace($diacritics, '', $diacritics);

Para diacríticos de digitação em teclados árabes u pode usar este Asci (esses códigos são Asci não Unicode) códigos em editores de janelas digitando diacriticos directamente ou segurando Alt + (digitar o código de carácter diacrítico) Este é os códigos

(0243) (0246) (0245) (0240) (0242) (0241) (0250) (0248) (0220)

Descobri que este dá os resultados mais consistentes em francês e alemão. com o conjunto de meta tag para utf-8, eu tenho colocá-lo em uma função para retornar uma linha a partir de uma variedade de palavras e ele funciona perfeito.

htmlentities (  $line, ENT_SUBSTITUTE   , 'utf-8' ) 

Se você estiver usando WordPress, você pode usar o remove_accents( $string )

built-in função

https://codex.wordpress.org/Function_Reference/remove_accents

No entanto notei um erro:. Não funciona em uma corda com um único caractere

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top