Wordpress/Apache: error 404 con caracteres Unicode en nombres de archivo de imagen

Recientemente movimos un sitio web a un nuevo servidor y nos encontramos con un problema extraño en el que algunas imágenes cargadas con caracteres Unicode en el nombre de archivo nos dan un error 404.

A través de ssh/FTP, podemos ver que los archivos definitivamente están ahí.

Por ejemplo:

http://sjofasting.no/project/adnoy

ninguna de las imágenes funciona:

Código:

<img class='image-display' title='' src='http://sjofasting.no/wp/wp-content/uploads/2012/03/ådnøy_1_2.jpg' width='685' height='484'/>

SSH:

-rw-r--r-- 1 xxxxxxxx xxxxxxxx 836813 3 de agosto 16:12 ådnøy_1_2.jpg

Lo que también es extraño es que si navega hasta el directorio, incluso puede hacer clic en la imagen y funciona:

http://sjofasting.no/wp/wp-content/uploads/2012/03/

haga clic en 'ådnøy_1_2.jpg' y funciona.

De alguna manera wordpress está generando

http://sjofasting.no/wp/wp-content/uploads/2012/03/ådnøy_1_2.jpg

y copiando desde la búsqueda directa de carpetas está generando

http://sjofasting.no/wp/wp-content/uploads/2012/03/a%CC%8Adn%C3%B8y_1_2.jpg

¿¿Que esta pasando??


editar:

Si copio la URL de la imagen de la fuente de wordpress, obtengo:

http://sjofasting.no/wp/wp-content/uploads/2011/11/Bore-Strand-Hotellg%C3%A5rd-12.jpg

Cuando copio desde el navegador apache me sale:

http://sjofasting.no/wp/wp-content/uploads/2011/11/Bore-Strand-Hotellga%cc%8ard-12.jpg

¿Qué podría explicar esta discrepancia entre: %C3%A5 y %cc%8?

??

preguntado el 30 de agosto de 12 a las 16:08

1 Respuestas

Normalización Unicode.

0xC3 0xA5 es la codificación UTF-8 para U+00E5 a-with-ring.

0xCC 0x8A es la codificación UTF-8 para el anillo de combinación U+030A.

U + 0035 es la forma compuesta (forma normal C) de escribir un anillo en A; un a letra seguida de U+030A es la forma descompuesta (forma normal D) de escribirla. å vs å - deben tener el mismo aspecto, aunque pueden diferir ligeramente según la representación de la fuente.

Ahora, normalmente no importa cuál tengas porque los sistemas de archivos sensibles los dejan intactos. Si guarda un archivo llamado [char U+00E5].txt (å.txt), sigue llamándose así en Windows y Linux.

Las Mac, por otro lado, son una locura. El sistema de archivos prefiere la forma normal D, en la medida en que cualquier carácter compuesto que le pase se convierte en caracteres descompuestos. Si pones un archivo llamado [char U+00E5].txt e inmediatamente enumere el directorio, encontrará que en realidad tiene un archivo llamado a[char U+030A].txt. Usted puede todavía acceder al archivo como [char U+00E5].txt en una Mac porque convertirá esa entrada en Normal Form D también antes de buscarla, pero no pueden recupere el mismo nombre de archivo en términos de secuencia de caracteres que puso: es una conversión con pérdida.

Entonces, si guarda sus archivos en una Mac y luego los transfiere a un sistema de archivos donde [char U+00E5].txt y a[char U+030A].txt consulte diferentes archivos, obtendrá enlaces rotos.

Actualice las páginas para que apunten a las versiones Normal Form D de las URL, o vuelva a cargar los archivos desde un sistema de archivos que no manipule de manera notoria los caracteres Unicode.

Piense diferente, cause extraños problemas de interoperabilidad.

Respondido 30 ago 12, 23:08

Wow, gracias por la respuesta, eso es realmente informativo. Debe ser el problema también porque primero tuve que descargar todos los archivos localmente antes de copiarlos en el nuevo servidor. (por alguna razón, rsync no funcionaba). Primero probaré scp y espero que eso solucione las cosas. Sin embargo, por curiosidad, ¿cómo obtengo exactamente la versión Normal Form D de estos nombres de archivo? Estoy un poco confundido porque estoy acostumbrado a simplemente escribir å con opt+a - gofre

¡De acuerdo! SCPed todo está bien ahora. (Recuerdo que originalmente el antiguo servidor no nos proporcionaba acceso ssh/shell). Que extraño problema. Gracias por la ayuda, realmente me estaba confundiendo con toda la situación. Sin embargo, mi pregunta final sigue en pie, ¿cómo puedo asegurarme de que estoy usando un Formulario universalmente compatible en el futuro cuando uso una Mac? - gofre

No estoy seguro de qué formulario opt+a le dará (no tengo mi VM OS X aquí para verificar, pero sospecho que el formulario D es normal). Pero puede estar seguro de que si crea un archivo en OS X, escriba opt+A en el nombre del archivo, presione Entrar, luego cambie el nombre, el å habrá en Normal Form D, por lo que puede copiarlo y pegarlo donde lo necesite. Una forma rápida de averiguar lo que tienes es ejecutar Python en la línea de comandos y pegar el carácter en una cadena: >>> u'å' - Python debería responder imprimiendo la cadena con escapes Unicode, por lo que obtendría u'\xE5' para NFC o u'a\u030A' para NDF. - bobince

Cuando los nombres de archivo en otros sistemas, debe asegurarse de que estén en forma descompuesta si desea que sean compatibles con Mac. Desafortunadamente, aunque tanto Windows como Linux admiten bien las formas compuestas y descompuestas, sus distribuciones de teclado se configuran de forma predeterminada para escribir la forma compuesta. - bobince

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.