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);
¿Este código es actual? ¿No cambió $ fname con $ res en file_get_contents, o fue solo un error tipográfico? – ryanday
Este es mi error tipográfico. De hecho, cambié los valores. –
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