Microsoft Excel rozpoznaje znaki diakrytyczne w plikach .csv?

190

Programowo eksportuję dane (używając PHP 5.2) do pliku testowego .csv.
Przykładowe dane: Numéro 1(zwróć uwagę na akcentowany e). Dane są utf-8(bez wcześniejszego BOM).

Kiedy otwieram ten plik w MS Excel wyświetla się jako Numéro 1.

Jestem w stanie otworzyć to w edytorze tekstu (UltraEdit), który wyświetla go poprawnie. UE zgłasza, że ​​postać jest decimal 233.

Jak mogę wyeksportować dane tekstowe do pliku .csv, aby MS Excel poprawnie je wyrenderował , najlepiej bez wymuszania użycia kreatora importu lub ustawień domyślnych kreatora?

Freddo411
źródło
Byłbym bardzo zainteresowany, aby dowiedzieć się więcej o twoim rozwiązaniu BOM, ponieważ wydaje mi się, że wypróbowałem „EF BB BF”, który nie działał dla mnie.
James Baker,
3
Wybrane rozwiązanie robocze polegało na: * uwzględnieniu BOM; utf-8 * użyj tego nagłówka: „Content-type: text / plain; charset = utf-8 'To „działało” w programach Excel 2003 i Excel 2007 - gdzie działało = otwarte bez kreatora importu i poprawnie wyświetlało znaki diakrytyczne. Nie sprawdziłem, czy BOM był wymagany.
Freddo411,
2
BOM jest wymagany, właśnie to przetestowałem. Bez tego znaki specjalne nie wyświetlają się poprawnie.
Alex Ciminian
2
bardzo by mi się podobało, gdyby ktoś mógł powiedzieć więcej o tym, jak dodać BOM (znacznik kolejności bajtów). Jeśli po prostu zrobię coś takiego jak Response.Write (EF BB BF "), te postacie pojawią się na początku pliku.
Sydney
sydneyos: Jak mówi Fergal poniżej; Dodaj \ uFEFF do swojego ciągu.
noocyte

Odpowiedzi:

243

Prawidłowo sformatowany plik UTF8 może mieć znak kolejności bajtów jako pierwsze trzy oktety. Są to wartości szesnastkowe 0xEF, 0xBB, 0xBF. Te oktety służą do oznaczania pliku jako UTF8 (ponieważ nie mają one znaczenia jako informacje o „kolejności bajtów”). 1 Jeśli ten BOM nie istnieje, konsument / czytelnik może wywnioskować rodzaj kodowania tekstu. Czytniki, które nie obsługują UTF8, będą czytały bajty jak niektóre inne kodowania, takie jak Windows-1252, i wyświetlą znaki na początku pliku.

Znany jest błąd, w którym program Excel, otwierając pliki CSV UTF8 za pomocą skojarzenia plików, zakłada, że ​​są one kodowane jednobajtowo, pomijając obecność BOM UTF8. Nie można tego naprawić za pomocą domyślnej systemowej strony kodowej lub ustawienia języka. LM nie będzie wskazywać w programie Excel - po prostu nie będzie działać. (Raport mniejszości twierdzi, że zestawienie komponentów czasami uruchamia kreatora „Importuj tekst”). Ten błąd występuje w programie Excel 2003 i wcześniejszych wersjach. Większość raportów (pośród odpowiedzi tutaj) mówi, że jest to naprawione w programie Excel 2007 i nowszych.

Pamiętaj, że zawsze możesz * poprawnie otwierać pliki CSV UTF8 w programie Excel za pomocą kreatora „Importuj tekst”, który pozwala określić kodowanie otwieranego pliku. Oczywiście jest to o wiele mniej wygodne.

Czytelnicy tej odpowiedzi najprawdopodobniej znajdują się w sytuacji, w której nie obsługują w szczególności Excela <2007, ale wysyłają surowy tekst UTF8 do Excela, który źle go interpretuje i posypuje tekst Ãinnymi znakami Windows-1252. Dodanie BOM UTF8 jest prawdopodobnie najlepszym i najszybszym rozwiązaniem.

Jeśli utkniesz z użytkownikami starszych wersji programu Excel, a Excel jest jedynym konsumentem plików CSV, możesz obejść ten problem, eksportując UTF16 zamiast UTF8. Excel 2000 i 2003 dwukrotnie je otworzą dwukrotnie. (Niektóre inne edytory tekstu mogą mieć problemy z UTF16, więc może być konieczne dokładne rozważenie opcji).


* Z wyjątkiem sytuacji, gdy nie możesz (przynajmniej) Kreator importu programu Excel 2011 dla komputerów Mac nie zawsze tak naprawdę działa ze wszystkimi kodowaniami, niezależnie od tego, co powiesz. </anecdotal-evidence> :)

James Baker
źródło
14
Na zawsze zajęło mi znalezienie miejsca, w którym mam określić kodowanie. Zapisz okno dialogowe> Przycisk Narzędzia> Opcje sieciowe> Karta Kodowanie. Z pewnością potrafią ukrywać tak ważne rzeczy.
Triynko
6
Źle: dodanie BOM do pliku UTF-8 ładuje ten plik poprawnie, bez konieczności kreatora importu w Excel 2007.
Victor Nicollet
3
Znaleźliśmy to samo, co mówi dziś Victor (używając Excela 2010, to wszystko, co mieliśmy do dyspozycji). Dodanie BOM / podpisu UTF-8 (EF BB BF) zdawało się naprawić podwójne kliknięcie przy użyciu domyślnego kodowania systemowego i poprawnie używa UTF8 :)
Danny Tuppeny
20
Zasadniczo do pliku zakodowanego w UTF-8 nie należy wstawiać znaku kolejności bajtów. UTF-8 nie ma zmiennej kolejności bajtów i umieszczenie go tam sabotuje kompatybilność ASCII UTF-8. Istnieją pewne specyficzne formaty plików, które zezwalają lub zachęcają do faux-BOM UTF-8, ale w przeciwnym razie należy tego unikać. CSV całkowicie ignoruje kodowanie, więc nikt nie zgadnie, czy dane narzędzie zinterpretuje sekwencję bajtów 0xEF 0xBB 0xBF jako wskaźnik UTF-8; niewidzialny znak kontrolny w pierwszej komórce; znaki w pierwszej komórce; lub coś zupełnie innego.
bobince
3
@Ian: Nikt też nie wie na pewno, że jest to UTF-8 z BOM - 0xEF 0xBB 0xBF jest również prawidłową sekwencją w większości starszych kodowań (stąd często jest źle interpretowany jako ISO-8859-1 lub cp1252 i wyświetlany jako ). Pomaga tylko algorytmom zgadywania oraz formatom plików, które specjalnie to uwzględniają (np. XML). Minusem dołączenia fałszywej BOM w plikach UTF-8 jest to, że łamiesz ich kompatybilność z ASCII (główny punkt sprzedaży UTF-8). Wiele narzędzi tekstowych ignorujących kodowanie nie będzie miało dostępu do nieoczekiwanej wiodącej fałszywej BOM.
bobince
39

Przygotowanie BOM (\ uFEFF) działało dla mnie (Excel 2007), ponieważ Excel rozpoznał plik jako UTF-8. W przeciwnym razie zapisanie go i użycie kreatora importu działa, ale jest mniej idealne.


źródło
1
Nadal otwiera się kreator importu tekstu, więc różnica polega na tym, że możesz po prostu kliknąć dwukrotnie, więc nadal nie jest to idealne, ale i tak jedyne znane rozwiązanie.
haridsv
Dla mnie żaden kreator importu nie pojawia się w programie Excel 2007.
Victor Nicollet
Dla mnie też nie ma kreatora importu - działa on zgodnie z oczekiwaniami, jeśli jest obecny BOM / Signature UTF8 (EF BB BF).
Danny Tuppeny
A także, \ufeffto LM UTF-16 (BE), a nie LM UTF-8
Alastair McCormack
2
Nie, @AlastairMcCormack, to albo, zależnie od tego, jak jest zakodowane. „\ ufeff” zakodowane jako UTF-8 to dokładnie EF BB BF. (Zakodowane jako UTF-16 będą to tylko dwa bajty.)
Dave Burt,
30

Poniżej znajduje się kod PHP, którego używam w swoim projekcie, wysyłając program Microsoft Excel do użytkownika:

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

ZAKTUALIZOWANO: Poprawa nazwy pliku i BŁĄD poprawiają obliczanie prawidłowej długości. Dzięki TRiG i @ ivanhoe011

Marc Carlucci
źródło
1
Wypróbowałem kilka innych sugestii na tej stronie, ale działało to dla mnie w programie Excel 2007. Najważniejsze zmiany polegały na użyciu tabulatorów zamiast przecinków (nawet jeśli jest to plik .csv) i linii powyżej, która echa dwóch znaków, po których następuje wywołanie do mb_convert_encoding (). Musiałem też ponownie skompilować PHP za pomocą --enable-mbstring, aby uzyskać wsparcie dla mb_convert_encoding (). Dzięki!
Russell G
1
To też działało dobrze dla mnie, dzięki. Jednak w Safari pojawia się błąd w konsoli „Zasób interpretowany jako dokument, ale przesłany jako…” Myślę, że to dziwactwo WebKit, sądząc, że stackoverflow.com/questions/3899426/... , ale może nie jest to i / lub ktoś ma znaleźć rozwiązanie. Ponadto w twoim przykładzie zasugerowałbym zmianę: 'Content-Disposition: attachment; filename="'.$filename.'.csv"'ponieważ Firefox chce podwójnych cudzysłowów, w przeciwnym razie odcina nazwę pliku po spacji.
kasimir
Dlaczego wyprowadzasz CSV ( text/csv), ale nazywasz go Excel ( application/vnd.ms-excel)?
TRiG,
2
To działa świetnie! Mogę potwierdzić, że działa również na komputerze Mac (w pakiecie Office 2011).
Jonathan
Nie powinno tak być header('Content-Length: '. mb_strlen($encoded_csv, 'UTF-16LE'));?
Rich Bradshaw,
13

Odpowiedź na wszystkie kombinacje wersji programu Excel (2003 + 2007) i typów plików

Większość innych odpowiedzi tutaj dotyczy tylko ich wersji Excela i niekoniecznie pomoże, ponieważ ich odpowiedź może nie być prawdziwa dla twojej wersji Excela.

Na przykład dodanie znaku BOM powoduje problemy z automatycznym rozpoznawaniem separatora kolumn, ale nie z każdą wersją programu Excel.

Istnieją 3 zmienne, które określają, czy działa w większości wersji programu Excel:

  • Kodowanie
  • Obecność postaci BOM
  • Separator komórek

Ktoś stoicki w SAP wypróbował każdą kombinację i poinformował o wyniku. Wynik końcowy? Użyj UTF16le z BOM i znakiem tabulacji jako separatorem, aby działał w większości wersji Excela.

Nie wierzysz mi? Ja też bym tego nie zrobił, ale czytam tutaj i płaczę: http://wiki.sdn.sap.com/wiki/display/ABAP/CSV+tests+of+encoding+and+column+separator

Christiaan Westerbeek
źródło
Dlaczego nie po prostu dodać sep=,lub cokolwiek, czego chcesz użyć? Jeśli już dodajesz BOM, zakładam, że nie masz nic przeciwko dodawaniu rzeczy do pliku.
Casey
Właściwie, aby odpowiedzieć na moje pytanie, nie dodałeś deklaracji separatora pól, ponieważ powoduje to, że ta sztuczka przestaje działać. Zasadniczo jest to zniekształcone kodowanie lub plik nie jest poprawnie interpretowany jako plik CSV, jeśli użytkownicy mają nieprawidłowe ustawienia regionu.
Casey
1
utf-16le + BOM (0xFF 0xFE) + karta jest najlepsza
zhaozhi
10

wybierz kodowanie UTF-8 podczas importowania. jeśli korzystasz z pakietu Office 2007, wybierz go: zaraz po otwarciu pliku.

Daniels
źródło
1
To jest przydatne. Zmodyfikowałem pytanie, aby zapytać, jak to zrobić bez uciekania się do kreatora
Freddo411,
9

Echo UTF-8 BOM przed wyprowadzeniem danych CSV. To rozwiązuje wszystkie problemy z postaciami w systemie Windows, ale nie działa na komputerach Mac.

echo "\xEF\xBB\xBF";

Działa to dla mnie, ponieważ muszę wygenerować plik, który będzie używany tylko na komputerach z systemem Windows.

Johal
źródło
Nieprawda dla każdego typu separatora kolumn ani dla każdej wersji Excela. Przeczytaj moją odpowiedź poniżej (na razie poniżej).
Christiaan Westerbeek
7

UTF-8 nie działa dla mnie w pakiecie Office 2007 bez żadnego dodatku Service Pack, z BOM lub bez (B + FFef lub 0xEF, 0xBB, 0xBF, nie działa) Instalacja sp3 sprawia, że ​​UTF-8 działa, gdy BOM 0xEF, 0xBB, 0xBF jest uprzedzony.

UTF-16 działa podczas kodowania w pythonie przy użyciu „utf-16-le” z dołączoną BOM 0xff 0xef i używając tab jako separatora. Musiałem ręcznie napisać BOM, a następnie użyć „utf-16-le” zamiast „utf-16”, w przeciwnym razie każdy kod () wstawił BOM do każdego wypisanego wiersza, który pojawiał się jako śmieci w pierwszej kolumnie druga linia i po niej.

nie mogę powiedzieć, czy UTF-16 działałby bez zainstalowanego sp, ponieważ nie mogę teraz wrócić. westchnienie

To jest na Windowsie, nie wiem o biurze dla MAC.

w obu przypadkach roboczych import działa podczas uruchamiania pobierania bezpośrednio z przeglądarki, a kreator importu tekstu nie przerywa, działa tak, jak można się spodziewać.

Gerald Dol
źródło
Działa również w programie Excel 2011 dla komputerów Mac.
Adam
dziękuję za twój post, użycie utf-16le jest w porządku, nawet jeśli nie zainstalowałeś pakietu Office 2007 SP3, ale BOM powinien mieć wartość 0xFF 0xFE
zhaozhi
4

Jak powiedział Fregal, droga jest dobra.

<%@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
%>
Kristof Neirynck
źródło
1
Po prostu zobacz i zobacz, jak separator tabulatorów jest ignorowany w programie Excel 2007, gdy używasz BOM. Musisz wymyślić coś więcej.
Christiaan Westerbeek,
3

Zauważyłem również, że na pytanie zostało „udzielone” jakiś czas temu, ale nie rozumiem historii, które mówią, że nie można pomyślnie otworzyć pliku csv zakodowanego w utf8 w programie Excel bez użycia kreatora tekstu.

Moje powtarzalne doświadczenie: pisz Old MacDonald had a farm,ÈÌÉÍØw Notatniku, naciśnij Enter, a następnie Zapisz jako (używając opcji UTF-8).

Za pomocą Pythona, aby pokazać, co tam jest:

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

Dobry. Notatnik umieścił BOM z przodu.

Teraz przejdź do Eksploratora Windows, kliknij dwukrotnie nazwę pliku lub kliknij prawym przyciskiem myszy i użyj „Otwórz za pomocą ...”, a pojawi się program Excel (2003) z wyświetlaniem zgodnie z oczekiwaniami.

John Machin
źródło
@Cocowalla: Cóż, właśnie tego spróbowałem (ponownie; przetestowałem to przed opublikowaniem) i działało to z programem Excel 2007 (którego teraz używam). Czy zrobiłeś to, open('oldmac.csv', 'rb').read()aby zweryfikować swój wkład?
John Machin,
Nie próbowałem z Excel 2007 (wiem, że Excel 2007 czyta pliki UTF-8 z BOM w porządku), próbowałem z Excel 2003
Cocowalla
@Cocowalla: Cóż, działało to dla mnie z Excel 2003, kiedy go miałem. Czy na pewno masz najnowszy dodatek Service Pack dla programu Excel 2003? Czy zweryfikowałeś swoje dane wejściowe zgodnie z moją sugestią?
John Machin,
Sprawdziłem, czy notatnik zablokował BOM na początku pliku, ale korzystam z Excela 2003 SP2 (SP3 jest dostępny) - więc myślę, że działa to tylko w SP3
Cocowalla
2

Możesz zapisać plik HTML z rozszerzeniem „xls”, a akcenty będą działać (przynajmniej przed 2007 rokiem).

Przykład: zapisz to (używając Zapisz jako utf8 w Notatniku) jako 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>
Benjol
źródło
ciekawa opcja. Otwiera tekst w prawo, ale z jakiegoś powodu cała strona jest całkowicie biała. Bez klasycznych linii arkusza kalkulacyjnego ograniczających wiersze i kolumny (biuro dla komputerów Mac)
Sebastian Sastre
Tak, to samo w Office 2007 na Windows. Szczerze mówiąc, zawsze mnie zaskakuje, że w ogóle zadziałało. (Uwaga, jeśli dodać border="1"do stołu, to zrobić uzyskać linie, ale tuż za 4 komórki :)
Benjol
1

To tylko kwestia kodowania znaków. Wygląda na to, że eksportujesz swoje dane jako UTF-8: é w UTF-8 to dwubajtowa sekwencja 0xC3 0xA9, która interpretowana w Windows-1252 to à ©. Podczas importowania danych do programu Excel pamiętaj, aby powiedzieć, że używasz kodowania znaków UTF-8.

Adam Rosenfield
źródło
Potwierdziłem, że dane to UTF-8. Co mam umieścić w pliku, aby poinformować Excel, że moje dane to utf-8 (BOM?)
Freddo411,
Myślę, że musisz zmienić kodowanie plików, excel używa domyślnej systemowej strony kodowej do obsługi plików csv
albertein 30.09.08
Nie jestem do końca pewien, ponieważ nie mam zainstalowanego programu Excel na komputerze, którego aktualnie używam, ale dzięki OpenOffice istnieje okno rozwijane do kodowania znaków podczas importowania pliku CSV. Stamtąd wybierz Unicode (UTF-8).
Adam Rosenfield
Excel nie ma menu rozwijanego AFAIK
albertein 30.09.08
1

Format CSV jest zaimplementowany w programie Excel jako ASCII, a nie Unicode, a tym samym zakłóca znaki diakrytyczne. Wystąpił ten sam problem, w jaki sposób wyśledziłem, że oficjalny standard CSV został zdefiniowany jako oparty na ASCII w programie Excel.

Jeff Yates
źródło
W rzeczywistości CSV nie jest związany z konkretnym kodowaniem. To Excel zakłada ASCII. en.wikipedia.org/wiki/Comma-separated_values
spoulson
To co powiedziałem. „zaimplementowany jako ASCII w programie Excel”, „CSV zdefiniowany jako oparty na ASCII w programie Excel”. Nie jestem pewien, o co chodzi, kiedy wydaje się, że się ze mną zgadzasz.
Jeff Yates
2
Właściwie to mówisz „Format CSV jest zaimplementowany jako ASCI”, myślę, że stąd bierze się zamieszanie.
RichardOD
1

Excel 2007 poprawnie odczytuje UTF-8 z csv zakodowanym w BOM (EF BB BF).

Excel 2003 (i być może wcześniej) odczytuje UTF-16LE z BOM (FF FE), ale z TAB zamiast przecinków lub średników.

użytkownik203319
źródło
1

Mogę tylko poprawnie CSV przeanalizować w programie Excel 2007 jako rozdzielony tabulatorami little-endian UTF-16, zaczynając od odpowiedniego znaku kolejności bajtów.

Manfred Stienstra
źródło
1

Zapisanie BOM do wyjściowego pliku CSV faktycznie działało dla mnie w 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

Aby uzyskać więcej informacji http://crashcoursing.blogspot.com/2011/05/exporting-csv-with-special-characters.html Dzięki chłopaki!

Lukas Batteau
źródło
Tak, działało to dla mnie w programie Excel 2010. W Javie printWriter.print('\ufeff')zobacz także Jak dodać BOM UTF-8 w java .
tsauerwein,
1

Innym rozwiązaniem, które znalazłem, było zakodowanie wyniku jako Windows Code Page 1252 (Windows-1252 lub CP1252). Można to zrobić na przykład poprzez Content-Typeodpowiednie ustawienie czegoś podobnego text/csv; charset=Windows-1252i ustawienie kodowania znaków strumienia odpowiedzi w podobny sposób.

creechy
źródło
Dzięki za to. Działa na systemie Windows i Mac. Używam tego.
Sebastian Sastre
Działa to tylko wtedy, gdy zakres znaków innych niż ascii mieści się całkowicie w systemie Windows-1252. Na przykład, bez koreańskiego / chińskiego / japońskiego, bez cyrylicy itp. Ale myślę, że poradzisz sobie z tym w przypadku większości języków zachodnioeuropejskich.
Tom McClure,
1

Pamiętaj, że dołączenie BOM UTF-8 niekoniecznie jest dobrym pomysłem - wersje Excela dla komputerów Mac ignorują go i faktycznie wyświetlają BOM jako ASCII… trzy nieprzyjemne znaki na początku pierwszego pola w arkuszu kalkulacyjnym…

Ned Martin
źródło
Wiem, że ten komentarz jest 6 lat później, ale FWIW: Pobieranie JavaScript za pomocą JavaScript '\uFEFF' + myCsvStringdziała zgodnie z oczekiwaniami w Mac Excel 15.19.1 (2016).
bobjones
0

Sprawdź kodowanie, w którym generujesz plik, aby program Excel poprawnie wyświetlał plik, musisz użyć domyślnej systemowej strony kodowej.

Jakiego języka używasz? jeśli to .Net, wystarczy użyć Encoding.Default podczas generowania pliku.

albertein
źródło
Dane eksportu to utf-8. Piszę plik eksportu za pomocą php 5
Freddo411
Transkoduj dane do strony kodowej Windows-1252, nie jestem pewien, jak to zrobić za pomocą php
albertein 30.09.08
0

Jeśli masz starszy kod w vb.net, tak jak ja, działał dla mnie następujący kod:

    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()
Johann
źródło
0

Znalazłem sposób na rozwiązanie problemu. To paskudny hack, ale działa: otwórz dokument w Open Office , a następnie zapisz go w dowolnym formacie programu Excel; wynikowy .xlslub .xlsxwyświetli zaakcentowane znaki.

Fred Reillier
źródło
1
OP twierdzi, że programowo eksportuje, więc nie szuka rozwiązania wymagającego ręcznej interwencji.
Christiaan Westerbeek,
0

W Ruby 1.8.7 koduję każde pole do UTF-16 i odrzucam BOM (być może).

Poniższy kod został wyodrębniony z eksportu_katalogu aktywnego:

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

Ważna linia to:

Iconv.conv('UTF-16', 'UTF-8', get_export_column_value(record, column))[2..-1]
Antonio Bardazzi
źródło
-2

otwórz plik csv za pomocą notatnika ++ clic na Encode, wybierz konwertuj na UTF-8 (nie konwertuj na UTF-8 (bez BOM)) Zapisz otwórz podwójnym kliknięciem z excel Hope, które pomagają Christophe'owi GRISON

Christophe GRISON
źródło
1
To nie jest odpowiedź na pytanie, jak sama powinna odbywać programowo i nie wymaga interwencji użytkownika, aby ręcznie ponownie zapisać każdy plik
Joe W