2009-06-10 11 views
7

Por ejemplo, tengo un nombre de archivo como este - проба.xml y no puedo abrirlo desde el script PHP.¿Cómo abrir un archivo en PHP que tenga caracteres Unicode en su nombre?

Si script de configuración php para estar en UTF-8 que todo el texto en escritura es UTF-8 por lo tanto cuando paso esto a file_get_contents:

$fname = "проба.xml"; 
file_get_contents($fname); 

me sale error que el archivo no existe. La razón de esto es que en Windows (XP) todos los nombres de archivos con caracteres no latinos son unicode (UTF-16). Aceptar lo que he intentado esto:

$fname = "проба.xml"; 
$res = mb_convert_encoding($fname,'UTF-8','UTF-16'); 
file_get_contents($res); 

Pero el error persiste desde file_get_contents no pueden aceptar cadenas Unicode ...

¿Alguna sugerencia?

+0

¿Este código es actual? ¿No cambió $ fname con $ res en file_get_contents, o fue solo un error tipográfico? – ryanday

+0

Este es mi error tipográfico. De hecho, cambié los valores. –

+0

Llegué a mi sistema XP e intenté con tu código. Guardé el archivo PHP en Unicode, y copié/pegué lo que escribiste y puedo leer el archivo (mismo nombre de archivo). ¿En qué codificación está guardado el archivo de origen? – ryanday

Respuesta

0

Estas son las conclusiones hasta ahora:

  1. PHP 5 no pueden nombre de fichero abierto con los caracteres Unicode a no ser que el nombre del archivo fuente es Unicode.
  2. PHP 5 (al menos en Windows XP) no puede procesar la fuente PHP en Unicode.

lo tanto la conclusión de que esto no factible en PHP 5.

+0

PHP puede abrir un nombre de archivo con caracteres que no sean ASCII solo si todos los caracteres están en la página de códigos predeterminada de la instalación de Windows. Puede tratar con cadenas literales que contienen caracteres no ASCII; simplemente usa los bytes directos, así que la forma en que esto funcione dependerá de la codificación en la que hayas guardado el archivo fuente, en tu editor de texto. La codificación que muchos editores de texto de Windows denominan incorrectamente "Unicode" es, de hecho, UTF-16LE, que, al no ser compatible con ASCII, PHP no puede tratar. Consulte [esta pregunta] (http://stackoverflow.com/q/482342/18936) para ver el fondo. – bobince

0

Usted podría intentar:

  • conseguir la cadena para el nombre de archivo de una lista de directorios utilizando opendir y readdir
  • pasar esa cadena a file_get _contents para ver si eso va a trabajar, o
  • intentar conseguir el contenido del archivo usando fopen, fread y fclose

Espero que ayude!

+0

¿Podría incluir ejemplos de código para mostrar cómo funcionaría esto? –

8

ACTUALIZACIÓN (Julio 13 '17)

Aunque no parecen los documentos mencionar que, PHP 7.0 y superior, finalmente, soporta Unicode nombres de archivo Windows fuera de la caja. Las API del sistema de archivos de PHP aceptan y devuelven nombres de archivos según default_charset, que es UTF-8 de forma predeterminada.

Consulte la corrección de errores aquí: https://github.com/php/php-src/commit/3d3f11ede4cc7c83d64cc5edaae7c29ce9c6986f


ACTUALIZACIÓN (enero 29 de '15)

Si usted tiene acceso al directorio de extensiones de PHP, puede intentar instalar php-wfio.dll en https://github.com/kenjiuno/php-wfio, y se refieren a archivos a través del protocolo wfio://.

file_get_contents("wfio://你好.xml"); 

original respuesta

PHP en Windows utiliza el legado "API ANSI" exclusivamente para acceso a archivos locales, lo que significa PHP usa la configuración regional Sistema en lugar de Unicode.

Para acceder a los archivos cuyos nombres de archivo contienen Unicode, debe convertir el nombre de archivo a la codificación especificada para la configuración regional del sistema actual. Si el nombre de archivo contiene caracteres que no son representables en la codificación especificada, no tiene suerte(Actualización: consulte la sección anterior para obtener una solución). scandir devolverá un galimatías para estos archivos y devolverá la cadena en fopen y los equivalentes fallarán.

Para encontrar la codificación correcta de usar, se puede obtener la configuración regional del sistema llamando <?=setlocale(LC_TYPE,0)?>, y mirando la página de códigos de identificación (el número después del .) en el artículo de MSDN https://msdn.microsoft.com/en-us/library/dd317756(VS.85).aspx.

Por ejemplo, si la función devuelve Chinese (Traditional)_HKG.950, significa que la página de códigos 950 está en uso y el nombre de archivo debe convertirse a la codificación big-5. En ese caso, el código tendrá que ser de la siguiente manera, si el archivo se guarda en UTF-8 (preferiblemente sin BOM):

$fname = iconv('UTF-8','big-5',"你好.xml"); 
file_get_contents($fname); 

o de la siguiente manera si se guarda directamente el archivo como Big-5:

$fname = "你好.xml"; 
file_get_contents($fname); 
+0

Gracias por esta actualización. –

+0

Hola, ¿me puede decir cómo extraer el archivo .zip, que contiene el nombre de los archivos es UTF-8 –

Cuestiones relacionadas