Hangi kodlama CSV dosyalarını hem Mac hem de Windows'ta Excel ile doğru bir şekilde açar?


137

Yabancı karakterler içeren CSV dosyalarını UTF-8 içeren, BOM içermeyen bir web uygulamamız var. Hem Windows hem de Mac kullanıcıları Excel'de çöp karakterler alır. BOM ile UTF-8'e dönüştürmeyi denedim; Excel / Win iyi, Excel / Mac anlamsızlık gösteriyor. Excel 2003 / Win, Excel 2011 / Mac kullanıyorum. İşte denedim tüm kodlamalar:

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

En iyisi BOM ile UTF-16LE'dir, ancak CSV böyle tanınmaz. Alan ayırıcı virgüldür, ancak noktalı virgül bazı şeyleri değiştirmez.

Her iki dünyada da çalışan herhangi bir kodlama var mı?


1
Tüm alan verileri için UTF-16LE kullanır ancak virgül için 8bit / ASCII karakterini kullanırsanız ne olur? Bu makaleye ( creativyst.com/Doc/Articles/CSV/CSV01.htm#CSVAndEncodings ) dayanarak Excel, Unicode virgülünü ayırıcı yerine alan verilerinin bir parçası olarak yorumluyor olabilir.
jveazey

1
İlginç ipucu @jveazey. Bunu deneyeceğim: mb_convert_encoding($str, "UTF-16LE");ihracat kodumda ve sonuçları buraya gönderin.
Timm

Bu size yardımcı değil, ancak Windows'ta Excel 2007 SP2'yi test ettim (test dosyalarını oluşturmak için Not Defteri2'yi kullanarak). UTF-16LE BOM (Windows'takiyle aynı sonuç) ve UTF-16BE BOM (alanları doğru ayrıştırdı ancak BOM A1'de ilk 2 karakter olarak dahil edildi) dışında her şey çalıştı.
jveazey


@hveazey, alıntı soru Creechy tarafından Windows-1252 kod sayfası tavsiye bir cevabı var. Bu benim durumum için işe yaramadı (Alman umlautları ve keskin s).
Timm

Yanıtlar:


61

Excel Kodlamaları

WINDOWS-1252Kodlama Excel ile uğraşırken en az sinir bozucu bulundu . Temel olarak Microsofts kendi özel karakter setine sahip olduğundan, MS-Excel'in hem Mac hem de Windows sürümünde çalışacağını varsayabiliriz. Her iki sürüm de en azından verileri doğru okuyan karşılık gelen bir "Dosya kaynağı" veya "Dosya kodlaması" seçicisini içerir.

Sisteminize ve kullandığınız araçlar bağlı olarak, bu kodlama da adlandırılabilir CP1252, ANSI, Windows (ANSI), MS-ANSIya da sadece Windows, diğer varyasyonları arasında.

Bu kodlama ISO-8859-1(aka LATIN1ve diğerleri) ' nin bir üst kümesidir , bu nedenle herhangi bir nedenle ISO-8859-1kullanamıyorsanız geri dönebilirsiniz WINDOWS-1252. Burada gösterildiği gibi ISO-8859-1bazı karakterlerin eksik olduğunu unutmayın WINDOWS-1252:

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

Euro işaretinin eksik olduğunu unutmayın . Bu tablo Alan Wood'da bulunabilir .

Dönüştürmek

Dönüştürme her araç ve dilde farklı şekilde yapılır. Ancak, kodlandığını query_result.csvbildiğiniz bir dosyanız olduğunu varsayalım UTF-8. Şunu WINDOWS-1252kullanarak dönüştürün iconv:

iconv -f UTF-8 -t WINDOWS-1252 query_result.csv > query_result-win.csv

6
Biraz faff, ancak bu, Avrupa karakterleri olan .csv dosyalarını Mac OSX'te Excel'e içe aktarmanın cevabı gibi görünüyor
Fergie

1
Doğru. Bunun yerine OP'nin sorusunu yanıtlıyor. Sizin durumunuzda ".csv dosyanızda avrupa karakterleri" kullanılan kodlamayı bilmeniz (veya tahmin etmeniz) gerekir. Ardından WINDOS-1252, Mac ve Windows Excel tarafından büyük olasılıkla doğru bir şekilde yorumlanacak şekilde dönüştürebilirsiniz .
mikezter

1
Bu gerçek bir çözüm değil, er ya da geç WINDOWS-1252'ye dönüştürülemeyen bir karakterle karşılaşacaksınız.
Walter Tross

2
Çince karakter varsa WINDOWS-1252 başarısız olur. Bu yüzden BOM ile UTF-16LE tek seçenek gibi görünüyor.
XWang

Bu, aksanlarla SQL veri aktarımı için iyi çalışır.
motorbaby

26

BOM'li UTF-16LE için, virgül yerine ayırıcı olarak sekme karakterleri kullanırsanız, Excel alanları tanır. Çalışmasının nedeni, Excel'in aslında Unicode * .txt ayrıştırıcısını kullanmasıdır.

Uyarı : Dosya Excel'de düzenlenir ve kaydedilirse, sekmeyle ayrılmış ASCII olarak kaydedilir. Sorun şu ki, Excel dosyasını yeniden açtığınızda gerçek CSV (virgüllerle) olduğunu varsayar, Unicode olmadığını görür, bu yüzden virgülle ayrılmış olarak ayrıştırır ve dolayısıyla bir karma yapar!

Güncelleme : Yukarıdaki uyarı en azından bugün Excel 2010'da (Windows) benim için görünmüyor, ancak aşağıdaki durumlarda davranışları kaydetme konusunda bir fark var gibi görünüyor:

  • Excel'i düzenleyip çıkıyorsunuz ('Unicode * .txt' olarak kaydetmeye çalışıyor)

nazaran:

  • yalnızca dosyayı düzenleme ve kapatma (beklendiği gibi çalışır).

1
Güzel, ama uyarı benim için çözümü kırar; son kullanıcılar bozuk Excel sayfalarından memnun olmayacaklardır.
Timm

Muhtemelen ilk dosya uzantısını * .txt olarak değiştirirseniz çalışır, ancak daha sonra dosya türü ve Excel arasındaki ilişkiyi kaybedersiniz: yani dosyayı çift tıklatamaz ve Excel'de otomatik olarak açamazlar.
Duncan Smart

Bu benim için işe yaramayacak. Bilgisayar meraklısı değil, son kullanıcının herhangi bir engel olmadan Excel'de açması gerekiyor.
Timm

Özel karakterler ve ayrılmış alanlarla iyi görünen ".csv" Excel sayfalarım var. Çıktı dizgimi bir bayt sırası işareti (BOM) olarak "\ ufeff" ile başladıktan sonra alan ayırma için virgül yerine "\ t" sekmelerini kullanarak ve dosyayı "utf-16LE" ile kodluyorum. Bu sayfa sayesinde bir cazibe gibi çalışıyor!
Geek Stocks

İlk satır sep=,ve UTF16LE kodlaması benim için çalıştı ve farklı bir ayırıcı karakter gerektirmedi (virgül olarak kaldı). Dosyayı çift tıklatarak açmak, dosyayı düzgün bir şekilde yükledi, hücrelerdeki özel karakterler ve satır kesmeleri bozulmamış. Dezavantajı: sep=,Başlık, gördüğüm kadarıyla Excel dışında hiçbir program tarafından tanınmıyor. Ancak OpenOffice / LibreOffice bu hack'i yine de gerektirmez (hücre içeriğindeki satır sonları gayet iyi çalışır, ancak metin dosyasından yükleme / metni Excel'deki sütun asistanına kullanma hücrelerdeki satır sonlarını düzgün işlemez).
CodeManX

24

Aşağı iniş: Çözüm yok. Excel 2011 / Mac, hangi kodlama veya kasnak atlamasından bağımsız olarak, umlaut ve aksan işaretleri içeren bir CSV dosyasını doğru şekilde yorumlayamaz. Birinin bana farklı söylediğini duymaktan memnun olurum!


4
WIN-1252 veya ISO-8859-1 kodlamalarının çalıştığını buldum. Lütfen cevabımı gör.
mikezter

3
Çözüm UTF-16LE kullanmak ve sekmeleri virgül yerine sütunları ayırmak için kullandığınızdan emin olmaktır.
Tim Groeneveld

Bunu Win ve Mac Tim'te gerçekten denediniz mi? Bahsettiğim gibi TSV benim durumumda bir seçenek değil.
Timm

1
Benim için, hem Mac'te hem de Excel'in Windows sürümlerinde WIN-1252 kodlaması kullanırsam dışa aktarma iyi çalışır. @ Zaman, kabul edilen cevabı değiştirmeyi düşünmelisin.
Pierre Arnaud

2
Bu çalışmayı bulanlar için, veri kümelerinizde genişletilmiş (çince gibi) karakterler var mıydı? WIN-1252 kodlaması, aralığın dışında oldukları için bunlara zarar verir.
Bill Leeper

11

Yalnızca virgülle ayrılmış ve noktalı virgülle ayrılmış CSV'yi denediniz. Sekmeyle ayrılmış CSV'yi (TSV olarak da bilinir) denediyseniz, cevabı bulursunuz:

UTF-16LE ile BOM (bayt sırası işareti), sekme ayrılmış


Ancak : Bir yorumda TSV'nin sizin için bir seçenek olmadığını belirtiyorsunuz (yine de sorunuzda bu gereksinimi bulamadım). Ne yazık. Genellikle TSV dosyalarının manuel olarak düzenlenmesine izin verdiğiniz anlamına gelir, bu muhtemelen iyi bir fikir değildir. TSV dosyalarının görsel kontrolü sorun değildir. Ayrıca, editörler sekmeleri işaretlemek için özel bir karakter görüntüleyecek şekilde ayarlanabilir.

Ve evet, bunu Windows ve Mac'te denedim.


4

Utf8 kodlu CSV'yi Mac için Excel 2011'e içe aktarma konusunda kattığı: Microsoft şunları söylüyor: "Mac için Excel şu anda UTF-8'i desteklemiyor." Mac 2011 ve UTF-8 için Excel

Yay, MS yolu!


4

Mac'te UTF-8 ile CSV dosyalarını okumak için en iyi geçici çözüm, bunları XLSX biçimine dönüştürmektir. Konrad Foerstner tarafından yapılan ve farklı sınırlayıcı karakterler için destek ekleyerek biraz geliştirdiğim bir senaryo buldum.

Komut dosyasını Github https://github.com/brablc/clit/blob/master/csv2xlsx.py adresinden indirin . Çalıştırmak için bir piton modülü yüklemeniz gerekir openpyxl Excel dosyası manipülasyon için: sudo easy_install openpyxl.


3

Benim durumumda bu çalıştı (Mac, Excel 2011, Çek diakritikli Kiril ve Latin karakterleri):

  • Charset UTF-16LE (sadece UTF-16 yeterli değildi)
  • BOM "\ xFF \ xFE"
  • Ayırıcı olarak \ t (sekme)
  • Ayırıcı ve CRLF'leri de kodlamayı unutmayın :-)
  • Mb_convert_encoding yerine iconv kullan

2

Benim durumum için Mac OS için Excel 2011 düşündüğüm gibi Encoding.GetEncoding ("10000") kullanmıyor ve 2 gün ama Microsoft OS ile aynı iso ile boşa. Bunun için en iyi kanıt, Excel 2011'de MAC için özel karakter içeren bir dosya oluşturmak, bunu CSV olarak kaydetmek ve daha sonra MAC metin düzenleyicide açmak ve karakterlerin karıştırılmasıdır.

Benim için bu yaklaşım işe yaradı - yani MAC 2011'de Excel 2011'de csv dışa aktarmanın içinde özel batı avrupa karakterleri var:

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

@ User525081 hangi dili kullanıyorsunuz? PHP'ye çevirebilir misiniz?
Timm

@ Java örneği gibi görünen ama PHP'de dönüşümü yapmak için iconv kullanabilirsiniz - de3.php.net/manual/en/function.iconv.php
Ashish Datta

OK @ user525081, diğer cevaplar ile aynı anlaşma. Bu, Windows kullanıcılarını zor durumda bırakarak Mac kullanıcılarına hitap eder; ve orijinal soruya cevap vermez - her iki platformda da çalışan bir kodlama. Teşekkürler.
Timm

2

Malzeme Listesi olmayan UTF-8 şu anda Excel Mac 2011 14.3.2'de çalışıyor.

UTF-8 + BOM tür işleri, ama BOM anlamsız hale geldi.

UTF-16 dosyayı alır ve sihirbazı tamamlarsanız çalışır, ancak çift tıklarsanız çalışmaz.


2

Aşağıdakiler benim için Mac 2011 için Excel ve Windows Excel 2002'de çalıştı:

  1. Mac'te iconv kullanarak dosyayı UTF-16 Little-Endian + 'ya dönüştürün. * .Txt (.txt uzantısı Excel'i Metin Alma Sihirbazı'nı çalıştırmaya zorlar):

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

  2. Dosyayı Excel'de açın ve Metin Alma Sihirbazı'nda aşağıdakileri seçin:

    • Adım 1: Dosya kökeni : yoksay, ne seçtiğiniz önemli değil
    • 2.Adım: Sınırlayıcılar ve Metin niteleyicisi için uygun değerleri seçin
    • 3.Adım: Gerekiyorsa sütun biçimlerini seçin

PS iconv tarafından oluşturulan UTF-16LE'nin başında BOM bayt FF FE vardır.

PPS Orijinal csv dosyam bir Windows 7 bilgisayarında UTF-8 biçiminde (başlangıçta BOM baytları EF BB BF ile) oluşturuldu ve CRLF satır sonlarını kullandı. Alan sınırlayıcısı ve virgül olarak metin niteleyicisi olarak virgül kullanıldı. ASCII harfleri ve tildes, umlaut vb. İle farklı latin harfleri ve bazı kiril harfleri içeriyordu. Hepsi hem Excel için Win hem de Mac'te düzgün bir şekilde görüntülenir.

PPPS Tam yazılım sürümleri:
* Mac OS X 10.6.8
* Mac için Excel 2011 v.14.1.3
* Windows Server 2003 SP2
* Windows Excel 2002 v.10.2701.2625


Eğer BOM olmadan UTF-8 dosyası varsa, iconv UTF-16LE dönüştürmek olacaktır olmadan BOM (ve ne yazık ki bir ekleme iconv anlatmak için bir yolu yoktur)
Walter Tross

2

Mac işletim sistemimde, Text Wrangler, Excel ile oluşturulan bir CSV dosyasını "Western" kodlamasına sahip olarak tanımladı.

Bazı googling sonra bu küçük komut dosyası yaptım (Windows kullanılabilirliği hakkında emin değilim, belki Cygwin ile ?):

$ 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

Bu benim için OS X 10.14.2 (ve Excel 2011) üzerinde çalışan tek şey
Donald

1

Benim durumumda Preamble'ı dosyaya eklemek sorunumu çözdü:

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

0

csv yerine, bir XLS uzantısı ve "application / excel" mime-tipi ile html çıktısını denemek. Bunun Windows'da çalışacağını biliyorum, ancak MacOS için konuşamıyorum


Teşekkürler @ royce23, ama sadece indirmek için CSV dosyasını öneriyorum. HTTP üzerinden sunamam çünkü işaretlemenin büyüklüğü bir taramaya yanıtı yavaşlatacaktı - dışa aktarılan tablo milyonlarca satır içerebilir ...
Timm

css ile html'niz yalnızca csv'den daha küçük bir fraksiyon olacaktır, örneğin: <r><c>id</c><c>name</c><c>phone</c> </r>
royce3

Anladığımdan emin değilim, ancak CSV'yi sunucuya kaydediyorum ve bir indirme bağlantısı sunuyoruz. Bir HTML yanıtı oluşturmak çok fazla PHP belleğine sahip ...
Timm

Bu işe yarar (UTF-8 karakterleri), ancak hücrelerin içine ( bretiket) gömülü satır sonları varsa , Mac için Excel CSS'yi (Windows ile çalışır) yok sayar mso-data-placement:same-cell;
16:45

0

Bu benim için çalışıyor

  1. Dosyayı BBEdit veya TextWrangler * ile açın.
  2. Dosyayı Unicode (UTF-16 Little-Endian) olarak ayarlayın (Satır Sonları Unix veya Windows olabilir). Kayıt etmek!
  3. Excel'de: Veri> Dış Veri Al> Metin Dosyasını İçe Aktar ...

Şimdi kilit nokta, Dosya Menşei olarak MacIntosh'u seçin (ilk seçenek olmalı).

Bu Excel 2011'i kullanıyor (sürüm 14.4.2)

* Pencerenin altında küçük bir açılır menü var


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.