Pengkodean mana yang membuka file CSV dengan benar dengan Excel di Mac dan Windows?

138

Kami memiliki aplikasi web yang mengekspor file CSV yang berisi karakter asing dengan UTF-8, tanpa BOM. Baik pengguna Windows dan Mac mendapatkan karakter sampah di Excel. Saya mencoba mengonversi ke UTF-8 dengan BOM; Excel / Win baik-baik saja dengan itu, Excel / Mac menunjukkan omong kosong. Saya menggunakan Excel 2003 / Win, Excel 2011 / Mac. Inilah semua pengkodean yang saya coba:

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

Yang terbaik adalah UTF-16LE dengan BOM, tetapi CSV tidak dikenali seperti itu. Pemisah bidang adalah koma, tetapi titik koma tidak mengubah banyak hal.

Apakah ada pengkodean yang berfungsi di kedua dunia?

Timm
sumber
1
Bagaimana jika Anda menggunakan UTF-16LE untuk semua data bidang tetapi menggunakan karakter 8bit / ASCII untuk koma? Berdasarkan artikel ini ( creativyst.com/Doc/Articles/CSV/CSV01.htm#CSVAndEncodings ), Excel mungkin menafsirkan koma Unicode sebagai bagian dari data bidang alih-alih pemisah.
jveazey
1
Tip menarik @jveazey. Saya akan mencoba ini: mb_convert_encoding($str, "UTF-16LE");dalam kode ekspor saya dan memposting hasilnya di sini.
Timm
Bukan berarti ini membantu Anda, tetapi saya menguji Excel 2007 SP2 di Windows (menggunakan Notepad2 untuk membuat file uji). Semuanya bekerja kecuali UTF-16LE BOM (hasil yang sama seperti milik Anda di Windows) dan UTF-16BE BOM (yang mengurai bidang dengan benar tetapi BOM disertakan sebagai 2 karakter pertama di A1).
jveazey
@hveazey, pertanyaan yang dikutip memiliki jawaban oleh situs kode rekomendasi creechy Windows-1252. Itu tidak berhasil untuk kasus saya (umlaut Jerman dan sharp s).
Timm

Jawaban:

61

Pengkodean Excel

Saya menemukan WINDOWS-1252pengkodean menjadi yang paling tidak membuat frustrasi saat berhadapan dengan Excel. Karena pada dasarnya kumpulan karakter milik Microsoft sendiri, orang dapat berasumsi bahwa itu akan bekerja pada Mac dan versi Windows dari MS-Excel. Kedua versi tersebut setidaknya menyertakan pemilih "File origin" atau "File encoding" yang membaca data dengan benar.

Tergantung pada sistem Anda dan alat yang Anda gunakan, pengkodean ini bisa juga diberi nama CP1252, ANSI, Windows (ANSI), MS-ANSIatau hanya Windows, antara variasi lainnya.

Pengkodean ini adalah superset dari ISO-8859-1(alias LATIN1dan lainnya), jadi Anda dapat beralih ke ISO-8859-1jika Anda tidak dapat menggunakan WINDOWS-1252karena alasan tertentu. Perhatikan bahwa ISO-8859-1ada beberapa karakter yang hilang dari WINDOWS-1252seperti yang ditunjukkan di sini:

| Char | ANSI | Unicode | ANSI Hex | Unicode Hex | HTML entity | Unicode Name                               | Unicode Range            |
| €    | 128  | 8364    | 0x80     | U+20AC      | €      | euro sign                                  | Currency Symbols         |
| ‚    | 130  | 8218    | 0x82     | U+201A      | ‚     | single low-9 quotation mark                | General Punctuation      |
| ƒ    | 131  | 402     | 0x83     | U+0192      | ƒ      | Latin small letter f with hook             | Latin Extended-B         |
| „    | 132  | 8222    | 0x84     | U+201E      | „     | double low-9 quotation mark                | General Punctuation      |
| …    | 133  | 8230    | 0x85     | U+2026      | …    | horizontal ellipsis                        | General Punctuation      |
| †    | 134  | 8224    | 0x86     | U+2020      | †    | dagger                                     | General Punctuation      |
| ‡    | 135  | 8225    | 0x87     | U+2021      | ‡    | double dagger                              | General Punctuation      |
| ˆ    | 136  | 710     | 0x88     | U+02C6      | ˆ      | modifier letter circumflex accent          | Spacing Modifier Letters |
| ‰    | 137  | 8240    | 0x89     | U+2030      | ‰    | per mille sign                             | General Punctuation      |
| Š    | 138  | 352     | 0x8A     | U+0160      | Š    | Latin capital letter S with caron          | Latin Extended-A         |
| ‹    | 139  | 8249    | 0x8B     | U+2039      | ‹    | single left-pointing angle quotation mark  | General Punctuation      |
| Π   | 140  | 338     | 0x8C     | U+0152      | Π    | Latin capital ligature OE                  | Latin Extended-A         |
| Ž    | 142  | 381     | 0x8E     | U+017D      |             | Latin capital letter Z with caron          | Latin Extended-A         |
| ‘    | 145  | 8216    | 0x91     | U+2018      | ‘     | left single quotation mark                 | General Punctuation      |
| ’    | 146  | 8217    | 0x92     | U+2019      | ’     | right single quotation mark                | General Punctuation      |
| “    | 147  | 8220    | 0x93     | U+201C      | “     | left double quotation mark                 | General Punctuation      |
| ”    | 148  | 8221    | 0x94     | U+201D      | ”     | right double quotation mark                | General Punctuation      |
| •    | 149  | 8226    | 0x95     | U+2022      | •      | bullet                                     | General Punctuation      |
| –    | 150  | 8211    | 0x96     | U+2013      | –     | en dash                                    | General Punctuation      |
| —    | 151  | 8212    | 0x97     | U+2014      | —     | em dash                                    | General Punctuation      |
| ˜    | 152  | 732     | 0x98     | U+02DC      | ˜     | small tilde                                | Spacing Modifier Letters |
| ™    | 153  | 8482    | 0x99     | U+2122      | ™     | trade mark sign                            | Letterlike Symbols       |
| š    | 154  | 353     | 0x9A     | U+0161      | š    | Latin small letter s with caron            | Latin Extended-A         |
| ›    | 155  | 8250    | 0x9B     | U+203A      | ›    | single right-pointing angle quotation mark | General Punctuation      |
| œ    | 156  | 339     | 0x9C     | U+0153      | œ     | Latin small ligature oe                    | Latin Extended-A         |
| ž    | 158  | 382     | 0x9E     | U+017E      |             | Latin small letter z with caron            | Latin Extended-A         |
| Ÿ    | 159  | 376     | 0x9F     | U+0178      | Ÿ      | Latin capital letter Y with diaeresis      | Latin Extended-A         |

Perhatikan bahwa tanda euro tidak ada . Meja ini bisa didapatkan di Alan Wood .

Konversi

Konversi dilakukan secara berbeda di setiap alat dan bahasa. Namun, misalkan Anda memiliki file query_result.csvyang Anda tahu UTF-8dikodekan. Ubah menjadi WINDOWS-1252menggunakan iconv:

iconv -f UTF-8 -t WINDOWS-1252 query_result.csv > query_result-win.csv
mikezter
sumber
6
Agak aneh, tetapi ini tampaknya menjadi jawaban untuk mengimpor file .csv dengan karakter eropa ke Excel di Mac OSX
Fergie
1
Benar. Ini menjawab pertanyaan OP sebagai gantinya. Dalam kasus Anda, pertama-tama Anda harus mengetahui (atau menebak) pengkodean yang digunakan dalam "file .csv dengan karakter eropa". Kemudian Anda dapat mengubahnya menjadi WINDOS-1252, yang kemungkinan besar akan ditafsirkan dengan benar oleh Mac dan Windows Excel.
mikezter
1
Ini bukan solusi nyata, cepat atau lambat Anda akan menemukan karakter yang tidak dapat diubah menjadi WINDOWS-1252.
Walter Tross
2
WINDOWS-1252 akan gagal jika ada karakter Cina. Jadi sepertinya UTF-16LE dengan BOM adalah satu-satunya pilihan.
XWang
Ini berfungsi dengan baik untuk ekspor data SQL dengan diakritik.
bayi laki
27

Untuk UTF-16LE dengan BOM jika Anda menggunakan karakter tab sebagai pembatas, bukan koma, Excel akan mengenali bidang. Alasan berhasil adalah karena Excel akhirnya menggunakan parser Unicode * .txt-nya.

Peringatan : Jika file diedit di Excel dan disimpan, itu akan disimpan sebagai ASCII tab-delimited. Masalahnya sekarang adalah ketika Anda membuka kembali file, Excel menganggap itu CSV asli (dengan koma), melihat bahwa itu bukan Unicode, jadi parsing sebagai dipisahkan koma - dan karenanya akan membuat hash darinya!

Memperbarui : Peringatan di atas tampaknya tidak terjadi pada saya hari ini di Excel 2010 (Windows) setidaknya, meskipun tampaknya ada perbedaan dalam perilaku penyimpanan jika:

  • Anda mengedit dan keluar dari Excel (mencoba menyimpan sebagai 'Unicode * .txt')

dibandingkan dengan:

  • mengedit dan menutup file saja (berfungsi seperti yang diharapkan).
Duncan Cerdas
sumber
1
Bagus, tetapi peringatan itu mematahkan solusi bagi saya; pengguna akhir tidak akan senang dengan lembar Excel yang rusak.
Timm
Mungkin jika Anda mengubah ekstensi file awal menjadi * .txt, itu akan berhasil, tetapi kemudian Anda kehilangan asosiasi antara tipe file dan Excel: yaitu mereka tidak dapat mengklik dua kali file dan membukanya di Excel secara otomatis.
Duncan Smart
Itu tidak akan berhasil untukku. Karena tidak paham komputer, pengguna akhir perlu membukanya di Excel tanpa hambatan apa pun.
Timm
Saya memiliki lembar Excel ".csv" yang terlihat bagus dengan karakter khusus dan bidang terpisah. Saya memulai string keluaran saya dengan "\ ufeff" sebagai tanda urutan byte (BOM), kemudian menggunakan tab "\ t" sebagai pengganti koma untuk pemisahan bidang, dan menyandikan file dengan "utf-16LE". Bekerja seperti pesona, berkat halaman ini!
Saham Geek
Baris pertama sep=,dan pengkodean UTF16LE berfungsi untuk saya dan tidak memerlukan karakter pemisah yang berbeda (tetap koma). Membuka file dengan mengklik dua kali memuat file dengan benar, dengan karakter khusus dan jeda baris di dalam sel utuh. Kelemahan: sep=,header tidak dikenali oleh program apa pun kecuali Excel sejauh yang saya lihat. Tetapi OpenOffice / LibreOffice tidak memerlukan peretasan ini (jeda baris dalam konten sel berfungsi dengan baik, sedangkan memuat dari file teks / menggunakan teks ke dalam asisten kolom di Excel tidak menangani jeda baris di sel dengan benar).
CodeManX
24

Intinya adalah: Tidak ada solusi. Excel 2011 / Mac tidak dapat menafsirkan dengan benar file CSV yang berisi umlaut dan tanda diakritik apa pun pengkodean atau lompatan lingkaran yang Anda lakukan. Saya akan senang mendengar seseorang mengatakan saya berbeda!

Timm
sumber
4
Saya menemukan pengkodean WIN-1252 atau ISO-8859-1 berfungsi. Silakan lihat jawaban saya.
mikezter
3
Solusinya adalah dengan menggunakan UTF-16LE dan memastikan bahwa Anda menggunakan tab untuk memisahkan kolom, bukan koma.
Tim Groeneveld
Apakah Anda benar-benar mencobanya di Win dan Mac Tim? Seperti yang saya sebutkan, TSV bukanlah pilihan dalam kasus saya.
Timm
1
Bagi saya, ekspor berfungsi dengan baik jika saya menggunakan pengkodean WIN-1252, baik di Mac maupun di versi Windows Excel. @ Timm, Anda harus mempertimbangkan untuk mengubah jawaban yang diterima.
Pierre Arnaud
2
Bagi mereka yang menemukan ini berfungsi, apakah Anda sebenarnya memiliki karakter tambahan (seperti bahasa Cina) di kumpulan data Anda? Pengkodean WIN-1252 rusak karena berada di luar jangkauan.
Bill Leeper
11

Anda hanya mencoba CSV yang dipisahkan koma dan titik koma. Jika Anda telah mencoba CSV yang dipisahkan tab (juga disebut TSV), Anda akan menemukan jawabannya:

UTF-16LE dengan BOM (tanda urutan byte), dipisahkan tab


Tapi : Dalam komentar Anda menyebutkan bahwa TSV bukanlah pilihan untuk Anda (saya belum dapat menemukan persyaratan ini dalam pertanyaan Anda). Kasihan. Ini sering kali berarti bahwa Anda mengizinkan pengeditan file TSV secara manual, yang mungkin bukan ide yang baik. Pemeriksaan visual file TSV tidak menjadi masalah. Selanjutnya editor dapat diatur untuk menampilkan karakter khusus untuk menandai tab.

Dan ya, saya mencobanya di Windows dan Mac.

Walter Tross
sumber
4

Berikut adalah penentu untuk mengimpor CSV berenkode utf8 ke Excel 2011 untuk Mac: Microsoft mengatakan: "Excel untuk Mac saat ini tidak mendukung UTF-8." Excel untuk Mac 2011 dan UTF-8

Hore, hebat MS!

Timm
sumber
4

Solusi terbaik untuk membaca file CSV dengan UTF-8 di Mac adalah dengan mengonversinya menjadi format XLSX. Saya telah menemukan skrip yang dibuat oleh Konrad Foerstner, yang telah saya tingkatkan sedikit dengan menambahkan dukungan untuk karakter pembatas yang berbeda.

Unduh skrip dari Github https://github.com/brablc/clit/blob/master/csv2xlsx.py . Dalam rangka untuk menjalankannya Anda akan perlu menginstal python modul openpyxl untuk manipulasi file Excel: sudo easy_install openpyxl.

brablc
sumber
3

Dalam kasus saya ini berhasil (Mac, Excel 2011, karakter Sirilik dan Latin dengan diakritik Ceko):

  • Charset UTF-16LE (UTF-16 saja tidak cukup)
  • BOM "\ xFF \ xFE"
  • \ t (tab) sebagai pemisah
  • Jangan lupa untuk menyandikan juga pemisah dan CRLF :-)
  • Gunakan iconv sebagai ganti mb_convert_encoding
Marek Demčák
sumber
2

Tampaknya kasus saya bahwa Excel 2011 untuk Mac OS tidak menggunakan Encoding.GetEncoding ("10000") seperti yang saya pikirkan dan menghabiskan 2 hari dengan tapi iso yang sama seperti di Microsoft OS. Bukti terbaik untuk ini adalah dengan membuat file di Excel 2011 untuk MAC dengan karakter khusus, simpan sebagai CSV, lalu buka di editor teks MAC dan karakter diacak.

Bagi saya, pendekatan ini berhasil - artinya ekspor csv di Excel 2011 di MAC OS memiliki karakter europeean barat khusus di dalamnya:

Encoding isoMacOS = Encoding.GetEncoding("iso-8859-1");
Encoding defaultEncoding = Encoding.Default; 

// Convert the string into a byte array.
byte[] defaultEncodingBytes = defaultEncoding.GetBytes(exportText);

// Perform the conversion from one encoding to the other.
byte[] ansiBytes = Encoding.Convert(defaultEncoding, isoMacOS, defaultEncodingBytes);

decodedString = isoMacOS.GetString(ansiBytes);
pengguna525081
sumber
Bahasa apa yang Anda gunakan @ user525081? Bisakah Anda menerjemahkannya ke PHP?
Timm
@Timm yang terlihat seperti contoh Java tetapi di PHP Anda dapat menggunakan iconv untuk melakukan konversi - de3.php.net/manual/en/function.iconv.php
Ashish Datta
OK @ user525081, kesepakatan yang sama dengan jawaban lainnya. Ini melayani pengguna Mac, meninggalkan orang-orang Windows dalam kesulitan; dan itu tidak menjawab pertanyaan awal - pengkodean yang berfungsi di kedua platform. Terima kasih.
Timm
2

UTF-8 tanpa BOM saat ini berfungsi untuk saya di Excel Mac 2011 14.3.2.

UTF-8 + BOM jenis pekerjaan, tetapi BOM dianggap omong kosong.

UTF-16 berfungsi jika Anda mengimpor file dan menyelesaikan wizard, tetapi tidak jika Anda hanya mengklik dua kali.

Craig Stuntz
sumber
2

Yang berikut ini berfungsi untuk saya di Excel untuk Mac 2011 dan Windows Excel 2002:

  1. Menggunakan iconv di Mac, konversikan file ke UTF-16 Little-Endian + beri nama * .txt (ekstensi .txt memaksa Excel untuk menjalankan Wisaya Impor Teks):

    iconv -f UTF-8 -t UTF-16LE filename.csv >filename_UTF-16LE.csv.txt

  2. Buka file di Excel dan di Wisaya Impor Teks pilih:

    • Langkah 1: Asal file : abaikan, apa pun yang Anda pilih
    • Langkah 2: pilih nilai yang sesuai untuk Pembatas dan pengualifikasi Teks
    • Langkah 3: jika perlu, pilih format kolom

PS UTF-16LE yang dibuat oleh iconv memiliki BOM byte FF FE pada awalnya.

PPS File csv asli saya dibuat di komputer Windows 7, dalam format UTF-8 (dengan byte BOM EF BB BF pada awalnya) dan menggunakan jeda baris CRLF. Koma digunakan sebagai pembatas bidang dan tanda kutip tunggal sebagai pengualifikasi teks. Itu berisi huruf ASCII ditambah huruf latin yang berbeda dengan tilde, umlaut dll, ditambah beberapa cyrillic. Semua ditampilkan dengan benar di Excel untuk Win dan Mac.

Versi perangkat lunak PPPS Exact:
* Mac OS X 10.6.8
* Excel untuk Mac 2011 v.14.1.3
* Windows Server 2003 SP2
* Windows Excel 2002 v.10.2701.2625

Koit Saarevet
sumber
Jika Anda memiliki file UTF-8 tanpa BOM, iconv akan mengubahnya menjadi UTF-16LE tanpa BOM (dan sayangnya tidak ada cara untuk memberi tahu iconv untuk menambahkannya)
Walter Tross
2

Di Mac OS saya, Text Wrangler mengidentifikasi file CSV yang dibuat dengan Excel memiliki pengkodean "Barat".

Setelah beberapa googling, saya telah membuat skrip kecil ini (saya tidak yakin tentang ketersediaan Windows, mungkin dengan Cygwin ?):

$ cat /usr/local/bin/utf8.sh

#!/bin/bash

INPUTFILE="$1"

iconv -f macroman -c -t UTF-8 $INPUTFILE |tr '\r' '\n' >/tmp/file.$$.csv

mv $INPUTFILE ms_trash
mv /tmp/file.$$.csv $INPUTFILE
Nuno
sumber
Ini adalah satu-satunya hal yang berhasil untuk saya di OS X 10.14.2 (dan Excel 2011)
Donald
1

Dalam kasus saya menambahkan Pembukaan ke file memecahkan masalah saya:

var data = Encoding.UTF8.GetBytes(csv);
var result = Encoding.UTF8.GetPreamble().Concat(data).ToArray();
return File(new MemoryStream(result), "application/octet-stream", "data.csv");
pisau cukur
sumber
0

alih-alih csv, cobalah mengeluarkan html dengan ekstensi XLS dan jenis mime "application / excel". Saya tahu ini akan berfungsi di Windows, tetapi tidak dapat berbicara untuk MacOS

royce3
sumber
Terima kasih @ royce23, tapi saya hanya menawarkan file CSV untuk diunduh. Saya tidak dapat menyajikannya melalui HTTP karena ukuran markup yang sangat besar akan memperlambat respons terhadap perayapan - tabel yang diekspor mungkin berisi jutaan baris ...
Timm
dengan css html Anda hanya akan menjadi pecahan kecil yang lebih besar dari csv, misalnya: <r><c>id</c><c>name</c><c>phone</c> </r>
royce3
Tidak yakin apakah saya mengerti, tetapi saya menyimpan CSV di server dan menawarkan tautan unduhan. Menghasilkan respons HTML menghabiskan terlalu banyak memori PHP ...
Timm
Ini akan berfungsi (karakter UTF-8) tetapi jika Anda telah menyematkan jeda baris di dalam sel ( brtag), Excel untuk Mac mengabaikan CSS (berfungsi dengan Windows) mso-data-placement:same-cell;
cropredy
0

Ini berhasil untuk saya

  1. Buka file di BBEdit atau TextWrangler *.
  2. Tetapkan file sebagai Unicode (UTF-16 Little-Endian) (Line Endings dapat berupa Unix atau Windows). Menyimpan!
  3. Di Excel: Data> Dapatkan Data Eksternal> Impor File Teks ...

Sekarang poin kuncinya, pilih MacIntosh sebagai File Origin (itu harus menjadi pilihan pertama).

Ini menggunakan Excel 2011 (versi 14.4.2)

* Ada sedikit dropdown di bagian bawah jendela

Gazzer
sumber
0

Selesaikan ini menggunakan java (UTF-16LE dengan BOM):

String csvReportStr = getCsvReport();
byte[] data = Charset.forName("UTF-16LE").encode(csvReportStr)
    .put(0, (byte) 0xFF)
    .put(1, (byte) 0xFE)
    .array();

Perhatikan bahwa file CSV harus menggunakan TAB sebagai pemisah. Anda dapat membaca file CSV baik di windows dan MAC OS X.

Lihat: Bagaimana cara saya menyandikan / mendekode array byte UTF-16LE dengan BOM?

bluearrow
sumber