Microsoft Excel entstellt diakritische Zeichen in CSV-Dateien?


190

Ich exportiere programmgesteuert Daten (mit PHP 5.2) in eine CSV-Testdatei.
Beispieldaten: Numéro 1(beachten Sie das akzentuierte e). Die Daten sind utf-8(keine vorangestellte Stückliste).

Wenn ich diese Datei in MS Excel öffne, wird angezeigt als Numéro 1.

Ich kann dies in einem Texteditor (UltraEdit) öffnen, der es korrekt anzeigt. UE meldet, dass der Charakter ist decimal 233.

Wie kann ich Textdaten in eine CSV-Datei exportieren, damit MS Excel sie korrekt rendert , vorzugsweise ohne die Verwendung des Importassistenten oder nicht standardmäßiger Assistenteneinstellungen zu erzwingen?


Ich wäre sehr daran interessiert, mehr über Ihre Stücklistenlösung zu erfahren, da ich glaube, ich habe "EF BB BF" ausprobiert, was bei mir nicht funktioniert hat.
James Baker

3
Die gewählte Arbeitslösung bestand darin: * eine Stückliste aufzunehmen; utf-8 * benutze diesen Header: 'Inhaltstyp: text / plain; charset = utf-8 'Dies "funktionierte" in Excel 2003 und Excel 2007 - wo gearbeitet = ohne Importassistenten geöffnet und diakritische Zeichen korrekt gerendert wurden. Ich habe nicht überprüft, ob die Stückliste erforderlich ist.
Freddo411

2
Die Stückliste wird benötigt, ich habe sie gerade getestet. Ohne sie sind die Sonderzeichen nicht in Ordnung.
Alex Ciminian

2
Ich würde es lieben, wenn jemand mehr darüber sagen könnte, wie man eine Stückliste (Byte-Order-Marker) hinzufügt. Wenn ich nur so etwas wie Response.Write (EF BB BF ") mache, werden diese Zeichen nur am Anfang der Datei
angezeigt

Sydney: Wie Fergal weiter unten sagt; Stellen Sie Ihrer Zeichenfolge \ uFEFF voran.
Noocyte

Antworten:


242

Eine korrekt formatierte UTF8-Datei kann als erste drei Oktette ein Byte Order Mark enthalten . Dies sind die Hex-Werte 0xEF, 0xBB, 0xBF. Diese Oktette dienen dazu, die Datei als UTF8 zu markieren (da sie nicht als Informationen zur "Bytereihenfolge" relevant sind). 1 Wenn diese Stückliste nicht vorhanden ist, kann der Verbraucher / Leser den Codierungstyp des Textes ableiten. Leser, die nicht UTF8-fähig sind, lesen die Bytes wie eine andere Codierung wie Windows-1252 und zeigen die Zeichen am Anfang der Datei an.

Es gibt einen bekannten Fehler, Excel, auf UTF8 CSV - Dateien über Dateizuordnung zu öffnen, geht davon aus, dass sie in einer Single-Byte - Codierung sind, abgesehen von der Anwesenheit der UTF8 BOM. Dies kann nicht durch eine Systemstandard-Codepage oder Spracheinstellung behoben werden. Die Stückliste gibt in Excel keinen Hinweis - es funktioniert einfach nicht. (In einem Minderheitsbericht wird behauptet, dass die Stückliste manchmal den Assistenten "Text importieren" auslöst.) Dieser Fehler scheint in Excel 2003 und früheren Versionen vorhanden zu sein. Die meisten Berichte (inmitten der Antworten hier) sagen, dass dies in Excel 2007 und neuer behoben ist.

Beachten Sie, dass Sie können immer * richtig öffnen UTF8 CSV - Dateien in Excel die „Import Text“ Assistenten, mit dem Sie die Codierung der Datei , die Sie Öffnung angeben können. Das ist natürlich viel weniger bequem.

Leser dieser Antwort befinden sich höchstwahrscheinlich in einer Situation, in der sie Excel <2007 nicht besonders unterstützen, aber rohen UTF8-Text an Excel senden, der ihn falsch interpretiert und Ihren Text mit Ãund ähnlichen Windows-1252-Zeichen besprüht. Das Hinzufügen der UTF8-Stückliste ist wahrscheinlich die beste und schnellste Lösung.

Wenn Sie mit älteren Excel-Benutzern nicht weiterkommen und Excel der einzige Verbraucher Ihrer CSVs ist, können Sie dies umgehen, indem Sie UTF16 anstelle von UTF8 exportieren. Excel 2000 und 2003 doppelklicken diese korrekt. (Einige andere Texteditoren können Probleme mit UTF16 haben, daher müssen Sie Ihre Optionen möglicherweise sorgfältig abwägen.)


* Außer wenn Sie dies nicht können, funktioniert der Import-Assistent von Excel 2011 für Mac (zumindest) nicht immer mit allen Codierungen, unabhängig davon, was Sie ihm sagen. </ anecdotal-evidence> :)


14
Ich habe ewig gebraucht, um herauszufinden, wo ich die Codierung angeben kann. Dialogfeld "Speichern"> Schaltfläche "Extras"> Weboptionen> Registerkarte "Codierung". Sie sind sicher gut darin, so wichtige Dinge zu verstecken.
Triynko

6
Falsch: Durch Hinzufügen einer Stückliste zu einer UTF-8-Datei wird diese Datei korrekt geladen, ohne dass der Importassistent in Excel 2007 erforderlich ist.
Victor Nicollet

3
Wir haben das Gleiche gefunden, wie Victor heute sagt (mit Excel 2010 ist alles, was wir zur Verfügung hatten). Das Hinzufügen einer UTF-8-Stückliste / -Signatur (EF BB BF) schien den Doppelklick mit der Systemstandardcodierung zu beheben und verwendet UTF8 korrekt :)
Danny Tuppeny

20
Im Allgemeinen sollte einer UTF-8-codierten Datei kein Byte Order Mark vorangestellt sein. UTF-8 hat keine variable Bytereihenfolge, und wenn es dort abgelegt wird, wird die ASCII-Kompatibilität von UTF-8 sabotiert. Es gibt einige spezifische Dateiformate, die eine UTF-8-Faux-BOM entweder zulassen oder fördern. Andernfalls sollte dies vermieden werden. CSV ist völlig codierungsunabhängig, daher kann sich niemand vorstellen, ob ein bestimmtes Tool die Byte-Sequenz 0xEF 0xBB 0xBF als Indikator für UTF-8 interpretiert. ein unsichtbares Steuerzeichen in der ersten Zelle; die Zeichen in der ersten Zelle; oder etwas ganz anderes.
Bobince

3
@Ian: Niemand weiß genau, ob es sich um UTF-8 mit einer Stückliste handelt - 0xEF 0xBB 0xBF ist auch in den meisten Legacy-Codierungen eine gültige Sequenz (daher wird sie häufig als ISO-8859-1 oder cp1252 falsch interpretiert und als angezeigt ). Es hilft nur beim Erraten von Algorithmen und für Dateiformate, die dies speziell berücksichtigen (z. B. XML). Der Nachteil beim Einfügen einer Faux-Stückliste in UTF-8-Dateien besteht darin, dass Sie die ASCII-Kompatibilität beeinträchtigen (ein wichtiges Verkaufsargument für UTF-8). Viele codierungsunwissende Textwerkzeuge werden mit einer unerwartet führenden Faux-Stückliste konfrontiert.
Bobince

39

Das Voranstellen einer Stückliste (\ uFEFF) funktionierte für mich (Excel 2007), da Excel die Datei als UTF-8 erkannte. Andernfalls funktioniert das Speichern und Verwenden des Importassistenten, ist jedoch weniger ideal.


1
Der Textimport-Assistent wird weiterhin geöffnet. Der Unterschied besteht also darin, dass Sie einfach doppelklicken können. Dies ist immer noch nicht ideal, aber die einzige bekannte Lösung.
Haridsv

Für mich erscheint kein Import-Assistent mit Excel 2007.
Victor Nicollet

Auch für mich kein Importassistent - es funktioniert wie erwartet, wenn eine UTF8-Stückliste / Signatur (EF BB BF) vorhanden ist.
Danny Tuppeny

Auch \ufeffist eine UTF-16 (BE) Stückliste keine UTF-8 Stückliste
Alastair McCormack

2
Nein, @AlastairMcCormack, je nachdem, wie es codiert ist. "\ ufeff", codiert als UTF-8, ist genau EF BB BF. (Als UTF-16 codiert, sind es nur zwei Bytes.)
Dave Burt

30

Unten ist der PHP-Code, den ich in meinem Projekt verwende, wenn ich Microsoft Excel an den Benutzer sende:

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

AKTUALISIERT: Dateinamenverbesserung und BUG korrigieren die korrekte Längenberechnung. Danke an TRiG und @ ivanhoe011


1
Ich habe auf dieser Seite mehrere andere Vorschläge ausprobiert, aber dies hat in Excel 2007 für mich funktioniert. Die wichtigsten Änderungen waren die Verwendung von Registerkarten anstelle von Kommas (obwohl es sich um eine CSV-Datei handelt) und der Zeile darüber, in der die beiden Zeichen gefolgt von der Rufen Sie mb_convert_encoding () auf. Ich musste auch PHP mit --enable-mbstring neu kompilieren, um Unterstützung für mb_convert_encoding () zu erhalten. Vielen Dank!
Russell G

1
Das hat auch bei mir gut funktioniert, danke. In Safari wird in meiner Konsole jedoch die Fehlermeldung "Ressource als Dokument interpretiert, aber übertragen als ..." angezeigt. Ich denke, es handelt sich um eine WebKit-Eigenart, die über stackoverflow.com/questions/3899426/… beurteilt wird , aber möglicherweise nicht und / oder jemand hat eine Lösung gefunden. Außerdem würde ich in Ihrem Beispiel eine Änderung vorschlagen: 'Content-Disposition: attachment; filename="'.$filename.'.csv"'Weil Firefox doppelte Anführungszeichen möchte, oder wenn Sie Ihren Dateinamen nach einem Leerzeichen abschneiden.
Kasimir

Warum geben Sie CSV ( text/csv) aus, nennen es aber Excel ( application/vnd.ms-excel)?
TRiG

2
Das funktioniert super! Ich kann bestätigen, dass es auch auf dem Mac funktioniert (in Office 2011).
Jonathan

Sollte das nicht sein header('Content-Length: '. mb_strlen($encoded_csv, 'UTF-16LE'));?
Rich Bradshaw

13

Die Antwort für alle Kombinationen von Excel-Versionen (2003 + 2007) und Dateitypen

Die meisten anderen Antworten betreffen nur die Excel-Version und helfen Ihnen nicht unbedingt, da ihre Antwort für Ihre Excel-Version möglicherweise nicht zutrifft.

Das Hinzufügen des Stücklistenzeichens führt beispielsweise zu Problemen bei der automatischen Erkennung von Spaltentrennzeichen, jedoch nicht bei jeder Excel-Version.

Es gibt 3 Variablen, die bestimmen, ob es in den meisten Excel-Versionen funktioniert:

  • Codierung
  • Präsenz von Stücklistenzeichen
  • Zelltrenner

Jemand, der bei SAP stoisch war, versuchte jede Kombination und berichtete über das Ergebnis. Endresultat? Verwenden Sie UTF16le mit Stückliste und Tabulatorzeichen als Trennzeichen, damit es in den meisten Excel-Versionen funktioniert.

Du glaubst mir nicht? Ich würde es auch nicht tun, aber hier lesen und weinen: http://wiki.sdn.sap.com/wiki/display/ABAP/CSV+tests+of+encoding+and+column+separator


Warum nicht einfach hinzufügen sep=,oder was auch immer Sie verwenden möchten? Wenn Sie die Stückliste bereits hinzufügen, sind Sie vermutlich nicht abgeneigt, der Datei Inhalte hinzuzufügen.
Casey

Um meine eigene Frage zu beantworten, würden Sie die Feldtrennerdeklaration nicht hinzufügen, da dieser Trick dadurch nicht mehr funktioniert. Im Grunde genommen handelt es sich also um eine verstümmelte Codierung oder darum, dass Ihre Datei nicht richtig als CSV interpretiert wird, wenn Ihre Benutzer die falschen Regionseinstellungen haben.
Casey

1
utf-16le + Stückliste (0xFF 0xFE) + Tab ist das Beste
Zhaozhi

10

Wählen Sie beim Importieren UTF-8 aus. Wenn Sie Office 2007 verwenden, haben Sie es hier ausgewählt: direkt nach dem Öffnen der Datei.


1
Das ist nützlich. Ich habe die Frage geändert, um zu fragen, wie dies zu tun ist, ohne auf den Assistenten zurückzugreifen
Freddo411

9

Echo UTF-8-Stückliste vor der Ausgabe von CSV-Daten. Dies behebt alle Zeichenprobleme in Windows, funktioniert jedoch nicht für Mac.

echo "\xEF\xBB\xBF";

Es funktioniert für mich, weil ich eine Datei generieren muss, die nur auf Windows-PCs verwendet wird.


Nicht für jeden Spaltentrennertyp oder jede Excel-Version. Lesen Sie meine Antwort unten (vorerst unten).
Christiaan Westerbeek

7

UTF-8 funktioniert in Office 2007 nicht ohne Service Pack, mit oder ohne Stückliste (U + ffef oder 0xEF, 0xBB, 0xBF, funktioniert auch nicht). Durch die Installation von sp3 funktioniert UTF-8, wenn 0xEF, 0xBB, 0xBF Stückliste ist vorangestellt.

UTF-16 funktioniert beim Codieren in Python mit "utf-16-le" mit einer vorangestellten 0xff 0xef-Stückliste und unter Verwendung der Registerkarte als Trennzeichen. Ich musste die Stückliste manuell ausschreiben und dann "utf-16-le" anstelle von "utf-16" verwenden, andernfalls stellte jede encode () die Stückliste jeder ausgeschriebenen Zeile voran, die als Müll in der ersten Spalte der erschien zweite Zeile und danach.

Ich kann nicht sagen, ob UTF-16 ohne installiertes SP funktionieren würde, da ich jetzt nicht zurückkehren kann. Seufzer

Dies ist auf Windows, keine Ahnung über Office für MAC.

In beiden Arbeitsfällen funktioniert der Import, wenn ein Download direkt vom Browser aus gestartet wird, und der Textimport-Assistent greift nicht ein, sondern wie erwartet.


Funktioniert auch unter Excel 2011 für Mac.
Adam

Vielen Dank für Ihren Beitrag, verwenden Sie utf-16le ist in Ordnung, auch wenn Sie Office 2007 SP3 nicht installiert haben, aber die Stückliste sollte 0xFF 0xFE
zhaozhi

4

Wie Fregal sagte, ist \ uFEFF der richtige Weg.

<%@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
%>

1
Beobachten Sie einfach, wie Ihr Tabulatortrennzeichen in Excel 2007 ignoriert wird, wenn Sie Stücklisten verwenden. Sie müssen sich etwas mehr einfallen lassen.
Christiaan Westerbeek

3

Ich habe auch bemerkt, dass die Frage vor einiger Zeit "beantwortet" wurde, aber ich verstehe die Geschichten nicht, die besagen, dass Sie eine utf8-codierte CSV-Datei nicht erfolgreich in Excel öffnen können, ohne den Textassistenten zu verwenden.

Meine reproduzierbare Erfahrung: Old MacDonald had a farm,ÈÌÉÍØGeben Sie in den Editor ein, drücken Sie die Eingabetaste und dann Speichern unter (mit der Option UTF-8).

Verwenden von Python, um zu zeigen, was tatsächlich darin enthalten ist:

>>> 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

Gut. Notepad hat eine Stückliste vorne platziert.

Gehen Sie nun in den Windows Explorer, doppelklicken Sie auf den Dateinamen oder klicken Sie mit der rechten Maustaste und verwenden Sie "Öffnen mit ...". Daraufhin wird Excel (2003) mit der erwarteten Anzeige angezeigt.


@Cocowalla: Nun, ich habe es gerade versucht (noch einmal; ich habe es vor dem Posten getestet) und es hat mit Excel 2007 funktioniert (was ich jetzt verwende). Haben Sie open('oldmac.csv', 'rb').read()Ihre Eingabe überprüft?
John Machin

Ich habe es nicht mit Excel 2007 versucht (ich weiß, dass Excel 2007 UTF-8-Dateien mit einer Stückliste gut liest), ich habe es mit Excel 2003 versucht
Cocowalla

@Cocowalla: Nun, es hat bei Excel 2003 funktioniert, als ich es hatte. Sind Sie sicher, dass Sie das neueste Service Pack für Excel 2003 haben? Haben Sie Ihre Eingabe wie vorgeschlagen überprüft?
John Machin

Ich habe überprüft, ob der Editor am Anfang der Datei eine Stückliste geklebt hat, aber ich bin in Excel 2003 SP2 (SP3 ist verfügbar) - also denke ich, dass dies nur in SP3 funktioniert
Cocowalla

2

Sie können eine HTML-Datei mit der Erweiterung 'xls' speichern und Akzente funktionieren (mindestens vor 2007).

Beispiel: Speichern Sie dies (mit Save As utf8 im Editor) als 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>

interessante Option. Es öffnet den Text richtig, aber aus irgendeinem Grund ist die gesamte Seite vollständig weiß. Ohne die klassischen Tabellenkalkulationszeilen, die Zeilen und Spalten abgrenzen (Office für Mac)
Sebastian Sastre

Ja, dasselbe in Office 2007 unter Windows. Es hat mich immer überrascht, dass es überhaupt funktioniert hat, um ehrlich zu sein. (Beachten Sie , wenn Sie hinzufügen , border="1"auf den Tisch, Sie tun Linien, aber nur um die 4 - Zellen :)
Benjol

1

Dies ist nur eine Frage der Zeichenkodierung. Es sieht so aus, als würden Sie Ihre Daten als UTF-8 exportieren: é in UTF-8 ist die Zwei-Byte-Sequenz 0xC3 0xA9, die bei Interpretation in Windows-1252 Ã © ist. Stellen Sie beim Importieren Ihrer Daten in Excel sicher, dass die von Ihnen verwendete Zeichenkodierung UTF-8 ist.


Ich habe bestätigt, dass die Daten UTF-8 sind. Was füge ich in die Datei ein, um Excel wissen zu lassen, dass meine Daten utf-8 (Stückliste?)
Sind

Ich denke, dass Sie die
Dateicodierung

Ich bin mir nicht ganz sicher, da auf dem aktuell verwendeten Computer kein Excel installiert ist. Bei OpenOffice gibt es jedoch ein Dropdown-Feld für die Zeichencodierung, wenn Sie eine CSV-Datei importieren. Wählen Sie dort Unicode (UTF-8).
Adam Rosenfield

Excel hat nicht die Dropdown-
Liste

1

Das CSV-Format wird in Excel als ASCII und nicht als Unicode implementiert, wodurch die diakritischen Zeichen entstellt werden. Wir hatten das gleiche Problem, mit dem ich herausgefunden habe, dass der offizielle CSV-Standard in Excel als ASCII-basiert definiert wurde.


Tatsächlich ist CSV nicht an eine bestimmte Codierung gebunden. Es ist Excel, das ASCII voraussetzt. en.wikipedia.org/wiki/Comma-separated_values
spoulson

Das ist, was ich gesagt habe. "In Excel als ASCII implementiert", "In Excel als ASCII-basiert definiert". Ich bin mir nicht sicher, welchen Punkt du machst, da du mir scheinbar zustimmst.
Jeff Yates

2
Eigentlich sagen Sie "Das CSV-Format ist als ASCI implementiert", ich denke, das ist der Grund für die Verwirrung.
RichardOD

1

Excel 2007 liest UTF-8 ordnungsgemäß mit Stücklisten (EF BB BF) codierter CSV.

Excel 2003 (und möglicherweise früher) liest UTF-16LE mit Stückliste (FF FE), jedoch mit TABs anstelle von Kommas oder Semikolons.


1

Ich kann CSV nur dazu bringen, in Excel 2007 als tabulatorgetrenntes Little-Endian-UTF-16 richtig zu analysieren, beginnend mit der richtigen Bytereihenfolge.


1

Das Schreiben einer Stückliste in die Ausgabe-CSV-Datei hat in Django tatsächlich funktioniert:

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

Für weitere Informationen http://crashcoursing.blogspot.com/2011/05/exporting-csv-with-special-characters.html Danke Jungs!


Ja, dies funktionierte bei Excel 2010. Bei Verwendung von Java printWriter.print('\ufeff')siehe auch Hinzufügen einer UTF-8-Stückliste in Java .
Tsauerwein

1

Eine andere Lösung, die ich gefunden habe, bestand darin, das Ergebnis als Windows Code Page 1252 (Windows-1252 oder CP1252) zu codieren. Dies würde zum Beispiel dadurch geschehen, dass eine Content-Typeentsprechende Einstellung vorgenommen wird text/csv; charset=Windows-1252und die Zeichenkodierung des Antwortstroms auf ähnliche Weise eingestellt wird.


Danke für diesen einen. Funktioniert unter Excel Windows und Mac. Ich benutze es.
Sebastian Sastre

Dies würde nur funktionieren, wenn Ihr Nicht-ASCII-Zeichenbereich vollständig unter Windows-1252 fällt. So zum Beispiel kein Koreanisch / Chinesisch / Japanisch, kein Kyrillisch usw. Aber ich denke, Sie werden damit für die meisten westeuropäischen Sprachen vorbeischieben.
Tom McClure

1

Beachten Sie, dass das Einfügen der UTF-8-Stückliste nicht unbedingt eine gute Idee ist. Mac-Versionen von Excel ignorieren dies und zeigen die Stückliste tatsächlich als ASCII an. Drei unangenehme Zeichen am Anfang des ersten Felds in Ihrer Tabelle.


Ich weiß, dass dieser Kommentar 6 Jahre später ist, aber FWIW: Das Herunterladen einer Datei mit JavaScript '\uFEFF' + myCsvStringfunktioniert wie erwartet unter Mac Excel 15.19.1 (2016).
Bobjones

0

Überprüfen Sie die Codierung, in der Sie die Datei generieren. Damit Excel die Datei korrekt anzeigt, müssen Sie die Standardcodepage des Systems verwenden.

Welche Sprache benutzt du? Wenn es sich um .Net handelt, müssen Sie beim Generieren der Datei nur Encoding.Default verwenden.


Die Exportdaten sind utf-8. Ich schreibe die Exportdatei mit PHP 5
Freddo411

Umcodieren die Daten auf Windows-1252 - Codepage, ich bin nicht sicher , wie es mit PHP zu erledige
albertein

0

Wenn Sie wie ich Legacy-Code in vb.net haben, hat der folgende Code für mich funktioniert:

    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()

0

Ich habe einen Weg gefunden, das Problem zu lösen. Dies ist ein böser Hack, aber er funktioniert: Öffnen Sie das Dokument mit Open Office und speichern Sie es in einem beliebigen Excel-Format. Das resultierende .xlsoder .xlsxzeigt die akzentuierten Zeichen an.


1
Das OP sagt, dass er programmgesteuert exportiert, also sucht er nicht nach einer Lösung, die manuelle Eingriffe erfordert.
Christiaan Westerbeek

0

Mit Ruby 1.8.7 codiere ich jedes Feld in UTF-16 und verwerfe die Stückliste (vielleicht).

Der folgende Code wird aus active_scaffold_export extrahiert:

<%                                                                                                                                                                                                                                                                                                                           
      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 -%>

Die wichtige Zeile lautet:

Iconv.conv('UTF-16', 'UTF-8', get_export_column_value(record, column))[2..-1]

-2

Öffnen Sie die Datei csv mit notepad ++ clic auf Encode, wählen Sie Konvertieren in UTF-8 (nicht in UTF-8 konvertieren (ohne Stückliste))


1
Dies beantwortet die Frage nicht, da sie programmgesteuert erfolgen soll und kein Eingreifen des Benutzers erforderlich ist, um jede Datei manuell neu zu speichern
Joe W,
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.