Microsoft Excel aksanları .csv dosyalarında karıştırıyor mu?


190

Programlı olarak (PHP 5.2 kullanarak) bir .csv test dosyasına veri aktarıyorum.
Örnek veriler: Numéro 1(aksanlı e'ye dikkat edin). Veriler utf-8(baştaki BOM yok).

Bu dosyayı MS Excel'de açtığımda olarak görüntülenir Numéro 1.

Bunu doğru görüntüleyen bir metin düzenleyicide (UltraEdit) açabiliyorum. UE karakterin olduğunu bildirir decimal 233.

MS Excel'in , tercihen alma sihirbazını veya varsayılan olmayan sihirbaz ayarlarını kullanmaya zorlamadan metin verilerini doğru bir şekilde oluşturması için bir .csv dosyasındaki metin verilerini nasıl aktarabilirim?


Benim için çalışmayan "EF BB BF" yi denediğime inandığım için, BOM çözümünüz hakkında daha fazla şey duymak isterim.
James Baker

3
Seçilen çalışma çözeltisi: * bir Malzeme Listesini dahil etmek; utf-8 * şu başlığı kullanın: 'İçerik türü: metin / düz; charset = utf-8 'Bu excel 2003 ve excel 2007'de "çalıştı" - burada çalıştı = bir ithalat sihirbazı olmadan açıldı ve aksanları doğru bir şekilde oluşturdu. Ürün ağacının gerekli olduğunu doğrulamadım.
Freddo411

2
Malzeme Listesi gerekli, şimdi bunu test ettim. Onsuz özel karakter tamamlamıyor.
Alex Ciminian

2
Birisi bir malzeme listesi (bayt sırası işareti) ekleme hakkında daha fazla şey söyleyebilirse çok seviniriz. Response.Write (EF BB BF ") gibi bir şey yaparsam, bu karakterler sadece dosyanın başında
görünür

sydneyos: Fergal'ın dediği gibi; Dizenize \ uFEFF ekleyin.
noocyte

Yanıtlar:


243

Doğru biçimlendirilmiş bir UTF8 dosyası , ilk üç sekizli olarak bir Bayt Sırası İşaretine sahip olabilir . Bunlar, 0xEF, 0xBB, 0xBF onaltılı değerleridir. Bu sekizliler dosyayı UTF8 olarak işaretlemeye yarar (çünkü "bayt sırası" bilgisi ile ilgili değildir). 1 Bu ürün ağacı yoksa, tüketici / okuyucu metnin kodlama türünü çıkarır. UTF8 yeteneğine sahip olmayan okuyucular baytları Windows-1252 gibi başka bir kodlama olarak okuyacak ve karakterleri dosyanın başlangıcında gösterecektir .

Excel'in, UTF8 CSV dosyalarını dosya ilişkilendirmesi yoluyla açtıktan sonra , UTF8 BOM varlığını göz ardı ederek tek baytlık kodlamada olduğunu varsaydığı bilinen bir hata var . Bu olabilir değil herhangi bir sistem varsayılan kod sayfası veya dil ayarı tarafından sabitlenebilir. BOM Excel'de ipucu vermeyecektir - işe yaramaz. (Azınlık raporu, Malzeme Listesinin bazen "Metni İçe Aktar" sihirbazını tetiklediğini iddia eder.) Bu hata Excel 2003 ve önceki sürümlerinde var gibi görünmektedir. Çoğu rapor (buradaki yanıtların ortasında), bunun Excel 2007 ve daha yeni sürümlerde düzeltildiğini söylüyor.

Dikkat edin, eğer can hep * Eğer dosyada Sen açılış kodlamasını belirlemenizi sağlar "Metin Alma" sihirbazını kullanma Excel'de doğru açık UTF8 CSV dosyaları. Tabii ki bu çok daha az uygun.

Bu cevabın okuyucuları büyük olasılıkla Excel <2007'yi özellikle desteklemedikleri, ancak Excel'e ham UTF8 metni gönderiyorlar, bu da yanlış yorumlanıyor ve metninizi Ãve diğer benzer Windows-1252 karakterlerini serpiyor. UTF8 Malzeme Listesini eklemek muhtemelen en iyi ve en hızlı düzeltmedir.

Eski Excel'lerde kullanıcılarla sıkışıp kalırsanız ve CSV'lerinizin tek tüketicisi Excel ise, UTF8 yerine UTF16'yı dışa aktararak bu sorunu çözebilirsiniz. Excel 2000 ve 2003 bunları doğru bir şekilde çift tıklatacaktır. (Diğer bazı metin editörlerinin UTF16 ile ilgili sorunları olabilir, bu nedenle seçeneklerinizi dikkatlice tartmanız gerekebilir.)


* Yapamadığınız durumlar dışında, (en azından) Mac için Excel 2011'in Alma Sihirbazı, ne söylediğinizden bağımsız olarak her zaman tüm kodlamalarla çalışmaz. </anecdotal-evidence> :)


14
Kodlamayı nerede belirleyeceğimi sonsuza dek sürdü. Kaydet İletişim Kutusu> Araçlar Düğmesi> Web Seçenekleri> Kodlama Sekmesi. Bu kadar önemli şeyleri saklamakta kesinlikle iyidirler.
Triynko

6
Yanlış: UTF-8 dosyasına bir Malzeme Listesi eklemek, Excel 2007'de içe aktarma sihirbazı gerektirmeden bu dosyayı doğru şekilde yükler.
Victor Nicollet

3
Victor'un bugün söylediği şeyi bulduk (Excel 2010'u kullanarak elimizde mevcut olan her şey). UTF-8 BOM / Signature (EF BB BF) eklemek, sistem varsayılan kodlamasını kullanarak çift tıklamayı düzeltti ve
UTF8'i

20
Genel olarak , UTF-8 kodlanmış dosya gerekir değil bir bayt sırası işareti de başa sahiptir. UTF-8 değişken bayt sırasına sahip değildir ve oraya yerleştirmek UTF-8'in ASCII uyumluluğunu sabote eder. UTF-8 sahte-BOM'a izin veren veya teşvik eden bazı belirli dosya formatları vardır, ancak aksi takdirde kaçınılmalıdır. CSV tamamen kodlayıcı-cahildir, bu nedenle belirli bir aracın 0xEF 0xBB 0xBF bayt dizisini UTF-8'in bir göstergesi olarak yorumlayıp yorumlamayacağını herkes tahmin eder; birinci hücrede görünmez bir kontrol karakteri; ilk hücredeki karakterler ; ya da tamamen başka bir şey.
bobince

3
@Ian: Hiç kimse bir BOM ile UTF-8 olduğundan emin değil - 0xEF 0xBB 0xBF, çoğu eski kodlamalarda da geçerli bir dizidir (bu nedenle genellikle ISO-8859-1 veya cp1252 olarak yanlış yorumlanır ve olarak görüntülenir ). Yalnızca algoritmaların tahmin edilmesine yardımcı olur ve özellikle buna izin veren dosya biçimleri için (ör. XML). UTF-8 dosyalarına sahte-BOM eklemenin dezavantajı, ASCII uyumluluklarını (UTF-8 için önemli bir satış noktası) kırmanızdır. Birçok kodlama-cahil metin aracı, beklenmedik bir lider sahte BOM ile karşı karşıya kalacaktır.
bobince

39

Malzeme Listesini (\ uFEFF) eklemek benim için çalıştı (Excel 2007), Excel'in dosyayı UTF-8 olarak tanımasıydı. Aksi takdirde, kaydetme ve alma sihirbazını kullanma çalışır, ancak daha az idealdir.


1
Hala metin alma sihirbazını açar, bu yüzden fark sadece çift tıklayabilmenizdir, bu yüzden yine de ideal değil, bilinen tek çözümdür.
haridsv

Benim için Excel 2007'de hiçbir içe aktarma sihirbazı görüntülenmiyor.
Victor Nicollet

Benim için içe aktarma sihirbazı da yok - UTF8 BOM / İmza (EF BB BF) varsa beklendiği gibi çalışır.
Danny Tuppeny

Ayrıca, \ufeffbir UTF-16 (BE) BOM UTF-8 BOM değil
Alastair McCormack

2
Hayır, @AlastairMcCormack, nasıl kodlandığına bağlı olarak, her ikisi de. UTF-8 olarak kodlanan "\ ufeff" tam olarak EF BB BF'dir. (UTF-16 olarak kodlanmış, sadece iki bayt olacaktır.)
Dave Burt

30

Microsoft Excel'i kullanıcıya gönderirken projemde kullandığım PHP kodu aşağıdadır:

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

GÜNCELLENDİ: Dosya adı iyileştirmesi ve HATA doğru uzunluk hesaplamasını düzeltti. Sayesinde trig ve @ ivanhoe011


1
Bu sayfada başka birkaç öneri denedim, ancak bu Excel 2007'de benim için çalıştı. En önemli değişiklikler virgül yerine (.csv dosyası olsa da) sekmeleri kullanmak ve yukarıdaki iki karakteri izleyen echos kullanmaktı. mb_convert_encoding () işlevini çağırın. Ayrıca mb_convert_encoding () için destek almak için --enable-mbstring ile PHP yeniden derlemek zorunda kaldı. Teşekkürler!
Russell G

1
Bu benim için de iyi çalıştı, teşekkürler. Ancak, Safari'de konsolumda bir hata alıyorum 'Kaynak belge olarak yorumlandı ancak şu şekilde aktarıldı ...' sanırım stackoverflow.com/questions/3899426/… , ancak belki de değil veya bir çözüm buldu. Dahası, örneğinizde bir değişiklik öneriyorum: 'Content-Disposition: attachment; filename="'.$filename.'.csv"'çünkü Firefox çift tırnak istiyor, yoksa bir boşluktan sonra dosya adınızı kesecek.
kasimir

Neden CSV ( text/csv) çıktısını veriyorsunuz ama Excel ( application/vnd.ms-excel) olarak adlandırıyorsunuz?
TRiG

2
Harika çalışıyor! Mac'te de çalıştığını doğrulayabilirim (Office 2011'de).
Jonathan

Bu olmamalı header('Content-Length: '. mb_strlen($encoded_csv, 'UTF-16LE'));mı?
Zengin Bradshaw

13

Excel sürümlerinin (2003 + 2007) ve dosya türlerinin tüm birleşimleri için yanıt

Buradaki diğer yanıtların çoğu yalnızca Excel sürümleriyle ilgilidir ve size yardımcı olmayacaktır, çünkü yanıtları Excel sürümünüz için doğru olmayabilir.

Örneğin, Malzeme Listesi karakterinin eklenmesi, otomatik sütun ayırıcı tanıma ile ilgili sorunlar getirir, ancak her Excel sürümünde değil.

Çoğu Excel sürümünde çalışıp çalışmadığını belirleyen 3 değişken vardır:

  • Kodlama
  • Malzeme Listesi karakter varlığı
  • Hücre ayırıcı

SAP'deki stoacı her kombinasyonu denedi ve sonucu bildirdi. Sonuç? Çoğu Excel sürümünde çalışmasını sağlamak için ayırıcı olarak BOM ve sekme karakterli UTF16le kullanın.

Bana inanmıyor musun? Ben de istemem, ama burada okuyun ve ağlayın: http://wiki.sdn.sap.com/wiki/display/ABAP/CSV+tests+of+encoding+and+column+separator


Neden sadece eklemek sep=,veya ne kullanmak istiyorsunuz? Zaten Malzeme Listesini ekliyorsanız, dosyaya bir şeyler eklemekten kaçınmadığınızı varsayarım.
Casey

Aslında, kendi sorumu cevaplamak için, alan ayırıcı bildirimini eklemezsiniz çünkü bu hile çalışmayı durdurur. Temelde bozuk kodlama veya kullanıcılarınız yanlış bölge ayarlarına sahipse dosyanız CSV olarak düzgün yorumlanmıyor.
Casey

1
utf-16le + BOM (0xFF 0xFE) + sekmesi en iyisidir
zhaozhi

10

içe aktarırken UTF-8 sağlamayı seçin. Office 2007 kullanıyorsanız, bunu seçmiş olursunuz: dosyayı açtıktan hemen sonra.


1
Bu kullanışlı. Sihirbazı başvurmadan nasıl yapılacağını sormak için soruyu değiştirdim
Freddo411

9

CSV verisi çıkarmadan önce UTF-8 BOM'u yankılayın. Bu, Windows'daki tüm karakter sorunlarını düzeltir, ancak Mac için çalışmaz.

echo "\xEF\xBB\xBF";

Benim için çalışıyor çünkü sadece Windows PC'lerde kullanılacak bir dosya oluşturmam gerekiyor.


Her sütun ayırıcı türü veya her Excel sürümü için doğru değildir. Aşağıdaki cevabımı okuyun (şimdilik şimdilik).
Christiaan Westerbeek

7

UTF-8, Office 2007'de BOM olan veya olmayan (U + ffef veya 0xEF, 0xBB, 0xBF, ikisi de işe yaramaz) herhangi bir hizmet paketi olmadan benim için çalışmıyor sp3 yüklendiğinde, 0xEF, 0xBB, 0xBF BOM olduğunda UTF-8 çalışır de başa.

UTF-16, bir 0xff 0xef BOM ile "utf-16-le" kullanılarak python ile kodlanırken ve ayırıcı olarak sekme kullanılırken çalışır. BOM el ile yazmak ve daha sonra "utf-16" yerine "utf-16-le" kullanmak zorunda kaldı, aksi takdirde her encode () yazılan her satır için BOM hazırladı ilk sütun üzerinde çöp olarak görünen ikinci satır ve sonrası.

UTF-16'nın herhangi bir sp kurulu olmadan çalışıp çalışmayacağını söyleyemem, çünkü şimdi geri dönemiyorum. iç çekmek

Bu pencerelerde, MAC ofisi hakkında bilmiyorum.

her iki çalışma durumunda da, içe aktarma doğrudan tarayıcıdan bir indirme başlatıldığında çalışır ve metin içe aktarma sihirbazı müdahale etmez, beklediğiniz gibi çalışır.


Mac için Excel 2011'de de çalışır.
Adam

postanız için teşekkür ederiz, ofis 2007 sp3'ü yüklememiş olsanız bile utf-16le kullanın, ancak BOM 0xFF 0xFE olmalıdır
zhaozhi

4

Fregal'in dediği gibi \ uFEFF gidilecek yol.

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

1
Malzeme Listesini kullandığınızda Excel 2007'de sekme ayırıcınızın nasıl yoksayıldığını izleyin ve görün. Daha fazla bir şey bulmalısın.
Christiaan Westerbeek

3

Ayrıca, sorunun bir süre önce "yanıtlandığını" fark ettim ancak utf8 kodlu bir csv dosyasını metin sihirbazını kullanmadan Excel'de başarıyla açamayacağınızı söyleyen hikayeleri anlamıyorum.

Tekrarlanabilir deneyimim: Tür Old MacDonald had a farm,ÈÌÉÍØ Not Defteri'ne yazın, Enter tuşuna basın, ardından Farklı Kaydet (UTF-8 seçeneğini kullanarak).

Orada gerçekten ne olduğunu göstermek için Python kullanma:

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

İyi. Not Defteri öne bir ürün ağacı koydu.

Şimdi Windows Gezgini'ne gidin, dosya adına çift tıklayın veya sağ tıklayın ve "Birlikte aç ..." seçeneğini kullanın ve Excel (2003) ü beklendiği gibi ekrana getirin.


@Cocowalla: Eh, sadece denedim (tekrar; göndermeden önce test ettim) ve Excel 2007 ile çalıştı (şu an kullandığım şey bu). Girişinizi open('oldmac.csv', 'rb').read()doğruladınız mı?
John Machin

Excel 2007 ile denemedim (Excel 2007'nin UTF-8 dosyalarını BOM ile okuduğunu biliyorum), Excel 2003 ile denedim
Cocowalla

@Cocowalla: Excel 2003'te benim için işe yaradı. Excel 2003 için en son hizmet paketine sahip olduğunuzdan emin misiniz? Önerdiğim gibi girdiğinizi doğruladınız mı?
John Machin

Not defteri dosyanın başında bir malzeme listesi sıkışmış olduğunu doğruladım, ancak Excel 2003 SP2'de (SP3 kullanılabilir) - bu yüzden sadece SP3'te çalışıyor
Cocowalla

2

'Xls' uzantılı bir html dosyasını kaydedebilirsiniz ve aksanlar işe yarayacaktır (en azından 2007 öncesi).

Örnek: bunu test.xls olarak kaydedin (Not Defteri'nde Farklı Kaydet utf8 kullanarak):

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

ilginç bir seçenek. Metni doğru açar, ancak bir nedenle tüm sayfa tamamen beyazdır. Satırları ve sütunları sınırlayan klasik elektronik tablo satırları olmadan (mac için ofis)
Sebastian Sastre

Evet, Windows'ta Office 2007'de de aynı şey geçerli. Dürüst olmak gerekirse, her zaman işe yaraması beni şaşırttı. Eklerseniz (Not, border="1"tabloya, sen yapmak çizgiler olsun, ama sadece yaklaşık 4 hücreleri :)
Benjol

1

Bu sadece bir karakter kodlaması meselesidir. Görünüşe göre verilerinizi UTF-8 olarak dışa aktarıyorsunuz: UTF-8'deki é, Windows-1252'de yorumlandığında à © olan iki baytlık 0xC3 0xA9 dizisidir. Verilerinizi Excel'e aktardığınızda, kullandığınız karakter kodlamasının UTF-8 olduğunu söylediğinizden emin olun.


Verilerin UTF-8 olduğunu doğruladım. Excel'e verilerimin utf-8 (BOM) olduğunu bildirmek için dosyaya ne koyabilirim
Freddo411

Dosya kodlamasını değiştirmeniz gerektiğini düşünüyorum, excel csv dosyalarını işlemek için sistem varsayılan kod sayfasını kullanır
albertein

Şu anda kullandığım makinede Excel yüklü olmadığından tamamen emin değilim, ancak OpenOffice ile, bir CSV dosyasını içe aktardığınızda karakter kodlaması için bir açılır kutu var. Oradan Unicode'u (UTF-8) seçin.
Adam Rosenfield

Excel'de AFAIK açılır listesi yok
albertein

1

CSV formatı Excel'de unicode değil ASCII olarak uygulanır, böylece aksan işaretleri yönetir. Resmi CSV standardının Excel'de ASCII tabanlı olarak tanımlandığını da bu şekilde yaşadık.


Aslında, CSV belirli bir kodlamaya bağlı değildir. ASCII olduğunu varsayan Excel. en.wikipedia.org/wiki/Comma-separated_values
spoulson

Benim söylediğim de bu. "Excel'de ASCII olarak uygulandı", "CSV, Excel'de ASCII tabanlı olarak tanımlandı". Bana katılıyor gibi göründüğünden emin değilim.
Jeff Yates

2
Aslında "CSV formatı ASCI olarak uygulandı" diyorsunuz, sanırım karışıklık buradan kaynaklanıyor.
RichardOD

1

Excel 2007, UTF-8'i BOM (EF BB BF) kodlu csv ile düzgün bir şekilde okur.

Excel 2003 (ve belki de daha önce) BOM (FF FE) ile UTF-16LE'yi, ancak virgül veya noktalı virgül yerine SEKMELER'i okur.


1

CSV'yi Excel 2007'de yalnızca uygun bayt sırası işaretiyle başlayarak sekmeyle ayrılmış küçük endian UTF-16 olarak düzgün bir şekilde ayrıştırabilirim.


1

Çıkış CSV dosyasına bir malzeme listesi yazmak benim için Django'da gerçekten işe yaradı:

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

Daha fazla bilgi için http://crashcoursing.blogspot.com/2011/05/exporting-csv-with-special-characters.html Teşekkürler çocuklar!


Evet, bu benim için Excel 2010 ile çalıştı. Java kullanımında printWriter.print('\ufeff')ayrıca bkz . Java'da UTF-8 Malzeme Listesi nasıl eklenir .
tsauerwein

1

Bulduğum başka bir çözüm, sonucu sadece Windows Kodu (Windows-1252 veya CP1252) olarak kodlamaktı. Bu, örneğin, Content-Typebenzer bir şeye uygun şekilde text/csv; charset=Windows-1252ayarlanarak ve yanıt akışının karakter kodlamasını benzer şekilde ayarlayarak yapılır.


Bunun için teşekkürler. Excel Windows ve Mac üzerinde çalışır. Onu kullanıyorum.
Sebastian Sastre

Bu, yalnızca ascii olmayan karakter aralığınız tamamen Windows-1252'ye girerse işe yarar. Yani, örneğin, Korece / Çince / Japonca, Kiril yok, vb. Ama sanırım çoğu Batı Avrupa dili için bununla kayarsınız.
Tom McClure

1

UTF-8 ürün ağacının dahil edilmesi iyi bir fikir değildir - Excel'in Mac sürümleri bunu görmezden gelir ve aslında ürün ağacını ASCII olarak görüntüler… e-tablonuzdaki ilk alanın başında üç kötü karakter…


Bu yorumun 6 yıl sonra olduğunu biliyorum, ancak FWIW: '\uFEFF' + myCsvStringMac Excel 15.19.1 (2016) 'da beklendiği gibi çalışır gibi bir dosyayı indirmek için JavaScript kullanma .
bobjones

0

Dosyayı oluşturduğunuz kodlamayı kontrol edin, excel'in dosyayı doğru görüntülemesini sağlamak için sistem varsayılan kod sayfasını kullanmanız gerekir.

Hangi dili kullanıyorsunuz? .Net ise, dosyayı oluştururken yalnızca Encoding.Default'u kullanmanız gerekir.


Dışa aktarma verileri utf-8'dir. Ben php 5 ile ihracat dosyası yazıyorum
Freddo411

Verileri Windows-1252 kod sayfasına dönüştürün, php ile nasıl başarılacağından emin değilim
albertein

0

Benim gibi vb.net eski kodu varsa, aşağıdaki kod benim için çalıştı:

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

0

Sorunu çözmenin bir yolunu buldum. Bu kötü bir kesmek ama işe yarıyor: dokümanı Open Office ile açın , sonra herhangi bir excel formatına kaydedin; ortaya çıkan .xlsveya .xlsxaksanlı karakterleri gösterecektir.


1
OP programlı olarak ihracat yaptığını söylüyor, bu yüzden manuel müdahale gerektiren bir çözüm aramıyor.
Christiaan Westerbeek

0

Ruby 1.8.7 ile her alanı UTF-16'ya kodluyorum ve BOM'yi (belki) atıyorum.

Aşağıdaki kod active_scaffold_export'tan alınmıştır:

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

Önemli çizgi:

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

-2

Kodlamada notepad ++ clic ile csv dosyasını açın, UTF-8'e dönüştür'ü seçin (UTF-8'e dönüştürmeyin (BOM'suz)) Excel ile çift clic ile açık kaydedin Christophe GRISON'a yardım edin


1
Bu, programlı olarak yapılması gerektiği ve her dosyayı manuel olarak yeniden kaydetmek için kullanıcı müdahalesini gerektirmediği için bu soruya cevap vermez
Joe W
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.