2012-04-05 10 views
10

Aquí es algunos ejemplos de nombres de archivo:Cómo codificar nombres de archivos multibyte en PHP y decodificarlos en javascript?

漢語.jpg (Chinese) 
Федерация.jpg (Russian) 
AbÇöişÜĞ.jpg (Turkish, ISO-8859-9) 
... 

He tratado rawurlencode(mb_convert_encoding($file, "UTF-8", mb_detect_encoding($file))) pero esto no está funcionando, todos los caracteres chinos y rusos impresos como% 3F (signo de interrogación) y regular de todos los caracteres turcos se retiran.

Estoy haciendo pruebas en Windows, PHP 5.3.

La única solución que encontré es ingresar la codificación explícitamente: rawurlencode(mb_convert_encoding($file, "UTF-8", "ISO-8859-9")) Esto funciona solo para caracteres turcos. Por favor, mb_detect_encoding($file) siempre devuelve "UTF-8" para los archivos anteriores.

EDIT:
Después me encontré el siguiente código creo mb_convert_encoding() canto solucionamos mi problema:

$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator("mp", FilesystemIterator::UNIX_PATHS)); 
$iterator = new RegexIterator($iterator, '/^.+\.(gif|jpg|jpeg|png)$/i', RegexIterator::GET_MATCH); 

foreach ($iterator as $file) 
{ 
    foreach (mb_list_encodings() as $encoding) 
     var_dump(rawurlencode(mb_convert_encoding($file[0], "UTF-8", $encoding)) . " : " . $encoding); 
} 

supongo que esto es algo acerca de la codificación, pero no sé cómo hacerlo.

+0

mb_detect_encoding() no es omnisciente y se producirá un error con frecuencia, simplemente porque es casi imposible saber con certeza lo que codifica un fragmento de texto utiliza. –

Respuesta

1

Por lo tanto, lo principal es que la mayoría de los transportes (red, archivos, rpc) querrán caracteres que son un byte como máximo. La codificación URL (% FF) también espera que los datos de entrada sean un byte por carácter.

Entonces, lo que necesita hacer es utilizar UTF8. Tomará caracteres de varios bytes y creará una cadena de caracteres de 1 byte. A partir de esta cadena, puede hacer las cosas normalmente que Ascii podría hacer.

Lo que se quiere hacer es establecer explícitamente la codificación de PHP:

mb_internal_encoding("UTF-8"); 

Ahora todas sus cadenas internas y nombres de archivo, etc. será UTF-8 (un solo byte) codificado. Desde aquí puede hacer eco del nombre AS-IS y golpeará el transporte como datos codificados. Desde JavaScript, todo lo que tienes que hacer es enviar una solicitud usando AJAX, y todo estará decodificado para ti automáticamente, listo para usar en el navegador :) Solo asegúrate de configurar tu tipo de contenido en tu archivo html, ya que se usará como su codificación JS predeterminada.

<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ /> 
+0

Si uso 'mb_internal_encoding (" UTF-8 ");' en la parte superior del código sigue recibiendo la codificación incorrecta 'rawurlencode (mb_convert_encoding ($ archivo [0]," UTF-8 "));' (por ejemplo, aún caracteres rusos codificados como % 3F (?)) – ahk

+0

no deberías tener que usar mb_convert_encoding ($ file [0], "UTF-8"), o incluso rawurlencoding si solo haces eco de los datos de vuelta (php hará todas las cadenas UTF-8 de forma predeterminada –

+0

I no los utilicé al principio, pero obtuve caracteres extraños cuando solo hago eco de nombres de archivo. La codificación de archivos Html es UTF-8 sin origen y el tipo de contenido es también utf-8. La única solución que encontré es la anterior: 'rawurlencode (mb_convert_encoding ($ archivo, "UTF-8", "ISO-8859-9")) 'pero esto solo funciona para caracteres turcos, porque" ISO-8859-9 "es para turco: http://en.wikipedia.org/wiki/ ISO/IEC_8859-9 – ahk

Cuestiones relacionadas