2009-05-04 18 views
10

Después de investigar un poco cómo la manera diferente en que las personas slugify títulos, me he dado cuenta de que a menudo falta cómo lidiar con títulos no ingleses.reglas para babosas y unicode

La codificación de URL es muy restrictiva. Ver http://www.blooberry.com/indexdot/html/topics/urlencoding.htm

Así, por ejemplo, ¿cómo tratan la gente por las babosas de título para cosas como

"Una lágrima Cayó en la arena"

Uno puede llegar a una mesa razonable para indo idiomas europeos, es decir. cosas que pueden codificarse mediante ISO-8859-1. Por ejemplo, una tabla de conversión se traduciría 'a' => 'a', por lo que la bala sería

"una-lagrima-cayo-en-la-arena"

Sin embargo, estoy usando Unicode (en particular usando la codificación UTF-8), por lo que no hay garantías sobre qué tipo de código obtendré (tengo que prepararme para cosas que no pueden codificarse con ISO-8859-1.

I a nushell ¿Cómo lidiar con esto? ¿Debo encontrar una tabla de conversión para los caracteres en el rango ISO_8859-1 (< 255) y soltar todo lo demás?

EDITAR: para dar un poco más de contexto, a priori, realmente no espero relativizar datos en idiomas europeos no indo, pero me gustaría tener un plan si encuentro esos datos. Una tabla de conversión para el ASCII extendido sería agradable. ¿Alguna sugerencia?

Además, dado que la gente está pidiendo, estoy usando pitón, que se ejecuta en Google App Engine

+0

Por cierto, ¿hay alguna buena razón para que Unicode no esté permitido en las URL? – Zifre

Respuesta

8

La tabla de transliteración casi completa (para juegos de caracteres latinos, griegos y cirílicos) se puede encontrar en slughifi library. Está orientado a Django, pero se puede modificar fácilmente para adaptarse a las necesidades generales (lo uso con la aplicación basada en Werkzeug en AppEngine).

+0

Gracias zgoda, en mi situación (python, motor de aplicaciones), esta reforzada slugify hará el trabajo. – bustrofedon

+0

Asegúrese de agregar '# - * - codificación: utf-8 - * -' a la parte superior de slughifi.py –

1

Si todo esto falla, se puede utilizar una tabla de conversión, pero puede haber una solución mejor rendimiento disponible. ¿Qué idioma del lado del servidor estás usando?

+0

Estoy usando Python (el sitio se está ejecutando en el motor de la aplicación de Google) – bustrofedon

2

En general, esto dependerá del idioma que esperas obtener. Si su base de usuarios principal es japonesa, es poco probable que caiga todo menos los caracteres ISO-8859-1.

Dicho esto, una opción podría ser utilizar el modo de transliteración, si su biblioteca de conversión de juegos de caracteres lo admite. Por ejemplo, con iconv GNU, uno puede hacer:

] echo Una lágrima cayó en la arena|iconv -f utf8 -t ascii//TRANSLIT 
Una lagrima cayo en la arena 

Como se puede ver, los caracteres acentuados fueron convertidos automáticamente a algo en el rango ASCII. Cómo traducir esto al código dependerá, por supuesto, del idioma que esté utilizando, pero si su lenguaje está basado en el icono de GNU para la conversión del juego de caracteres (y si está en Linux, probablemente lo sea), este truco probablemente pueda aplicarse directamente por simplemente especificando "ascii // TRANSLIT" como el juego de caracteres convert-to.

Una cosa a tener en cuenta con esto, sin embargo, es que solo es efectivo con caracteres que "parecen" algo en ASCII. Por ejemplo:

] echo 我輩は猫である。名前はまだない。|iconv -f utf8 -t ascii//TRANSLIT            
???????????????? 

Como se puede ver, no es de mucha ayuda para los japoneses, y necesita un procesamiento adicional después para eliminar los caracteres que no son aptos para las direcciones URL.

+0

Gracias, no sabía acerca de la capacidad de iconv para "transcribir". Sin embargo, en el contexto de las aplicaciones web, iconv no es adecuado. Por no hablar del hecho de que el sitio se ejecuta en el motor de la aplicación de Google. – bustrofedon

4

Simplemente uso utf-8 para rutas de URL. Siempre que el dominio no sea IDN FF3, IE funciona bien con esto. Google lee y muestra correctamente. El IRI RFC permite Unicode. Solo asegúrate de analizar las URL entrantes correctamente.

+0

seguro, pero ¿cómo se hace un RegEx para caracteres Unicode? [- \ w] no coincidirá ** lágrima-cayó-en-la-arena ** –

+0

Uso .NET y admite Unicode en RegEx. Para javascript check jquery.validate y http://www.ibm.com/developerworks/web/library/wa-uri/index.html – felixg