2009-01-21 10 views
19

Reescribo URL para incluir el título de blogs de viaje generados por el usuario.Cómo manejar signos diacríticos (acentos) cuando reescribo 'URL bonitas'

Lo hago para la legibilidad de las URL y los fines de SEO.

 
http://www.example.com/gallery/280-Gorges_du_Todra/ 

El primer entero es el ello, el resto es para nosotros los seres humanos (pero es irrelevante para solicitar el recurso).

Ahora las personas pueden escribir títulos que contengan cualquier carácter UTF-8, pero la mayoría no están permitidos en la URL. Mi público es generalmente habla Inglés, pero ya que viajan, les gusta incluir nombres como

 
Aït Ben Haddou 

¿Cuál es la forma correcta de traducir esto para mostrar en una URL usando PHP en Linux.

Hasta ahora he visto varias soluciones:

  1. simplemente despojar todos los caracteres no permitidos, sustituir los espacios esto tiene resultados extraños:
    'Aït Ben Haddou' → /gallery/280-At_Ben_Haddou/
    No muy servicial.

  2. simplemente despojar todos los caracteres no permitidos, sustituir los espacios, deje charCode (stackoverflow.com) muy probablemente debido a la 'expresión regular-martillo' utilizado
    esto da resultados extraños: 'tést tést' → /questions/0000/t233st-t233st

  3. Traducir a ' equivalente más cercano '
    'Aït Ben Haddou' → /gallery/280-Ait_Ben_Haddou/
    Pero esto no funciona para el alemán; por ejemplo 'ü' debe ser transliterado 'ue'.

Para mí, como holandés, el 3er resultado "se ve mejor".
Estoy seguro de que (1) muchas personas tendrán una opinión diferente y (2) es simplemente incorrecta en el ejemplo alemán.

Otro problema con la tercera opción es: ¿cómo encontrar todos los caracteres posibles que se pueden convertir a un equivalente de 7 bits?

Así que la pregunta es:

  1. lo que, en su opinión, es el resultado más deseable. (dentro de los límites técnicos)

  2. Cómo solucionarlo técnicamente. (alcanza el resultado deseado) con PHP.

+0

"ü" estaría escrito como "ue". "Oe" es "ö". :) – Bombe

+0

[IDNA] (http://en.wikipedia.org/wiki/IDNA) –

+0

Conozco los nombres de dominio internacionalizados, pero no resuelven el problema para esa ruta de recursos, ni son muy legibles – Jacco

Respuesta

16

En última instancia, tendrá que renunciar a la idea de "correcto" para este problema.Traducir la cadena, sin importar cómo lo hagas, destruye la precisión en nombre de la compatibilidad y la legibilidad. Las tres opciones son igualmente compatibles, pero los números 1 y 2 sufren en términos de legibilidad. Así que simplemente corre con él y ve por lo que se vea mejor, opción # 3.

Sí, las traducciones son incorrectas para el alemán, pero a menos que empiece a exigir a sus usuarios que especifiquen en qué idioma están sus títulos (y restringiéndolos a uno solo), no resolverá ese problema sin mucho esfuerzo de lo que vale (Por ejemplo, ejecutando cada palabra en el título a través de los diccionarios para cada idioma conocido y la traducción de los signos diacríticos de que la palabra de acuerdo con las reglas de su lengua haría trabajo, pero es excesivo.)

Alternativamente, si el alemán es una preocupación mayor que otros lenguajes, que su traducción siempre usar la versión alemana, cuando existe uno: äae, ëe, ïi, öoe, üue.

Editar:

Ah, y en cuanto al método actual, me gustaría traducir los casos especiales, en su caso, a través de str_replace, a continuación, utilizar iconv para el resto:

$text = str_replace(array("ä", "ö", "ü", "ß"), array("ae", "oe", "ue", "ss"), $text); 
$text = iconv('UTF-8', 'US-ASCII//TRANSLIT', $text); 
+0

iconv // TRANSLIT se ve útil, gracias – Jacco

3

Para mí, la tercera es la más legible.

Puede usar un pequeño diccionario, p. ï -> i y ü -> ue para especificar cómo desea traducir varios caracteres.

+0

el problema es que se traduce de manera diferente para el francés y el alemán, y mucho menos para el turco o el vietnamita. – Jacco

+0

Quizás use diccionarios diferentes (si sabe qué idioma es), o siempre use el diccionario más simple, p. Ej. 'ü -> u'. – ChrisW

1

Como una nota al margen interesante, en SO nada parece importar realmente después de la identificación - este es un enlace a esta página:

How to handle diacritics (accents) when rewriting 'pretty URLs'

Es evidente que la motivación es permitir cambios de título y sin enlaces se rompen, y es posible que desee considerar esa característica también.

+0

Estoy usando una técnica similar en un proyecto, excepto si el "slug" proporcionado no concuerda, automáticamente 301 al "slug" correcto (ej./Questions/465990/why -does-this-link-go-the-same-place redirigiría a/questions/465990/how-to-handle-diacritics-accents-when-rewriting-pretty-urls). Creo que esto es generalmente deseable desde un punto de vista de SEO y estándares web generales: idealmente, un recurso debería ser accesible desde una, o como máximo, unas pocas URL, no los millones que SO permitirían actualmente. –

0

Ahora la gente puede escribir títulos que contengan cualquiera de caracteres UTF-8, pero la mayoría no están permitidos en la URL.

Por el contrario, la mayoría están permitidas. Véase, por ejemplo, las direcciones URL de Wikipedia - cosas como http://en.wikipedia.org/wiki/Café (también conocido como http://en.wikipedia.org/wiki/Caf%C3%A9) pantalla muy bien - incluso si rotulador de stackoverflow no se recupera a cabo correctamente :-)

El truco ellas es la lectura fiable en cualquier entorno de alojamiento; hay problemas con los servidores CGI y Windows, particularmente IIS, por ejemplo.

+0

Por supuesto, el soporte es tan irregular que su respuesta incluso proporciona un ejemplo de por qué generalmente no desea hacer esto: el reconocedor de URL de SO corta la "é" en su ejemplo de Café. –

+0

Mi navegador (Safari) hace esto automáticamente. Cada URL que ingreso en el campo de dirección se envía en UTF-8. – Gumbo

+0

Tengo que mantenerlo compatible con las antiguas computadoras que se encuentran en los cibercafés de todo el mundo. Pero tal vez debería haber dicho: URL de la vieja escuela :) – Jacco

1

tema muy bien, tenía el mismo problema hace un tiempo.
Así es como me fijo:

function title2url($string=null){ 
// return if empty 
if(empty($string)) return false; 

// replace spaces by "-" 
// convert accents to html entities 
$string=htmlentities(utf8_decode(str_replace(' ', '-', $string))); 

// remove the accent from the letter 
$string=preg_replace(array('@&([a-zA-Z]){1,2}(acute|grave|circ|tilde|uml|ring|elig|zlig|slash|cedil|strok|lig){1};@', '@&[euro]{1};@'), array('${1}', 'E'), $string); 

// now, everything but alphanumeric and -_ can be removed 
// aso remove double dashes 
$string=preg_replace(array('@[^a-zA-Z0-9\-_]@', '@[\-]{2,}@'), array('', '-'), html_entity_decode($string)); 
} 

Así es como mi función funciona:

  1. Convertir a HTML entidades
  2. suprimir los acentos
  3. quita todos los restantes caracteres extraños
+0

Puede usar htmlentities (str_replace ('', '-', $ string), ENT_QUOTES, "UTF-8")); –

0

Esta es una buena función:

function friendlyURL($string) { 
    setlocale(LC_CTYPE, 'en_US.UTF8'); 
    $string = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $string); 
    $string = str_replace(' ', '-', $string); 
    $string = preg_replace('/\\s+/', '-', $string); 
    $string = strtolower($string); 
    return $string; 
} 
Cuestiones relacionadas