Tengo un archivo CSV suministrado desde un cliente que tiene que ser analizado y se inserta en una base de datos mediante PHP.

Antes de insertar los datos en la DB, me quieren convertir a UTF-8, pero me parece que no puede encontrar la manera.

Esto es lo que tengo tratando de detectar los archivos de codificación:

$ enca -d -L zh ./artigos.txt 
    ./artigos.txt: Universal character set 2 bytes; UCS-2; BMP
    CRLF line terminators
    Byte order reversed in pairs (1,2 -> 2,1)

He intentado utilizar la función iconv pero se mete a la conversión y muestra el resultado con diferentes personajes de los originales.

Primera línea del archivo (base64):

IgAwADMAMQAxADkAIgAsACIANwAzADEAMwA0ADYAMgA2ADQAMAAwADEANQAiACwAIgBBAGcAcgBhAGYAYQBkAG8AcgAgAFIAYQBwAGkAZAAgADkAIABIAGUAYQB2AHkAIABEAHUAdAB5ACIALAAiAEEAZwByAGEAZgBvACAAOQAvADgALAAgADkALwAxADAALAAgADkALwAxADIALAAgADkALwAxADQAIgAsACIAMQAxADAAZgBsAHMAIgAsACIAIgAsACIAIgAsACIAIgAsACIAMAAzADEAMQA5AC4AagBwAGcAIgAsACIAIgAsACIAMQAsADIAMAAiACwAIgA1ADkALAA5ADAAIgAsACIAMgAiACwAIgAwACIALAAiADAAIgAsACIAMAAiACwAIgAwACIALAAiADAAIgAsACIAMAAiACwAIgAwACIALAAiADAAIgAsACIAMAAiACwAIgAwACIALAAiADAAIgAsACIAMAAiACwAIgAwACIALAAiADAAIgAsACIAMAAiACwAIgAwACIALAAiADAAIgAsACIAMAAiACwAIgAwACIALAAiADAAIgAsACIARgBhAGwAcwBlACIADQAK
  • extraer una muestra de texto, en particular, de un pequeño fragmento que rodea a los personajes que llegar en mal estado en la conversión. Transporte a nosotros binario seguro a través de base64_encode(). Entonces tal vez alguien puede identificarla. Supongo que podría ser big endian?
  • Agregó que la primera línea del archivo en el post original
InformationsquelleAutor Igor Azevedo | 2012-06-08

3 Comentarios

  1. 2

    Esto parece funcionar(little endian), pero no incluye cualquier omisión en caracteres ascii

    $s='IgAwADMAMQAxADkAIgAsACIANwAzADEAMwA0ADYAMgA2ADQAMAAwADEANQAiACwAIgBBAGcAcgBhAGYAYQBkAG8AcgAgAFIAYQBwAGkAZAAgADkAIABIAGUAYQB2AHkAIABEAHUAdAB5ACIALAAiAEEAZwByAGEAZgBvACAAOQAvADgALAAgADkALwAxADAALAAgADkALwAxADIALAAgADkALwAxADQAIgAsACIAMQAxADAAZgBsAHMAIgAsACIAIgAsACIAIgAsACIAIgAsACIAMAAzADEAMQA5AC4AagBwAGcAIgAsACIAIgAsACIAMQAsADIAMAAiACwAIgA1ADkALAA5ADAAIgAsACIAMgAiACwAIgAwACIALAAiADAAIgAsACIAMAAiACwAIgAwACIALAAiADAAIgAsACIAMAAiACwAIgAwACIALAAiADAAIgAsACIAMAAiACwAIgAwACIALAAiADAAIgAsACIAMAAiACwAIgAwACIALAAiADAAIgAsACIAMAAiACwAIgAwACIALAAiADAAIgAsACIAMAAiACwAIgAwACIALAAiADAAIgAsACIARgBhAGwAcwBlACIADQAK';
    $t=base64_decode($s);
    echo iconv('UCS-2LE', 'UTF-8', substr($t, 0, -1));//last byte was invalid
    • Que hice, gracias. Yo estaba usando ‘UCS-2’ en lugar de ‘UCS-2LE» antes, y no me recorte el último byte bien.
  2. 3

    Microsoft Excel CSV son generalmente Little Endian codificado (me tomó mucho tiempo aprender).
    Si usted quiere hacer uso de ellos, por ejemplo, con fgetcsv debe convertir el archivo en UTF-8 antes.
    Hago lo siguiente:

            $str=file_get_contents($file);
            $str= mb_convert_encoding($str, 'UTF-8', 'UCS-2LE'); 
            file_put_contents("converted_".$file, $str);
  3. 0

    python :

    Uno de los método para codificar

    Texto -> utf-16-ser -> hexadecimal

    Convertir de nuevo

    hexadecimal a binario y luego de la codificación utf-16 para el texto

    Nota : ucs-2be está en desuso y se mueven a utf-16-ser

    Decodificador

    import binascii
    code = '098 ... '
    decoded_text = binascii.unhexlify(code).decode('utf-16-be')

Dejar respuesta

Please enter your comment!
Please enter your name here