sustituir - PHP: Reemplazar diéresis con el equivalente ASCII de 7 bits más cercano en una cadena UTF-8
substr php (7)
De acuerdo, encontré una solución obvia, pero no es la mejor en cuanto a rendimiento ...
echo strtr(utf8_decode($input),
utf8_decode(''ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ''),
''SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy'');
Lo que quiero hacer es eliminar todos los acentos y diéresis de una cadena, convirtiendo "lärm" en "larm" o "andré" en "andre". Lo que traté de hacer fue utf8_decode la cadena y luego uso strtr en ella, pero como mi archivo fuente está guardado como un archivo UTF-8, no puedo ingresar los caracteres ISO-8859-15 para todas las diéresis: el editor inserta el Caracteres UTF-8.
Obviamente, una solución para esto sería incluir un archivo ISO-8859-15, pero debe haber una forma mejor que incluir otro requerido.
echo strtr(utf8_decode($input),
''ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ'',
''SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy'');
ACTUALIZACIÓN: Tal vez fui un poco inexacto con lo que trato de hacer: en realidad no quiero quitar las diéresis, sino reemplazarlas por el equivalente "de un carácter ASCII" más cercano.
Descubrí que este ofrece los resultados más consistentes en francés y alemán. con la metaetiqueta establecida en utf-8
, la he colocado en una función para devolver una línea de una matriz de palabras y funciona perfectamente.
htmlentities ( $line, ENT_SUBSTITUTE , ''utf-8'' )
Para los usuarios de árabe y persa, recomiendo esta forma de eliminar signos diacríticos:
$diacritics = array(''َ'',''ِ'',''ً'',''ٌ'',''ٍ'',''ّ'',''ْ'',''ـ'');
$search_txt = str_replace($diacritics, '''', $diacritics);
Para escribir signos diacríticos en teclados árabes, puede utilizar estos códigos Asci (esos códigos son Asci no Unicode) en los editores de Windows escribiendo diacríticos directamente o manteniendo presionado Alt + (escriba el código de carácter diacrítico) Estos son los códigos
(0243) (0246) (0245) (0240) (0242) (0241) (0250) (0248) (0220)
Si está usando WordPress, puede usar la función remove_accents( $string )
https://codex.wordpress.org/Function_Reference/remove_accents
Sin embargo, noté un error: no funciona en una cadena con un solo carácter.
Un pequeño truco que no requiere establecer configuraciones regionales o tener enormes tablas de traducción:
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;
}
El único requisito para que funcione correctamente es guardar sus archivos en UTF-8 (como debería hacerlo).
también puedes probar esto
$string = "Fóø Bår";
$transliterator = Transliterator::createFromRules('':: Any-Latin; :: Latin-ASCII; :: NFD; :: [:Nonspacing Mark:] Remove; :: Lower(); :: NFC;'', Transliterator::FORWARD);
echo $normalized = $transliterator->transliterate($string);
pero necesita tener http://php.net/manual/en/book.intl.php disponible
iconv("utf-8","ascii//TRANSLIT",$input);
example extendido