Pregunta

Tengo un archivo que contiene caracteres Unicode en un servidor que ejecuta Linux. Si SSH en el servidor y el uso para rellenar la ficha para navegar hasta la carpeta que contiene caracteres Unicode de archivos / no tengo ningún problema de acceso al archivo / carpeta. El problema surge cuando intento acceder al archivo a través de PHP (la función que estaba teniendo acceso al sistema de archivos de la era stat). Si el camino de salida generada por el script PHP para el navegador y pégala en el terminal el archivo también parece existir (aunque mirando el terminal de las rutas de los archivos son exactamente los mismos).

I puse PHP utilizar UTF8 como su codificación predeterminada a través de php_ini así como conjunto mb_internal_encoding. Revisé la ruta de archivo PHP cadena de codificación y sale como UTF8, como debe ser. Hurgando un poco más que decidí hexdump el carácter é que para rellenar la ficha de la terminal y compararlo con el hexdump del carácter é 'regular' creado por el script PHP o introduciendo manualmente en el carácter a través del teclado (opción + e + e en OS X). Aquí está el resultado:

echo -n é | hexdump
0000000 cc65 0081                              
0000003
echo -n é | hexdump
0000000 a9c3                                   
0000002

El carácter electrónico que permite una referencia de archivo correcta en el terminal es el de 3 bytes uno. No estoy seguro de dónde ir desde aquí, lo que se debe utilizar la codificación en PHP? Debería estar en la conversión de la ruta a otra codificación a través de iconv o mb_convert_encoding?

¿Fue útil?

Solución

Gracias a los consejos que se dan en las dos respuestas que fue capaz de hurgar y encontrar algunos métodos para la normalización de las diferentes descomposiciones Unicode de un carácter determinado. En la situación en que se encontraba con que estaba accediendo a los archivos creados por una aplicación Carbon OS X. Es una aplicación bastante popular y por lo tanto sus nombres de archivo parecía adherirse a una descomposición Unicode específico.

En PHP 5.3 un nuevo conjunto de funciones fue introducido que permite a normalizar una cadena unicode a una descomposición en particular. Al parecer hay cuatro niveles de descomposición que se puede descomponer en cadena Unicode. Python ha tenido los capacidad de normalización Unicode desde la versión 2.3 a través de unicode.normalize . Este artículo sobre el manejo del pitón de cadenas Unicode fue útil para la comprensión de codificación / cadena de manipulación un poco mejor.

Aquí está un ejemplo rápido en la normalización de una ruta de archivo Unicode:

filePath = unicodedata.normalize('NFD', filePath)

He encontrado que el formato NFD trabajó para todos mis propósitos, me pregunto si esto es esto es la descomposición estándar para nombres de archivo Unicode.

Otros consejos

La secuencia de tres bytes es en realidad la representación utf8 de un e ( 0x65) seguido de un rel="nofollow combinando '(0x81 0xCC) , mientras que 0xa9 0xC3 está "directamente" para e .
Un UTF-8 cotejo conscientes deben ser conscientes de los posibles descomposiciones, pero no sé cómo se puede permitir que (y probablemente volver a compilar el código fuente de PHP) en un mac.
Lo mejor que puedo ofrecer es la "Usando UTF-8 con Gentoo" Descripción.

En primer lugar: Usted debe tratar de evitar la imposición de la semántica de los nombres de los archivos. Realmente no puedo decir por qué PHP es la generación de nombres de archivo en el escenario, así que no puedo sugerir cómo se debe aplicar esta regla.

Las representaciones diferentes (dos bytes y tres bytes) de E son UTF-8 codificaciones de las variaciones compuestas y descompuestos de este carácter en Unicode. En Unicode estas son formas distintas de representar el mismo carácter visual. Unicode tiene el concepto de "canonicalisation" en el que todas las representaciones de la misma naturaleza se convierten en una sola representación, algo así como aplastando dos cadenas en minúsculas para llevar a cabo una comparación sin vaina.

Linux no realiza canonicalisation o cualquier otro tipo de elaboración automática de nombres de archivo, por lo que un archivo puede ser nombrado con precompuesto (como la secuencia de dos bytes) o descompuestos (como la secuencia de tres bytes) caracteres o cualquier mezcla de los dos, que es hasta el que el nombre del archivo. Si va a crear los archivos, puede establecer una política (por ejemplo, usar siempre caracteres precompuestas) y escribir algo de código para hacerla cumplir. De lo contrario, no se puede confiar en ninguna regla particular aquí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top