Mamy aplikację internetową, która eksportuje pliki CSV zawierające obce znaki z UTF-8, bez BOM. Użytkownicy systemów Windows i Mac otrzymują śmieciowe znaki w programie Excel. Próbowałem przekonwertować na UTF-8 z BOM; Excel / Win jest w porządku, Excel / Mac pokazuje bełkot. Używam programu Excel 2003 / Win, Excel 2011 / Mac. Oto wszystkie kodowania, które wypróbowałem:
Encoding BOM Win Mac
-------- --- ---------------------------- ------------
utf-8 -- scrambled scrambled
utf-8 BOM WORKS scrambled
utf-16 -- file not recognized file not recognized
utf-16 BOM file not recognized Chinese gibberish
utf-16LE -- file not recognized file not recognized
utf-16LE BOM characters OK, same as Win
row data all in first field
Najlepszy to UTF-16LE z BOM, ale CSV nie jest rozpoznawany jako taki. Separatorem pól jest przecinek, ale średnik niczego nie zmienia.
Czy jest jakieś kodowanie, które działa w obu światach?
mb_convert_encoding($str, "UTF-16LE");
w moim kodzie eksportu i opublikuj wyniki tutaj.Odpowiedzi:
Kodowanie Excela
Zauważyłem, że
WINDOWS-1252
kodowanie jest najmniej frustrujące w przypadku programu Excel. Ponieważ jest to w zasadzie własny, zastrzeżony zestaw znaków Microsoftu, można założyć, że będzie działał zarówno na Mac, jak i na Windows w wersji MS-Excel. Obie wersje zawierają przynajmniej odpowiedni selektor „Pochodzenie pliku” lub „Kodowanie pliku”, który prawidłowo odczytuje dane.W zależności od systemu i narzędzi użyć, to kodowanie może być również nazwany
CP1252
,ANSI
,Windows (ANSI)
,MS-ANSI
lub po prostuWindows
, między innymi odmianami.To kodowanie jest nadzbiorem
ISO-8859-1
(akaLATIN1
i innych), więc możesz wrócić do niego,ISO-8859-1
jeśliWINDOWS-1252
z jakiegoś powodu nie możesz go użyć . Pamiętaj, żeISO-8859-1
brakuje niektórych znaków z,WINDOWS-1252
jak pokazano tutaj:Zwróć uwagę, że brakuje znaku euro . Ten stół można znaleźć u Alana Wooda .
Konwersja
Konwersja przebiega inaczej w każdym narzędziu i języku. Załóżmy jednak, że masz plik, o
query_result.csv
którym wiesz, że jestUTF-8
zakodowany. Przekształcić goWINDOWS-1252
za pomocąiconv
:źródło
WINDOS-1252
, który najprawdopodobniej zostanie poprawnie zinterpretowany zarówno przez Maca, jak i Windows Excel.W przypadku UTF-16LE z BOM, jeśli jako separatory użyjesz znaków tabulacji zamiast przecinków, program Excel rozpozna pola. Powodem, dla którego to działa, jest fakt, że Excel w rzeczywistości używa parsera Unicode * .txt.
Uwaga : jeśli plik jest edytowany w programie Excel i zapisany, zostanie zapisany jako rozdzielany tabulatorami ASCII. Problem polega teraz na tym, że po ponownym otwarciu pliku program Excel zakłada, że jest to prawdziwy CSV (z przecinkami), widzi, że nie jest to Unicode, więc analizuje go jako rozdzielany przecinkami - i dlatego tworzy z niego skrót!
Aktualizacja : Wydaje się, że powyższe zastrzeżenie nie dotyczy mnie dzisiaj przynajmniej w programie Excel 2010 (Windows), chociaż wydaje się, że istnieje różnica w zachowaniu oszczędzania, jeśli:
w porównaniu do:
źródło
sep=,
Kodowanie pierwszej linii i UTF16LE działało u mnie i nie wymagało innego znaku separatora (pozostał przecinek). Otwarcie pliku przez dwukrotne kliknięcie wczytało plik poprawnie, z zachowaniem znaków specjalnych i podziałów wierszy w komórkach. Wada:sep=,
nagłówek nie jest rozpoznawany przez żaden program poza Excelem, o ile widziałem. Ale OpenOffice / LibreOffice i tak nie wymagają tego hacka (podziały wierszy w zawartości komórki działają dobrze, podczas gdy ładowanie z pliku tekstowego / użycie tekstu do asystenta kolumn w Excelu nie obsługuje poprawnie podziałów wierszy w komórkach).Najważniejsze jest to: nie ma rozwiązania. Excel 2011 / Mac nie może poprawnie zinterpretować pliku CSV zawierającego umlauty i znaki diakrytyczne bez względu na to, jakie kodowanie lub przeskakujesz. Byłbym szczęśliwy, gdyby ktoś powiedział mi coś innego!
źródło
Próbowałeś tylko pliku CSV rozdzielanego przecinkami i średnikami. Gdybyś wypróbował CSV rozdzielany znakami tabulacji (zwany także TSV), znalazłbyś odpowiedź:
UTF-16LE z BOM (znak kolejności bajtów), oddzielone tabulatorami
Ale : W komentarzu wspominasz, że TSV nie jest dla ciebie opcją (chociaż nie udało mi się znaleźć tego wymagania w twoim pytaniu). Szkoda. Często oznacza to, że pozwalasz na ręczną edycję plików TSV, co prawdopodobnie nie jest dobrym pomysłem. Wizualne sprawdzanie plików TSV nie stanowi problemu. Ponadto edytory można ustawić tak, aby wyświetlały specjalny znak do oznaczania zakładek.
I tak, wypróbowałem to na Windows i Mac.
źródło
Oto kwestia importowania pliku CSV zakodowanego w utf8 do programu Excel 2011 dla komputerów Mac: Microsoft mówi: „Program Excel dla komputerów Mac obecnie nie obsługuje UTF-8”. Excel 2011 dla komputerów Mac i UTF-8
Tak, droga do stwardnienia rozsianego!
źródło
Najlepszym obejściem do odczytywania plików CSV za pomocą UTF-8 na Macu jest przekonwertowanie ich na format XLSX. Znalazłem skrypt autorstwa Konrada Foerstnera, który poprawiłem trochę, dodając obsługę różnych znaków separatora.
Pobierz skrypt z Github https://github.com/brablc/clit/blob/master/csv2xlsx.py . Aby go uruchomić trzeba będzie zainstalować moduł Pythona openpyxl for Excel manipulacji pliku:
sudo easy_install openpyxl
.źródło
W moim przypadku to zadziałało (Mac, Excel 2011, cyrylica i łacińskie znaki z czeskimi znakami diakrytycznymi):
źródło
Wydaje mi się, że Excel 2011 dla Mac OS nie używa Encoding.GetEncoding ("10000"), jak myślałem i zmarnowałem 2 dni z tą samą iso, co w systemie Microsoft OS. Najlepszym dowodem na to jest utworzenie pliku w Excel 2011 dla MAC ze specjalnymi znakami, zapisanie go jako CSV, a następnie otwarcie w edytorze tekstu MAC, a znaki są zaszyfrowane.
Dla mnie to podejście zadziałało - co oznacza, że eksport CSV w programie Excel 2011 w systemie MAC OS zawiera w sobie specjalne znaki zachodnioeuropejskie:
źródło
UTF-8 bez BOM obecnie działa dla mnie w programie Excel Mac 2011 14.3.2.
UTF-8 + BOM działa, ale BOM renderowane jako bełkot.
UTF-16 działa, jeśli zaimportujesz plik i ukończysz kreatora, ale nie po dwukrotnym kliknięciu.
źródło
Poniższe działały dla mnie w programie Excel 2011 dla komputerów Mac i Windows Excel 2002:
Używając iconv na Macu, przekonwertuj plik do UTF-16 Little-Endian + nazwij go * .txt (rozszerzenie .txt zmusza Excela do uruchomienia Kreatora importu tekstu):
iconv -f UTF-8 -t UTF-16LE filename.csv >filename_UTF-16LE.csv.txt
Otwórz plik w programie Excel iw Kreatorze importu tekstu wybierz:
PS UTF-16LE stworzony przez iconv ma na początku bajty BOM FF FE.
PPS Mój oryginalny plik csv został utworzony na komputerze z systemem Windows 7 w formacie UTF-8 (z bajtami BOM EF BB BF na początku) i wykorzystywał podziały wierszy CRLF. Przecinek został użyty jako separator pól, a pojedynczy cudzysłów jako kwalifikator tekstu. Zawierał litery ASCII oraz różne litery łacińskie z tyldami, umlautami itp., A także cyrylicę. Wszystkie wyświetlane poprawnie w programie Excel dla Win i Mac.
PPPS Dokładne wersje oprogramowania:
* Mac OS X 10.6.8
* Excel dla Mac 2011 wer. 14.1.3
* Windows Server 2003 SP2
* Windows Excel 2002 wer. 10.2701.2625
źródło
W moim systemie Mac OS Text Wrangler zidentyfikował plik CSV utworzony w programie Excel jako mający kodowanie „zachodnie”.
Po pewnym googlowaniu zrobiłem ten mały skrypt (nie jestem pewien co do dostępności Windowsa, może z Cygwin ?):
$ cat /usr/local/bin/utf8.sh
źródło
W moim przypadku dodanie Preambuły do pliku rozwiązało mój problem:
źródło
zamiast csv, próbując wyprowadzić html z rozszerzeniem XLS i typem MIME „application / excel”. Wiem, że to zadziała w systemie Windows, ale nie mogę mówić w systemie MacOS
źródło
br
tag), Excel dla komputerów Mac ignoruje (działa z systemem Windows) CSSmso-data-placement:same-cell;
To działa dla mnie
Teraz kluczowa kwestia, wybierz MacIntosh jako pochodzenie pliku (powinien to być pierwszy wybór).
Używa programu Excel 2011 (wersja 14.4.2)
* W dolnej części okna znajduje się małe menu
źródło
Rozwiąż ten problem za pomocą java (UTF-16LE z BOM):
Zauważ, że plik CSV powinien używać
TAB
jako separator. Możesz czytać plik CSV zarówno w systemie Windows, jak i MAC OS X.Odnosić się do: Jak kodować / dekodować tablice bajtów UTF-16LE za pomocą BOM?
źródło