Pregunta

Un sitio web Recientemente he terminado con un amigo tiene una galería donde se puede subir imágenes y archivos de texto. El archivo de texto sólo se acepta (al desarrollo facilidad) es .txt y, normalmente, va a pedir de boca (o no ..)

Los problemas que he encontrado son los mismos de cualquier desarrollador:. ASCII extendido de Microsoft

Antes de dar salida al texto del archivo, voy lo largo de varias capas diferentes para tratar de limpiarlo:

$txtfile = file_get_contents(".".$this->var['submission']['file_loc']);

// BOM Fun
    $boms = array
    (
        "utf8"    => array(3,pack("CCC",0xEF,0xBB,0xBF)),
        "utf16be"       => array(2,pack("CC",0xFE,0xFF)),
        "utf16le"       => array(2,pack("CC",0xFF,0xFE)),
        "utf32be"       => array(4,pack("CCCC",0x00,0x00,0xFE,0xFF)),
        "utf32le"       => array(4,pack("CCCC",0xFF,0xFE,0x00,0x00)),
        "gb18030"       => array(4,pack("CCCC",0x84,0x31,0x95,0x33))
    );
    foreach($boms as $bom)
    {
        if(mb_substr($txtfile,0,$bom[0]) == $bom[1])
        {
            $txtfile = substr($txtfile,$bom[0]);
            break;
        }
    }
$txtfile_o = $txtfile;
$badwords = array(chr(145),chr(146),chr(147),chr(148),chr(151),chr(133));
$fixwords = array("'","'",'"','"','-','...');
$txtfile_o = str_replace($badwords,$fixwords,$txtfile_o);
$txtfile_o = mb_convert_encoding($txtfile_o,"UTF-8");

El str_replace es el método general de la conversión de las citas de Microsoft terribles inteligentes, guión largo y puntos suspensivos en sus equivalentes ASCII normales para la salida.

Este código funciona perfectamente encuentre bajo la condición de que el archivo subido es ANSI / US-ASCII.

Este código no funciona (por ninguna razón en particular) cuando el archivo subido es UTF-8.

Cuando el archivo es UTF-8, se muestran el propio archivo en el navegador web funciona bien, pero que se puede imprimir a través de la interfaz web utilizando el código no lo hace. En este caso, las comillas inteligentes se convierten en una especie de acentuado carácter.

Aquí es donde estoy atascado. La salida de la codificación de la página web es UTF-8, el navegador web ve como UTF-8, el archivo está en UTF-8 y, sin embargo ni la sustitución de las citas de obras inteligentes ni la pantalla del navegador web correctamente.

Cualquier y toda la ayuda en esto sería muy apreciado.

¿Fue útil?

Solución

Si he entendido bien su problema es que su código que reemplaza los caracteres ASCII "extendida" de sus homólogos ASCII falla cuando el usuario somete un archivo en UTF-8.

Esto era de esperar. No se puede operar en UTF-8 archivos con str_replace y similares, que operan a nivel de byte, mientras que un carácter en UTF-8 está constituido por un byte solamente para los caracteres en el rango ASCII.

Lo que yo recomiendo que hagas es utilizar algún heurística para determinar si el archivo está codificado en UTF-8 (la lista de materiales es una forma buena si está seguro de que va a estar presente) o Windows-1252 o lo que sea y luego convertirlo a UTF-8 si no lo es. En ese caso, no habría necesidad de reemplazar ningún carácter, se podía conservar las comillas tipográficas.

Otros consejos

Los personajes que están tratando de reemplazar a tener diferentes valores de bytes en UTF-8. En realidad, tienen más de un byte cada uno en UTF8. Usted está tratando de buscar para ellos con Windows codificación de valores y es por eso que no encontrará en ellos.

Busque las secuencias de bytes UTF-8 de los personajes y usarlos para la búsqueda.

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