Estoy intentando eliminar los acentos de los caracteres en una cadena PHP como primer paso para hacer que la cadena se pueda utilizar en una URL.
Estoy usando el siguiente código:
$input = "Fóø Bår";
setlocale(LC_ALL, "en_US.utf8");
$output = iconv("utf-8", "ascii//TRANSLIT", $input);
print($output);
La salida que esperaría sería algo como esto:
F'oo Bar
Sin embargo, en lugar de transliterar los caracteres acentuados, se reemplazan con signos de interrogación:
F?? B?r
Todo lo que puedo encontrar en línea indica que establecer la configuración regional solucionará este problema, sin embargo, ya lo estoy haciendo. Ya he comprobado los siguientes detalles:
- La configuración regional que estoy configurando es compatible con el servidor (incluida en la lista producida por
locale -a
) - Las codificaciones de origen y destino (UTF-8 y ASCII) son compatibles con la versión del servidor de iconv (incluida en la lista producida por
iconv -l
) - La cadena de entrada está codificada en UTF-8 (verificada usando la
mb_check_encoding
función de PHP , como lo sugiere mercator en la respuesta ) - La llamada a
setlocale
es exitosa (regresa en'en_US.utf8'
lugar deFALSE
)
La causa del problema:
El servidor está utilizando una implementación incorrecta de iconv. Tiene la versión glibc en lugar de la versión libiconv requerida .
Tenga en cuenta que la función iconv en algunos sistemas puede no funcionar como esperaba. En tal caso, sería una buena idea instalar la biblioteca libiconv de GNU. Lo más probable es que termine con resultados más consistentes.
- Introducción del manual de PHP a iconv
Los detalles sobre la implementación de iconv que utiliza PHP se incluyen en la salida de la phpinfo
función.
(No puedo volver a compilar PHP con la biblioteca iconv correcta en el servidor con el que estoy trabajando para este proyecto, por lo que la respuesta que acepté a continuación es la más útil para eliminar acentos sin compatibilidad con iconv).
Respuestas:
Creo que el problema aquí es que sus codificaciones consideran ä y å símbolos diferentes a 'a'. De hecho, la documentación de PHP para strtr ofrece una muestra para eliminar los acentos de la manera más fea :(
http://ie2.php.net/strtr
fuente
mb_strstr
es la función incorrecta, y no haymb_strtr
¿Qué pasa con la implementación de WordPress ?
Para comprender mejor lo que hace esta función, consulte la tabla de conversión correspondiente aquí:
Puede generar esta tabla de convección usted mismo simplemente iterando sobre la
$chars
matriz de la función:fuente
Este es un fragmento de código que encontré y uso a menudo:
fuente
strtr()
no es compatible con varios bytes, si su archivo de secuencia de comandos está codificado en un formato multibyte (por ejemplo, UTF-8), esta función produce resultados incorrectos.ů, ž, ř, č, ...
Versión compatible con UTF-8 de la función simple publicada anteriormente por Gino:
Tuve que llegar a esto porque mi documento php estaba codificado en UTF-8.
Espero eso ayude.
fuente
si tiene http://php.net/manual/en/book.intl.php disponible, esto resolvió su problema
fuente
Lower()
no es necesario en este casoCuando se usa
iconv
, se debe establecer la configuración regional del parámetro:Rinde en:
Otras configuraciones regionales luego cs_CZ y en_US No he instalado y no puedo probarlo.
En C # veo una solución que usa la traducción a la forma normalizada Unicode: los acentos se dividen y luego se filtran a través de la categoría Unicode sin espacio.
fuente
La forma más sencilla es utilizar la
iconv()
función nativa de PHP.fuente
echo iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', 'usuario o contraseña incorrectos');
salidas muy confiablesusuario o contrase?a incorrectos
setlocale(LC_CTYPE, 'cs_CZ'); echo iconv('UTF-8', 'ASCII//TRANSLIT', "usuario o contraseña incorrectos"); // output: usuario o contrasena incorrectos
. Consulte la documentación de PHP para obtener más información. ¡Todo está ahí! php.net/manual/en/function.iconv.phpDe hecho es cuestión de gustos. Hay muchas formas de convertir tales letras.
fuente
Puede usar urlencode. No hace exactamente lo que desea (elimina los acentos), pero le dará una cadena utilizable de URL
En Perl, podría usar una expresión regular de traducción, pero no puedo pensar en el equivalente de PHP
etc ...
podrías hacer esto usando preg_replace
(Tenga en cuenta que esto se escribió a partir de una cerveza brumosa montada el viernes después del mediodía, por lo que puede no ser 100% correcto)
o podría hacer una tabla hash y hacer un reemplazo basado en eso.
fuente
aquí hay una función simple que uso generalmente para eliminar acentos:
fuente
Estoy de acuerdo con el comentario de georgebrock.
Si encuentra una manera de hacer que // TRANSLIT funcione, puede crear URL amigables:
$url = preg_replace( '/(\w)[^\w\s](\w)/', '$1$2', $url );
$url = preg_replace( '/[^a-z0-9]+/', '-', $url );
$url = preg_replace( '-'
por ejemplo'/(?:(^|\-)\-+|\-$)/', '', $url );
Si no puede hacer que funcione, reemplace setp 1 con strtr / reemplazo basado en caracteres, como la solución de Xetius.
fuente
No puedo reproducir tu problema. Obtengo el resultado esperado.
¿Cómo estás usando exactamente
mb_detect_encoding()
para verificar que su cadena sea de hecho UTF-8?Si simplemente llamo
mb_detect_encoding($input)
invoco una versión codificada en UTF-8 e ISO-8859-1 de su cadena, ambas devuelven "UTF-8", por lo que esa función no es particularmente confiable.iconv()
me da un "aviso" de PHP cuando obtiene la cadena codificada incorrectamente y solo hace eco de "F", pero eso podría deberse a diferentes configuraciones / versiones de PHP / iconv (?).Le sugiero que intente llamar
mb_check_encoding($input, "utf-8")
primero para verificar que su cadena realmente es UTF-8.Creo que probablemente no lo sea.fuente
Se fusionó la implementación de Cazuma Nii Cavalcanti con la lista de caracteres de Junior Mayhé, con la esperanza de ahorrar algo de tiempo para algunos de ustedes.
fuente
Acabo de crear un método removeAccents basado en la lectura de este hilo y este otro también ( ¿Cómo eliminar acentos y convertir letras en caracteres ASCII "simples"? ).
El método está aquí: https://github.com/lingtalfi/Bat/blob/master/StringTool.md#removeaccents
Las pruebas están aquí: https://github.com/lingtalfi/Bat/blob/master/btests/StringTool/removeAccents/stringTool.removeAccents.test.php ,
y esto es lo que se probó hasta ahora:
y convierte solo cosas acentuadas (letras / ligaduras / cédilles / algunas letras con una línea a través / ...?).
Aquí está el contenido del método: ( https://github.com/lingtalfi/Bat/blob/master/StringTool.php#L83 )
fuente
En laravel, simplemente puede usar
str_slug($accentedPhrase)
y, si le importa el guión (-), este método lo sustituye con espacio, puede usarstr_replace('-', ' ', str_slug($accentedPhrase))
fuente
str_slug($word, ' ');
¿Algo como esto?
fuente
Si la tarea principal es solo usar la cadena en una URL, ¿por qué no usar slugyfier ?
luego
También tiene muchos puentes para marcos populares. Por ejemplo, puedes usar Doctrine Extensions Sluggable comportamiento para generar automáticamente un slug único para cada entidad en la base de datos y usarlo en la URL.
Si solo desea eliminar todos los acentos, puede jugar con conjuntos de reglas para satisfacer los requisitos.
fuente
Puede usar un estilo de matriz clave => valor para usar con strtr () de manera segura para caracteres UTF-8 incluso si son de varios bytes.
Además, guarda la decodificación / codificación en la parte UTF-8.
fuente
Una versión mejorada de la
remove_accents()
función de acuerdo con la última versión de formato Wordpress 4.3 es:Mi respuesta es una actualización de la solución @dynamic ya que el rumano o quizás otros diacríticos de idiomas no se convirtieron. Escribí las funciones mínimas y funciona como un encanto.
fuente
fuente
Basado en la respuesta de @Mimouni, hice esta función para transliterar cadenas acentuadas a cadenas no acentuadas.
fuente
¿Qué pasa con este? Funciona con UTF8
Puede ser más rápido si no lo uso
preg_replace
, pero la velocidad no era mi objetivo aquí.fuente
Esta respuesta tengo los siguientes consejos aquí, por lo que no es realmente mía. Me funciona usando LATIN1 o UTF-8. Si usa otros juegos de caracteres, probablemente debería agregarlos a la
mb_detect_encoding
función. Probablemente también se necesite un entorno correcto.fuente
Fóø Bår
, en realidad, solo obtuveFo? Bar
. No se pudoø
traducir el carácter alo
. Intenté cambiar mi entorno a no_NO, da_DK, pero no interfirió. Usandosetlocale(LC_CTYPE,'da_DK')
tengoFo? Baar
.Uno de los trucos con los que me topé en la web fue usar htmlentities y luego quitar el carácter codificado:
No es perfecto, pero funciona bien en algunos casos.
Pero, está escribiendo sobre la creación de una cadena de URL, por lo que urlencode y su contraparte urldecode pueden ser mejores. O, si está creando una cadena de consulta, use esta última función: http_build_query .
fuente
La implementación de WordPress es definitivamente la más segura para cadenas UTF8. Para las cadenas Latin1, un strtr simple hace el trabajo, pero asegúrese de guardar su script en formato LATIN1, no en UTF-8.
fuente
fuente