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?
excel
encoding
csv
diacritics
Freddo411
źródło
źródło
Odpowiedzi:
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> :)
źródło

w pierwszej komórce; lub coś zupełnie innego.
). 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.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
\ufeff
to LM UTF-16 (BE), a nie LM UTF-8Poniżej znajduje się kod PHP, którego używam w swoim projekcie, wysyłając program Microsoft Excel do użytkownika:
ZAKTUALIZOWANO: Poprawa nazwy pliku i BŁĄD poprawiają obliczanie prawidłowej długości. Dzięki TRiG i @ ivanhoe011
źródło
'Content-Disposition: attachment; filename="'.$filename.'.csv"'
ponieważ Firefox chce podwójnych cudzysłowów, w przeciwnym razie odcina nazwę pliku po spacji.text/csv
), ale nazywasz go Excel (application/vnd.ms-excel
)?header('Content-Length: '. mb_strlen($encoded_csv, 'UTF-16LE'));
?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:
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
źródło
sep=,
lub cokolwiek, czego chcesz użyć? Jeśli już dodajesz BOM, zakładam, że nie masz nic przeciwko dodawaniu rzeczy do pliku.wybierz kodowanie UTF-8 podczas importowania. jeśli korzystasz z pakietu Office 2007, wybierz go: zaraz po otwarciu pliku.
źródło
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.
Działa to dla mnie, ponieważ muszę wygenerować plik, który będzie używany tylko na komputerach z systemem Windows.
źródło
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ć.
źródło
Jak powiedział Fregal, droga jest dobra.
źródło
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:
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.
źródło
open('oldmac.csv', 'rb').read()
aby zweryfikować swój wkład?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:
źródło
border="1"
do stołu, to zrobić uzyskać linie, ale tuż za 4 komórki :)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.
źródło
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.
źródło
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.
źródło
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.
źródło
Zapisanie BOM do wyjściowego pliku CSV faktycznie działało dla mnie w Django:
Aby uzyskać więcej informacji http://crashcoursing.blogspot.com/2011/05/exporting-csv-with-special-characters.html Dzięki chłopaki!
źródło
printWriter.print('\ufeff')
zobacz także Jak dodać BOM UTF-8 w java .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-Type
odpowiednie ustawienie czegoś podobnegotext/csv; charset=Windows-1252
i ustawienie kodowania znaków strumienia odpowiedzi w podobny sposób.źródło
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…
źródło
'\uFEFF' + myCsvString
działa zgodnie z oczekiwaniami w Mac Excel 15.19.1 (2016).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.
źródło
Jeśli masz starszy kod w vb.net, tak jak ja, działał dla mnie następujący kod:
źródło
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
.xls
lub.xlsx
wyświetli zaakcentowane znaki.źródło
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:
Ważna linia to:
źródło
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
źródło