Microsoft Excel mangles Diacritics dalam file .csv?

190

Saya secara terprogram mengekspor data (menggunakan PHP 5.2) ke dalam file uji .csv.
Contoh data: Numéro 1(perhatikan aksen e). Data tersebut utf-8(tidak ada BOM yang diawali).

Ketika saya membuka file ini di MS Excel ditampilkan sebagai Numéro 1.

Saya dapat membuka ini di editor teks (UltraEdit) yang menampilkannya dengan benar. UE melaporkan karakternya decimal 233.

Bagaimana saya bisa mengekspor data teks dalam file .csv sehingga MS Excel akan merendernya dengan benar , lebih disukai tanpa memaksakan penggunaan panduan impor, atau pengaturan panduan non-default?

Freddo411
sumber
Saya akan sangat tertarik mendengar lebih banyak tentang solusi BOM Anda, karena saya yakin saya sudah mencoba "EF BB BF" yang tidak berhasil untuk saya.
James Baker
3
Solusi kerja yang dipilih adalah: * termasuk BOM; utf-8 * gunakan tajuk ini: 'Tipe konten: teks / polos; charset = utf-8 'Ini "bekerja" di excel 2003 dan excel 2007 - di mana berfungsi = dibuka tanpa wizard impor dan membuat diakritik dengan benar. Saya tidak memverifikasi bahwa BOM diperlukan.
Freddo411
2
BOM diperlukan, saya baru saja menguji ini sekarang. Tanpanya, karakter khusus tidak akan berlaku.
Alex Ciminian
2
akan senang jika seseorang bisa mengatakan lebih banyak tentang cara menambahkan BOM (byte-order marker). Jika saya hanya melakukan sesuatu seperti Response.Write (EF BB BF ") karakter-karakter itu hanya muncul di awal file.
sydneyos
sydneyos: Seperti yang dikatakan Fergal di bawah ini; Tambahkan \ uFEFF ke string Anda.
noocyte

Jawaban:

243

File UTF8 yang diformat dengan benar dapat memiliki Byte Order Mark sebagai tiga oktet pertama. Ini adalah nilai hex 0xEF, 0xBB, 0xBF. Oktet ini berfungsi untuk menandai file sebagai UTF8 (karena mereka tidak relevan sebagai informasi "byte order"). 1 Jika BOM ini tidak ada, konsumen / pembaca dibiarkan untuk menyimpulkan jenis penyandian teks. Pembaca yang tidak mampu UTF8 akan membaca byte sebagai beberapa penyandian lain seperti Windows-1252 dan menampilkan karakter pada awal file.

Ada bug yang diketahui di mana Excel, saat membuka file CSF UTF8 melalui asosiasi file, mengasumsikan bahwa mereka berada dalam pengkodean byte tunggal, mengabaikan keberadaan BOM UTF8. Ini tidak dapat diperbaiki oleh codepage atau pengaturan bahasa default sistem. BOM tidak akan tahu di Excel - itu tidak akan berfungsi. (Laporan minoritas mengklaim bahwa BOM terkadang memicu wizard "Impor Teks"). Bug ini tampaknya ada di Excel 2003 dan sebelumnya. Sebagian besar laporan (di tengah jawaban di sini) mengatakan bahwa ini diperbaiki di Excel 2007 dan yang lebih baru.

Perhatikan bahwa Anda selalu dapat * dengan benar membuka file UTF8 CSV di Excel menggunakan wizard "Impor Teks", yang memungkinkan Anda menentukan enkode file yang Anda buka. Tentu saja ini jauh lebih tidak nyaman.

Pembaca jawaban ini kemungkinan besar dalam situasi di mana mereka tidak mendukung Excel <2007, tetapi mengirim teks UTF8 mentah ke Excel, yang salah menafsirkannya dan menaburkan teks Anda dengan Ãdan karakter Windows-1252 serupa lainnya. Menambahkan BOM UTF8 mungkin adalah perbaikan terbaik dan tercepat Anda.

Jika Anda terjebak dengan pengguna pada Excels yang lebih lama, dan Excel adalah satu-satunya konsumen CSV Anda, Anda dapat mengatasinya dengan mengekspor UTF16 alih-alih UTF8. Excel 2000 dan 2003 akan klik dua kali-buka ini dengan benar. (Beberapa editor teks lain dapat memiliki masalah dengan UTF16, jadi Anda mungkin harus mempertimbangkan pilihan Anda dengan cermat.)


* Kecuali jika Anda tidak bisa, (setidaknya) Excel 2011 untuk Wisaya Impor Mac sebenarnya tidak selalu berfungsi dengan semua penyandian, terlepas dari apa yang Anda katakan. </anecdotal-evidence> :)

James Baker
sumber
14
Butuh saya selamanya untuk menemukan tempat menentukan pengkodean. Simpan Dialog> Alat Tombol> Opsi Web> Tab Pengkodean. Mereka memang pandai menyembunyikan hal-hal penting seperti itu.
Triynko
6
Salah: menambahkan BOM ke file UTF-8 memuat file itu dengan benar tanpa memerlukan panduan impor di Excel 2007.
Victor Nicollet
3
Kami menemukan hal yang sama seperti yang dikatakan Victor hari ini (menggunakan Excel 2010, hanya itu yang kami miliki). Menambahkan UTF-8 BOM / Signature (EF BB BF) tampaknya memperbaiki klik dua kali menggunakan pengkodean default sistem, dan menggunakan UTF8 dengan benar :)
Danny Tuppeny
20
Secara umum , file yang dikodekan UTF-8 tidak boleh memiliki Marked Byte Order. UTF-8 tidak memiliki urutan byte variabel, dan menaruhnya disabotase kompatibilitas ASCII UTF-8. Ada beberapa format file tertentu yang mengizinkan atau mendorong UTF-8 faux-BOM, tetapi sebaliknya harus dihindari. CSV sepenuhnya penyandian-bodoh sehingga siapa pun dapat menebak apakah alat yang diberikan akan menafsirkan urutan byte 0xEF 0xBB 0xBF sebagai indikator UTF-8; karakter kontrol yang tidak terlihat di sel pertama; karakter di sel pertama; atau sesuatu yang lain sama sekali.
bobince
3
@Ian: Tidak ada yang tahu pasti itu UTF-8 dengan BOM baik - 0xEF 0xBB 0xBF adalah urutan yang valid dalam sebagian besar pengkodean warisan juga (karenanya sering disalahartikan sebagai ISO-8859-1 atau cp1252 dan ditampilkan sebagai ). Ini hanya membantu menebak algoritma, dan untuk format file yang secara khusus membuat kelonggaran untuk itu (misalnya XML). Kelemahan untuk memasukkan BOM palsu dalam file UTF-8 adalah Anda mematahkan kompatibilitas ASCII mereka (titik penjualan utama untuk UTF-8) Banyak alat bantu penyandian-pengabaian teks akan pecah dihadapkan dengan BOM faux-terkemuka terkemuka yang tidak terduga.
bobince
39

Membebani BOM (\ uFEFF) berhasil untuk saya (Excel 2007), karena Excel mengenali file tersebut sebagai UTF-8. Kalau tidak, menyimpannya dan menggunakan wizard impor berfungsi, tetapi kurang ideal.


sumber
1
Ini masih membuka panduan impor teks, jadi perbedaannya adalah Anda cukup mengklik dua kali, jadi tetap saja tidak ideal tetapi satu-satunya solusi yang diketahui.
haridsv
Bagi saya, tidak ada panduan impor yang muncul dengan Excel 2007.
Victor Nicollet
Juga tidak ada wizard impor - ini berfungsi seperti yang diharapkan jika ada UTF8 BOM / Signature (EF BB BF).
Danny Tuppeny
Juga, \ufeffadalah BOM UTF-16 (BE) bukan BOM UTF-8
Alastair McCormack
2
Tidak, @AlastairMcCormack, itu baik, tergantung pada bagaimana itu dikodekan. "\ ufeff" yang dikodekan sebagai UTF-8 adalah EF BB BF. (Di-encode sebagai UTF-16, itu hanya akan menjadi dua byte.)
Dave Burt
30

Di bawah ini adalah kode PHP yang saya gunakan dalam proyek saya ketika mengirim Microsoft Excel ke pengguna:

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

DIPERBARUI: Peningkatan nama file dan BUG memperbaiki perhitungan panjang yang benar. Terima kasih untuk TRiG dan @ ivanhoe011

Marc Carlucci
sumber
1
Saya mencoba beberapa saran lain di halaman ini, tetapi ini berhasil untuk saya di Excel 2007. Perubahan yang paling penting adalah menggunakan tab alih-alih koma (meskipun itu file .csv) dan baris di atas yang menggemakan kedua karakter diikuti oleh panggil ke mb_convert_encoding (). Saya juga harus mengkompilasi ulang PHP dengan --enable-mbstring untuk mendapatkan dukungan untuk mb_convert_encoding (). Terima kasih!
Russell G
1
Ini bekerja dengan baik untuk saya juga, terima kasih. Namun, di Safari saya mendapatkan kesalahan di konsol saya 'Sumberdaya ditafsirkan sebagai dokumen tetapi ditransfer sebagai ...' Saya kira itu adalah kekhasan WebKit, menilai stackoverflow.com/questions/3899426/… , tapi mungkin tidak dan / atau seseorang memiliki menemukan solusi. Selanjutnya, dalam contoh Anda, saya akan menyarankan perubahan: 'Content-Disposition: attachment; filename="'.$filename.'.csv"'karena Firefox ingin tanda kutip ganda, atau jika tidak maka akan memotong nama file Anda setelah spasi.
kasimir
Mengapa Anda mengeluarkan CSV ( text/csv) tetapi menyebutnya Excel ( application/vnd.ms-excel)?
TRiG
2
Ini sangat bagus! Saya dapat mengonfirmasi itu berfungsi di Mac juga (di Office 2011).
Jonathan
Bukankah ini seharusnya header('Content-Length: '. mb_strlen($encoded_csv, 'UTF-16LE'));?
Rich Bradshaw
13

Jawaban untuk semua kombinasi versi Excel (2003 + 2007) dan tipe file

Sebagian besar jawaban lain di sini hanya menyangkut versi Excel mereka dan tidak akan selalu membantu Anda, karena jawaban mereka mungkin tidak benar untuk versi Excel Anda.

Misalnya, menambahkan karakter BOM menimbulkan masalah dengan pengenalan pemisah kolom otomatis, tetapi tidak dengan setiap versi Excel.

Ada 3 variabel yang menentukan apakah itu berfungsi di sebagian besar versi Excel:

  • Pengkodean
  • Kehadiran karakter BOM
  • Pemisah sel

Seseorang yang tabah di SAP mencoba setiap kombinasi dan melaporkan hasilnya. Hasil akhir? Gunakan UTF16le dengan BOM dan karakter tab sebagai pemisah agar berfungsi di sebagian besar versi Excel.

Kamu tidak percaya padaku? Saya juga tidak akan, tetapi baca di sini dan menangis: http://wiki.sdn.sap.com/wiki/display/ABAP/CSV+tests+of+encoding+and+column+separator

Christiaan Westerbeek
sumber
Mengapa tidak menambahkan saja sep=,atau apa pun yang ingin Anda gunakan? Jika Anda sudah menambahkan BOM, saya berasumsi Anda tidak segan menambahkan barang ke file.
Casey
Sebenarnya, untuk menjawab pertanyaan saya sendiri, Anda tidak akan menambahkan deklarasi pemisah bidang karena ini menyebabkan trik ini berhenti bekerja. Jadi pada dasarnya itu encoding kacau atau file Anda tidak ditafsirkan dengan benar sebagai CSV jika pengguna Anda memiliki pengaturan wilayah yang salah.
Casey
1
utf-16le + BOM (0xFF 0xFE) + tab adalah yang terbaik
zhaozhi
10

pilih pengkodean UTF-8 saat mengimpor. jika Anda menggunakan Office 2007 ini adalah tempat Anda memilihnya: tepat setelah Anda membuka file.

daniels
sumber
1
Ini bermanfaat. Saya telah memodifikasi pertanyaan untuk bertanya bagaimana melakukan ini tanpa menggunakan penyihir
Freddo411
9

Echo UTF-8 BOM sebelum mengeluarkan data CSV. Ini memperbaiki semua masalah karakter di Windows tetapi tidak berfungsi untuk Mac.

echo "\xEF\xBB\xBF";

Ini berfungsi untuk saya karena saya perlu membuat file yang hanya akan digunakan pada PC Windows.

Johal
sumber
Tidak benar untuk setiap jenis pemisah kolom atau setiap versi Excel. Baca jawaban saya di bawah ini (di bawah untuk saat ini).
Christiaan Westerbeek
7

UTF-8 tidak bekerja untuk saya di kantor 2007 tanpa paket layanan apa pun, dengan atau tanpa BOM (U + ffef atau 0xEF, 0xBB, 0xBF, tidak berfungsi) menginstal sp3 membuat UTF-8 berfungsi ketika 0xEF, 0xBB, 0xBF BOM adalah didahulukan.

UTF-16 bekerja ketika pengkodean dalam python menggunakan "utf-16-le" dengan 0xff 0xef BOM yang diawali, dan menggunakan tab sebagai pemisah. Saya harus menulis BOM secara manual, dan kemudian menggunakan "utf-16-le" daripada "utf-16", jika tidak masing-masing menyandikan BOM untuk setiap baris yang dituliskan yang muncul sebagai sampah di kolom pertama baris kedua dan sesudahnya.

tidak dapat memastikan apakah UTF-16 akan berfungsi tanpa sp diinstal, karena saya tidak dapat kembali sekarang. mendesah

Ini di windows, tidak tahu tentang kantor untuk MAC.

untuk kedua kasus yang berfungsi, impor berfungsi saat meluncurkan unduhan langsung dari browser dan panduan impor teks tidak mengganggu, berfungsi seperti yang Anda harapkan.

gerald dol
sumber
Bekerja di Excel 2011 untuk Mac juga.
Adam
terima kasih untuk posting Anda, gunakan utf-16le ok bahkan ketika Anda tidak menginstal office 2007 sp3, tetapi BOM harus 0xFF 0xFE
zhaozhi
4

Seperti yang dikatakan Fregal, \ uFEFF adalah caranya.

<%@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
sumber
1
Lihat saja dan lihat bagaimana pemisah tab Anda diabaikan di Excel 2007 saat Anda menggunakan BOM. Anda harus datang dengan sesuatu yang lebih.
Christiaan Westerbeek
3

Saya juga memperhatikan bahwa pertanyaan itu "dijawab" beberapa waktu lalu, tetapi saya tidak mengerti cerita yang mengatakan Anda tidak dapat membuka file csv yang dikodekan utf8 dengan sukses di Excel tanpa menggunakan wizard teks.

Pengalaman saya yang dapat direproduksi: Ketik Old MacDonald had a farm,ÈÌÉÍØke Notepad, tekan Enter, lalu Save As (menggunakan opsi UTF-8).

Menggunakan Python untuk menunjukkan apa yang sebenarnya ada di sana:

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

Baik. Notepad telah menempatkan BOM di bagian depan.

Sekarang masuk ke Windows Explorer, klik dua kali pada nama file, atau klik kanan dan gunakan "Buka dengan ...", dan muncul Excel (2003) dengan tampilan seperti yang diharapkan.

John Machin
sumber
@Cocowalla: Ya, saya baru saja mencoba ini (lagi; Saya sudah mengujinya sebelum memposting) dan bekerja dengan Excel 2007 (yang saya gunakan sekarang). Apakah Anda melakukan open('oldmac.csv', 'rb').read()untuk memverifikasi input Anda?
John Machin
Saya tidak mencoba dengan Excel 2007 (saya tahu Excel 2007 membaca file UTF-8 dengan BOM), saya mencoba dengan Excel 2003
Cocowalla
@ Codowalla: Yah, itu berhasil untuk saya dengan Excel 2003 ketika saya memilikinya. Apakah Anda yakin memiliki paket layanan terbaru untuk Excel 2003? Apakah Anda memverifikasi input Anda seperti yang saya sarankan?
John Machin
Saya memang memverifikasi bahwa notepad telah terjebak BOM di awal file, tapi saya di Excel 2003 SP2 (SP3 tersedia) - jadi saya kira ini hanya bekerja di SP3
Cocowalla
2

Anda dapat menyimpan file html dengan ekstensi 'xls' dan aksen akan berfungsi (setidaknya 2007).

Contoh: simpan ini (menggunakan Save As utf8 di Notepad) sebagai 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
sumber
opsi menarik. Ini membuka teks dengan benar tetapi karena alasan tertentu semua halaman benar-benar putih. Tanpa garis spreadsheet klasik yang membatasi baris dan kolom (kantor untuk mac)
Sebastian Sastre
Yup, hal yang sama di Office 2007 di Windows. Selalu mengejutkan saya bahwa itu berhasil, jujur. (Catatan, jika Anda menambahkan border="1"ke meja, Anda lakukan mendapatkan garis, tetapi hanya sekitar 4 sel :)
Benjol
1

Ini hanya masalah pengkodean karakter. Sepertinya Anda mengekspor data Anda sebagai UTF-8: é di UTF-8 adalah urutan dua byte 0xC3 0xA9, yang bila ditafsirkan dalam Windows-1252 adalah à ©. Saat Anda mengimpor data ke Excel, pastikan untuk memberi tahu bahwa pengkodean karakter yang Anda gunakan adalah UTF-8.

Adam Rosenfield
sumber
Saya telah mengkonfirmasi bahwa datanya adalah UTF-8. Apa yang saya masukkan ke file agar excel tahu bahwa data saya utf-8 (BOM?)
Freddo411
Saya pikir Anda perlu mengubah penyandian file, excel menggunakan sistem default codepage untuk menangani file csv
albertein
Saya tidak sepenuhnya yakin, karena saya tidak memiliki Excel yang diinstal pada mesin yang saya gunakan saat ini, tetapi dengan OpenOffice, ada kotak dropdown untuk pengkodean karakter ketika Anda mengimpor file CSV. Dari sana, pilih Unicode (UTF-8).
Adam Rosenfield
Excel tidak memiliki dropdown AFAIK
albertein
1

Format CSV diimplementasikan sebagai ASCII, bukan unicode, di Excel, sehingga membingungkan para diakritik. Kami mengalami masalah yang sama yaitu bagaimana saya melacak bahwa standar CSV resmi didefinisikan sebagai berbasis ASCII di Excel.

Jeff Yates
sumber
Sebenarnya, CSV tidak terikat pada pengkodean tertentu. Itu Excel yang mengasumsikan ASCII. en.wikipedia.org/wiki/Comma-separated_values
spoulson
Itu yang aku katakan. "diimplementasikan sebagai ASCII di Excel", "CSV didefinisikan sebagai berbasis ASCII di Excel". Tidak yakin poin apa yang Anda sampaikan karena Anda tampaknya setuju dengan saya.
Jeff Yates
2
Sebenarnya Anda mengatakan "Format CSV diimplementasikan sebagai ASCI", saya pikir di situlah kebingungan berasal.
RichardOD
1

Excel 2007 membaca dengan benar UTF-8 dengan BOM (EF BB BF) yang dikodekan csv.

Excel 2003 (dan mungkin sebelumnya) membaca UTF-16LE dengan BOM (FF FE), tetapi dengan TAB bukan koma atau titik koma.

pengguna203319
sumber
1

Saya hanya bisa mendapatkan CSV untuk mem-parse dengan benar di Excel 2007 sebagai UTF-16 little-endian yang dipisahkan-tab dimulai dengan tanda urutan byte yang tepat.

Manfred Stienstra
sumber
1

Menulis BOM ke file CSV keluaran benar-benar bekerja untuk saya di 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

Untuk info lebih lanjut http://crashcoursing.blogspot.com/2011/05/exporting-csv-with-special-characters.html Terima kasih kawan!

Lukas Batteau
sumber
Ya, ini berhasil bagi saya dengan Excel 2010. Dalam penggunaan Java printWriter.print('\ufeff'), lihat juga Cara menambahkan BOM UTF-8 di java .
tsauerwein
1

Solusi lain yang saya temukan hanyalah mengkodekan hasilnya sebagai Windows Code Page 1252 (Windows-1252 atau CP1252). Ini akan dilakukan, misalnya dengan mengatur secara Content-Typetepat untuk sesuatu seperti text/csv; charset=Windows-1252dan mengatur pengkodean karakter dari aliran respons yang sama.

menyeramkan
sumber
Terima kasih untuk yang satu ini. Bekerja pada excel windows dan mac. Saya menggunakannya.
Sebastian Sastre
Ini hanya akan berfungsi jika rentang karakter non-ascii Anda sepenuhnya berada dalam Windows-1252. Jadi misalnya, tidak ada bahasa Korea / Cina / Jepang, tidak ada cyrillic, dll. Tapi saya kira Anda akan mampir dengan ini untuk sebagian besar bahasa Eropa barat.
Tom McClure
1

Perhatikan bahwa memasukkan BOM UTF-8 tidak selalu merupakan ide yang baik - versi Mac dari Excel mengabaikannya dan benar-benar akan menampilkan BOM sebagai ASCII ... tiga karakter jahat di awal bidang pertama di spreadsheet Anda ...

Ned Martin
sumber
Saya tahu komentar ini 6 tahun kemudian, tetapi FWIW: Menggunakan JavaScript untuk mengunduh file seperti '\uFEFF' + myCsvStringkarya seperti yang diharapkan pada Mac Excel 15.19.1 (2016).
bobjones
0

Periksa penyandian di mana Anda membuat file, untuk membuat excel menampilkan file dengan benar, Anda harus menggunakan codepage default sistem.

Bahasa Wich yang Anda gunakan? jika .Net, Anda hanya perlu menggunakan Encoding.Default saat membuat file.

albertein
sumber
Data ekspor adalah utf-8. Saya menulis file ekspor dengan php 5
Freddo411
Transcode data ke Windows-1252 codepage, saya tidak yakin bagaimana melakukannya dengan php
albertein
0

Jika Anda memiliki kode lawas di vb.net seperti yang saya miliki, kode berikut ini berfungsi untuk saya:

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

Saya telah menemukan cara untuk menyelesaikan masalah. Ini adalah hack jahat tetapi berfungsi: buka doc dengan Open Office , lalu simpan ke dalam format excel; yang dihasilkan .xlsatau .xlsxakan menampilkan karakter yang ditekankan.

Fred Reillier
sumber
1
OP mengatakan dia mengekspor secara terprogram, jadi dia tidak mencari solusi yang memerlukan intervensi manual.
Christiaan Westerbeek
0

Dengan Ruby 1.8.7 saya menyandikan setiap bidang ke UTF-16 dan membuang BOM (mungkin).

Kode berikut diekstrak dari active_scaffold_export:

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

Garis yang penting adalah:

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

buka file csv dengan notepad ++ clic pada Encode, pilih convert to UTF-8 (not convert to UTF-8 (tanpa BOM)) Simpan open by double clic dengan excel Harapan yang membantu Christophe GRISON

Christophe GRISON
sumber
1
Ini tidak menjawab pertanyaan sebagaimana seharusnya dilakukan secara terprogram dan tidak memerlukan intervensi pengguna untuk secara manual menyimpan kembali setiap file
Joe W