Microsoft Excel mangles diakritiske tegn i CSV-filer?

stemmer
172

Jeg er programmatisk eksportere data (ved hjelp av PHP 5.2) i en CSV-testfilen.
Eksempel data: Numéro 1(merk aksent e). Dataene er utf-8(uten prepended BOM).

Når jeg åpner denne filen i MS Excel er skjermer som Numéro 1.

Jeg er i stand til å åpne denne i en teksteditor (UltraEdit) som viser den riktig. UE rapporterer karakteren er decimal 233.

Hvordan kan jeg eksportere tekstdata i en CSV-fil, slik at MS Excel vil korrekt gjengi det, helst uten å tvinge bruk av import veiviseren, eller innstillinger som ikke er standard veiviser?

Publisert på 30/09/2008 klokken 19:07
kilden bruker
På andre språk...                            


22 svar

stemmer
1

Dette er bare et spørsmål om tegnkodinger. Det ser ut som du eksporterer dataene som UTF-8: é i UTF-8 er den to-bytesekvens 0xC3 0xA9, som da tolkes på Windows-1252 er à ©. Når du importerer data til Excel, sørg for å fortelle den at den tegnkodingen du bruker er UTF-8.

Svarte 30/09/2008 kl. 19:11
kilden bruker

stemmer
0

Sjekk kodingen som du genererer filen, for å gjøre excel vise filen på riktig måte, må du bruke systemet standard kodesett.

Wich språk bruker du? hvis det er .Net du trenger bare å bruke Encoding.Default mens generere filen.

Svarte 30/09/2008 kl. 19:12
kilden bruker

stemmer
0

CSV-formatet er implementert som ASCII, ikke unicode, i Excel, og dermed rullet de diakritiske tegn. Vi opplevde det samme problemet som er hvordan jeg sporet opp at den offisielle CSV-standarden ble definert som ASCII-basert i Excel.

Svarte 30/09/2008 kl. 19:30
kilden bruker

stemmer
220

En korrekt formatert UTF8 filen kan ha en Byte Order Mark som sine tre første oktetter. Dette er de hex verdier 0xEF, 0xBB, 0xBF. Disse oktetter tjene til å merke filen som UTF8 (siden de ikke er relevant som "byte order" informasjon). 1. Hvis dette BOM ikke finnes, blir forbrukeren / leseren venstre for å utlede den kodingstype av teksten. Lesere som ikke er UTF8 stand vil lese byte som noen andre koding som Windows-1252 og viser tegn på begynnelsen av filen.

Det er en kjent feil der Excel, ved å åpne UTF8 CSV-filer via filtilknytning, forutsetter at de er i en Énbytestegn, ser bort fra tilstedeværelsen av UTF8 BOM. Dette kan ikke bli løst ved ethvert system som standard kodeside eller språkinnstillingen. BOM vil ikke peiling på Excel - det bare ikke vil fungere. (Et mindretall rapport hevder at BOM noen ganger utløser "Import Text" wizard.) Denne feilen ser ut til å eksistere i Excel 2003 og tidligere. De fleste rapporter (midt svarene her) sier at dette er løst i Excel 2007 og nyere.

Merk at du kan alltid * riktig åpne UTF8 CSV-filer i Excel ved hjelp av "Import Text" veiviser, som lar deg angi koding av filen du åpner. Dette er selvfølgelig mye mindre praktisk.

Lesere av dette svaret er mest sannsynlig i en situasjon der de ikke særlig støtte Excel <2007, men sender rå UTF8 tekst til Excel, som mistolker det og sprinkling din tekst med Ãog andre lignende Windows-1252 tegn. Legge til UTF8 BOM er trolig det beste og raskeste løsning.

Hvis du står fast med brukere på eldre utmerker, og Excel er den eneste forbruker av dine CSVs, kan du omgå dette ved å eksportere UTF16 stedet for UTF8. Excel 2000 og 2003 vil dobbeltklikk åpne disse på riktig måte. (Noen andre tekstbehandlingsprogram kan ha problemer med UTF16, slik at du kan ha til å veie alternativene nøye.)


* Bortsett fra når du ikke kan, (minst) Excel 2011 for Import Wizard Mac faktisk ikke alltid fungere med alle kodinger, uavhengig av hva du forteller det. </ Anekdotiske-bevis> :)

Svarte 30/09/2008 kl. 19:30
kilden bruker

stemmer
10

velg UTF-8 enconding ved import. hvis du bruker Office 2007 det er der du valgte det: rett etter at du åpner filen.

http://s4.tinypic.com/mv1bhi.jpg

Svarte 30/09/2008 kl. 19:33
kilden bruker

stemmer
35

Prepending en BOM (\ uFEFF) fungerte for meg (Excel 2007), i at Excel kjennes filen som UTF-8. Ellers lagrer den og bruke fungerer import veiviseren, men er mindre ideell.

Svarte 24/11/2008 kl. 15:11
kilden bruker

stemmer
4

Som Fregal sa \ uFEFF er veien å gå.

<%@LANGUAGE="JAVASCRIPT" CODEPAGE="65001"%>
<%
Response.Clear();
Response.ContentType = "text/csv";
Response.Charset = "utf-8";
Response.AddHeader("Content-Disposition", "attachment; filename=excelTest.csv");
Response.Write("\uFEFF");
// csv text here
%>
Svarte 27/02/2009 kl. 15:29
kilden bruker

stemmer
2

Du kan lagre en html-fil med filtypen 'xls' og aksenter vil fungere (pre 2007 minst).

Eksempel: lagre denne (ved hjelp av Lagre som utf8 i Notepad) som test.xls:

<html>
<meta http-equiv="Content-Type" content="text/html" charset="utf-8" />
<table>
<tr>
  <th>id</th>
  <th>name</th>
</tr>
<tr>
 <td>4</td>
 <td>Hélène</td>
</tr>
</table>
</html>
Svarte 05/06/2009 kl. 18:06
kilden bruker

stemmer
2

Jeg har også lagt merke til at spørsmålet var "svart" for en tid siden, men jeg forstår ikke historiene som sier at du ikke kan åpne en UTF8-kodet csv fil hell i Excel uten å bruke tekst veiviseren.

Min reproduserbar erfaring: Type Old MacDonald had a farm,ÈÌÉÍØi Notisblokk, trykk Enter, og deretter Lagre som (med UTF-8-alternativet).

Ved hjelp av Python for å vise hva som faktisk er der:

>>> open('oldmac.csv', 'rb').read()
'\xef\xbb\xbfOld MacDonald had a farm,\xc3\x88\xc3\x8c\xc3\x89\xc3\x8d\xc3\x98\r\n'
>>> ^Z

Flink. Notepad har satt en BOM på forsiden.

Nå går inn i Windows Utforsker, dobbeltklikk på filnavnet, eller høyreklikk og bruk "Åpne med ...", og opp spretter Excel (2003) med display som forventet.

Svarte 12/06/2009 kl. 01:01
kilden bruker

stemmer
29

Nedenfor er PHP-koden jeg bruker i mitt prosjekt når du sender Microsoft Excel til bruker:

  /**
   * 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;
  }

OPPDATERT: Filnavn forbedring og BUG fix beregning riktig lengde. Takket være Trig og @ ivanhoe011

Svarte 30/10/2009 kl. 06:50
kilden bruker

stemmer
0

Excel 2007 ordentlig leser UTF-8 med BOM (EF BB BF) kodet csv.

Excel 2003 (og kanskje tidligere) leser UTF-16LE med BOM (FF FE), men med faner i stedet for komma eller semikolon.

Svarte 05/11/2009 kl. 07:56
kilden bruker

stemmer
0

Jeg kan bare komme CSV å analysere riktig i Excel 2007 som tab-separerte lite endian UTF-16 starter med riktig byte rekkefølge mark.

Svarte 09/12/2009 kl. 11:22
kilden bruker

stemmer
8

Ekko UTF-8 BOM før utmating CSV-data. Dette løser alle tegnproblemer i Windows, men ikke arbeide for Mac.

echo "\xEF\xBB\xBF";

Det fungerer for meg fordi jeg trenger å generere en fil som skal brukes på Windows-PC-er.

Svarte 30/03/2011 kl. 14:26
kilden bruker

stemmer
1

Skrive en BOM til utgangen CSV-filen faktisk fungerte for meg i Django:

def handlePersoonListExport(request):
    # Retrieve a query_set
    ...

    template = loader.get_template("export.csv")
    context = Context({
        'data': query_set,
    })

    response = HttpResponse()
    response['Content-Disposition'] = 'attachment; filename=export.csv'
    response['Content-Type'] = 'text/csv; charset=utf-8'
    response.write("\xEF\xBB\xBF")
    response.write(template.render(context))

    return response

For mer info http://crashcoursing.blogspot.com/2011/05/exporting-csv-with-special-characters.html Takk folkens!

Svarte 26/05/2011 kl. 11:16
kilden bruker

stemmer
0

Med Ruby 1.8.7 jeg kode hvert felt til UTF-16 og kast BOM (kanskje).

Den følgende kode blir ekstrahert fra active_scaffold_export:

<%                                                                                                                                                                                                                                                                                                                           
      require 'fastercsv'                                                                                                                                                                                                                                                                                                        
      fcsv_options = {                                                                                                                                                                                                                                                                                                           
        :row_sep => "\n",                                                                                                                                                                                                                                                                                                        
        :col_sep => params[:delimiter],                                                                                                                                                                                                                                                                                          
        :force_quotes => @export_config.force_quotes,                                                                                                                                                                                                                                                                            
        :headers => @export_columns.collect { |column| format_export_column_header_name(column) }                                                                                                                                                                                                                                
      }                                                                                                                                                                                                                                                                                                                          

      data = FasterCSV.generate(fcsv_options) do |csv|                                                                                                                                                                                                                                                                           
        csv << fcsv_options[:headers] unless params[:skip_header] == 'true'                                                                                                                                                                                                                                                      
        @records.each do |record|                                                                                                                                                                                                                                                                                                
          csv << @export_columns.collect { |column|                                                                                                                                                                                                                                                                              
            # Convert to UTF-16 discarding the BOM, required for Excel (> 2003 ?)                                                                                                                                                                                                                                     
            Iconv.conv('UTF-16', 'UTF-8', get_export_column_value(record, column))[2..-1]                                                                                                                                                                                                                                        
          }                                                                                                                                                                                                                                                                                                                      
        end                                                                                                                                                                                                                                                                                                                      
      end                                                                                                                                                                                                                                                                                                                        
    -%><%= data -%>

Det viktige linjen er:

Iconv.conv('UTF-16', 'UTF-8', get_export_column_value(record, column))[2..-1]
Svarte 14/10/2011 kl. 06:29
kilden bruker

stemmer
1

En annen løsning jeg fant var bare å kode resultatet som Windows Kode Page 1252 (Windows-1252 eller CP1252). Dette vil bli gjort, for eksempel ved å sette Content-Typepå riktig måte til noe som text/csv; charset=Windows-1252og innstilling av tegnkoding av responsen strømmen på tilsvarende måte.

Svarte 19/10/2011 kl. 13:44
kilden bruker

stemmer
0

Jeg har funnet en måte å løse problemet. Dette er en ekkel hack, men det fungerer: åpne doc med Open Office , og deretter lagre den i en excel format; den resulterende .xlseller .xlsxviser de aksentuert tegn.

Svarte 28/11/2011 kl. 13:35
kilden bruker

stemmer
0

Hvis du har legacy kode i vb.net som jeg har jobbet følgende kode for meg:

    Response.Clear()
    Response.ClearHeaders()
    Response.ContentType = "text/csv"
    Response.Expires = 0
    Response.AddHeader("Content-Disposition", "attachment; filename=export.csv;")
    Using sw As StreamWriter = New StreamWriter(Context.Response.OutputStream, System.Text.Encoding.Unicode)
        sw.Write(csv)
        sw.Close()
    End Using
    Response.End()
Svarte 13/12/2011 kl. 08:06
kilden bruker

stemmer
7

UTF-8 fungerer ikke for meg i office 2007 uten oppdateringspakke, med eller uten BOM (U + ffef eller 0xEF, 0xBB, 0xBF, verken verker) installerer SP3 gjør UTF-8 fungerer når 0xEF, 0xBB, er 0xBF BOM prepended.

UTF-16 arbeider ved koding i python ved hjelp av "UTF-16-le" med en 0xff 0xEF BOM foranstilte, og ved hjelp av fliken som seperator. Jeg måtte manuelt skrive ut BOM, og deretter bruke "utf-16-le" heller da "utf-16", ellers hver kode () prepended BOM til hver rad skrevet ut som dukket opp som søppel på den første kolonnen i andre linjen og etter.

kan ikke si om UTF-16 ville fungere uten sp installert, siden jeg ikke kan gå tilbake nå. sukk

Dette er på vinduer, dunno om Office for Mac.

for både arbeids tilfeller fungerer import når du starter en nedlasting direkte fra nettleseren og tekstimportveiviseren ikke intervence, det fungerer som du forventer.

Svarte 17/02/2012 kl. 21:03
kilden bruker

stemmer
1

Legg merke til at blant annet UTF-8 BOM er ikke nødvendigvis en god idé - Mac-versjoner av Excel ignorere det og faktisk vil vise BOM som ASCII ... tre ekle tegn på starten av det første feltet i regnearket ...

Svarte 20/07/2012 kl. 02:26
kilden bruker

stemmer
-2

åpne filen csv med notepad ++ clic på Socket velger å konvertere til UTF-8 (ikke konvertere til UTF-8 (uten BOM)) Lagre åpen ved å dobbelt clic med excel Håper det hjelper Christophe GRISON

Svarte 25/04/2013 kl. 14:54
kilden bruker

stemmer
10

Svaret for alle kombinasjoner av Excel-versjoner (2003 + 2007) og filtyper

De fleste andre svar her angår deres Excel-versjon og vil ikke nødvendigvis hjelpe deg, fordi svaret bare ikke kan være sant for din versjon av Excel.

For eksempel legge BOM karakter introduserer problemer med automatisk kolonne separator anerkjennelse, men ikke med alle Excel-versjon.

Det er 3 variabler som avgjør om det fungerer i de fleste Excel-versjoner:

  • koding
  • BOM karakter nærvær
  • Cell separator

Noen stoisk på SAP prøvd alle kombinasjoner og rapporterte resultatet. Sluttresultatet? Bruk UTF16le med BOM og tabulatortegn som skille å ha den til å fungere i de fleste Excel-versjoner.

Du tror meg ikke? Jeg ville ikke heller, men leser her og gråte: http://wiki.sdn.sap.com/wiki/display/ABAP/CSV+tests+of+encoding+and+column+separator

Svarte 22/08/2013 kl. 06:26
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more