182 votos

Microsoft Excel destroza diacríticos en csv?

Estoy programación exportación de datos (usando PHP 5.2) en un archivo de archivo de prueba.
Ejemplo de datos: Numéro 1 (note the accented e). Los datos utf-8 (no antepone BOM)

Cuando yo abra este archivo en MS excel se muestra como Numéro 1

Soy capaz de abrir en un editor de texto UltraEdit) que se visualiza correctamente. UE informa el carácter decimal 233.

¿Cómo puedo exportar los datos de texto en un archivo .csv para que MS excel se procesa correctamente, preferiblemente, sin forzar el uso del asistente de importación, o no predeterminado del asistente de configuración?

229voto

James Baker Puntos 2936

Un formato correcto UTF8 archivo puede tener una Marca de Orden de Bytes como sus tres primeros octetos. Estos son los valores hexadecimales 0xEF, 0xBB, 0xBF. Estos octetos sirven para marcar el archivo como UTF8 (ya que no son relevantes como "el orden de los bytes" de la información).1 Si dicha lista no existe, el consumidor/lector está a la izquierda para inferir el tipo de codificación del texto. Los lectores que no son UTF8 capaz de leer los bytes como algunos otros de codificación tales como Windows-1252 y mostrar los caracteres  en el inicio del archivo.

Hay un error conocido que Excel al abrir un UTF8 archivos csv a través de asociación de archivo, se supone que son de un solo byte de codificación, ignorando la presencia de la UTF8 lista de materiales. Esto puede no ser fijado por cualquier sistema de página de códigos predeterminada o configuración de idioma. La lista de materiales no va en la pista de Excel - no funcionará. (Una minoría informe afirma que la lista de materiales que a veces desencadena la "Importación de Texto" asistente.) Este error parece existir en Excel 2003 y en versiones anteriores. La mayoría de los informes (en medio de las respuestas aquí) dicen que esto es fija en Excel 2007 y posteriores.

Tenga en cuenta que usted puede siempre* abra correctamente UTF8 cdv archivos en Excel con la función de "Importar Texto" wizard, que permite especificar la codificación del archivo que va a abrir. Por supuesto, esto es mucho menos cómodo.

Los lectores de esta respuesta es más probable en una situación en la que ellos no apoyan especialmente Excel < del 2007, pero el envío de crudo UTF8 texto a Excel, que es malinterpretar y la aspersión de su texto con à y otros similares de Windows-1252 caracteres. La adición de la UTF8 BOM es probablemente su mejor y más rápida de arreglar.

Si usted se queda con los usuarios en las personas de edad se Destaca, y el Excel es el único consumidor de su CSVs, usted puede evitar esto mediante la exportación de UTF16 en vez de UTF8. Excel 2000 y 2003 se haga doble clic en abrir estos correctamente. (Algunos otros editores de texto pueden tener problemas con la UTF16, así que usted puede tener que considerar sus opciones cuidadosamente.)


* Excepto cuando no se puede, (al menos) de Excel 2011 para Mac del Asistente de Importación, en realidad, no siempre funciona con todas las codificaciones, independientemente de lo que usted diga. </anecdótica-pruebas> :)

30voto

oniryx Puntos 191

A continuación se muestra el código PHP que utilizo en mi proyecto al enviar Microsoft Excel al usuario:

   /**
   * Export an array as downladable Excel CSV
   * @param array   $header
   * @param array   $data
   * @param string  $filename
   */
  function toCSV($header, $data, $filename) {
    $sep  = "\t";
    $eol  = "\n";
    $csv  =  count($header) ? '"'. implode('"'.$sep.'"', $header).'"'.$eol : '';
    foreach($data as $line) {
      $csv .= '"'. implode('"'.$sep.'"', $line).'"'.$eol;
    }
    $encoded_csv = mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
    header('Content-Description: File Transfer');
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment; filename="'.$filename.'.csv"');
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: '. strlen($encoded_csv));
    echo chr(255) . chr(254) . $encoded_csv;
    exit;
  }
 

ACTUALIZADO: Nombre del archivo y mejora arreglar error cálculo de la longitud correcta. Gracias a Trig y @ ivanhoe011

10voto

daniels Puntos 6542

seleccione UTF-8 Enconding al importar. si utiliza Office 2007 que es donde lo elegiste: justo después de abrir el archivo.

8voto

Johal Puntos 223

Echo BOM UTF-8 antes de imprimirla datos CSV. Esto soluciona todos los problemas de carácter de Windows, pero no funciona para Mac.

 echo "\xEF\xBB\xBF";
 

Funciona para mí porque tengo que generar un archivo que se utilizará sólo con Windows PC.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X