Mã hóa nào mở tệp CSV chính xác với Excel trên cả Mac và Windows?


137

Chúng tôi có một ứng dụng web xuất các tệp CSV chứa các ký tự nước ngoài có UTF-8, không có BOM. Cả người dùng Windows và Mac đều nhận được các ký tự rác trong Excel. Tôi đã thử chuyển đổi sang UTF-8 bằng BOM; Excel / Win vẫn ổn với nó, Excel / Mac cho thấy sự vô nghĩa. Tôi đang sử dụng Excel 2003 / Win, Excel 2011 / Mac. Đây là tất cả các mã hóa tôi đã thử:

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

Cái tốt nhất là UTF-16LE với BOM, nhưng CSV không được công nhận như vậy. Dấu phân cách trường là dấu phẩy, nhưng dấu chấm phẩy không thay đổi mọi thứ.

Có bất kỳ mã hóa nào hoạt động trong cả hai thế giới?


1
Điều gì xảy ra nếu bạn sử dụng UTF-16LE cho tất cả dữ liệu trường nhưng sử dụng ký tự 8bit / ASCII cho dấu phẩy? Dựa trên bài viết này ( creativyst.com/Doc/Articles/CSV/CSV01.htm#CSVAndEncodings ), Excel có thể diễn giải dấu phẩy Unicode như một phần của dữ liệu trường thay vì dấu phân cách.
jveazey

1
Mẹo thú vị @jveazey. Tôi sẽ thử điều này: mb_convert_encoding($str, "UTF-16LE");trong mã xuất của tôi và đăng kết quả ở đây.
Timm

Không phải điều này giúp bạn, nhưng tôi đã thử nghiệm Excel 2007 SP2 trên Windows (sử dụng Notepad2 để tạo các tệp thử nghiệm). Mọi thứ đều hoạt động ngoại trừ BOM UTF-16LE (kết quả tương tự như của bạn trên Windows) và UTF-16BE BOM (phân tích các trường chính xác nhưng BOM được đưa vào làm 2 ký tự đầu tiên trong A1).
jveazey


@hveazey, câu hỏi được trích dẫn có câu trả lời bởi creechy khuyến nghị codepage Windows-1252. Điều đó đã không làm việc cho trường hợp của tôi (tiếng Đức và sắc nét).
Timm

Câu trả lời:


61

Bảng mã Excel

Tôi thấy WINDOWS-1252mã hóa là ít gây khó chịu nhất khi giao dịch với Excel. Vì về cơ bản bộ ký tự độc quyền của microsofts, người ta có thể cho rằng nó sẽ hoạt động trên cả Mac và phiên bản Windows của MS-Excel. Cả hai phiên bản ít nhất bao gồm một bộ chọn "Nguồn gốc tệp" hoặc "Mã hóa tệp" tương ứng để đọc chính xác dữ liệu.

Tùy thuộc vào hệ thống của bạn và các công cụ bạn sử dụng, mã hóa này cũng có thể được đặt tên CP1252, ANSI, Windows (ANSI), MS-ANSIhay chỉ là Windows, trong số các biến thể khác.

Mã hóa này là siêu ký tự của ISO-8859-1(aka LATIN1và những người khác), vì vậy bạn có thể dự phòng ISO-8859-1nếu bạn không thể sử dụng WINDOWS-1252vì một số lý do. Xin lưu ý rằng ISO-8859-1thiếu một số ký tự WINDOWS-1252như được hiển thị ở đây:

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

Lưu ý rằng dấu hiệu đồng euro bị thiếu . Bảng này có thể được tìm thấy tại Alan Wood .

Chuyển đổi

Chuyển đổi được thực hiện khác nhau trong mọi công cụ và ngôn ngữ. Tuy nhiên, giả sử bạn có một tệp query_result.csvmà bạn biết được UTF-8mã hóa. Chuyển đổi nó sang WINDOWS-1252sử dụng iconv:

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

6
Một chút khó khăn, nhưng đây dường như là câu trả lời cho việc nhập tệp .csv có ký tự châu Âu vào Excel trên Mac OSX
Fergie

1
Thật. Nó trả lời câu hỏi của OP thay vào đó. Trong trường hợp của bạn, trước tiên bạn sẽ phải biết (hoặc đoán) mã hóa được sử dụng trong ".csv tệp có ký tự châu Âu". Sau đó, bạn có thể chuyển đổi nó thành WINDOS-1252, rất có thể sẽ được giải thích chính xác bởi cả Mac và Windows Excel.
mikezter

1
Đây không phải là giải pháp thực sự, sớm hay muộn bạn sẽ bắt gặp một nhân vật không thể chuyển đổi thành WINDOWS-1252.
Walter Tross

2
WINDOWS-1252 sẽ thất bại nếu có ký tự Trung Quốc. Vì vậy, có vẻ như UTF-16LE với BOM là lựa chọn duy nhất.
XWang

Điều này hoạt động tốt cho xuất dữ liệu SQL với dấu phụ.
xe máy

26

Đối với UTF-16LE với BOM nếu bạn sử dụng các ký tự tab làm dấu phân cách thay vì dấu phẩy, Excel sẽ nhận ra các trường. Lý do nó hoạt động là Excel thực sự kết thúc bằng trình phân tích cú pháp Unicode * .txt của nó.

Hãy cẩn thận : Nếu tệp được chỉnh sửa trong Excel và được lưu, nó sẽ được lưu dưới dạng ASCII được phân định bằng tab. Vấn đề bây giờ là khi bạn mở lại tệp Excel giả sử đó là CSV thật (có dấu phẩy), thấy rằng đó không phải là Unicode, do đó phân tích cú pháp dưới dạng dấu phẩy - và do đó sẽ tạo ra một hàm băm của nó!

Cập nhật : Sự cảnh báo ở trên dường như không xảy ra với tôi hôm nay trong Excel 2010 (Windows), mặc dù dường như có một sự khác biệt trong hành vi lưu nếu:

  • bạn chỉnh sửa và thoát Excel (cố gắng lưu dưới dạng 'Unicode * .txt')

so với:

  • chỉnh sửa và đóng tệp chỉ (hoạt động như mong đợi).

1
Đẹp, nhưng hãy cẩn thận phá vỡ giải pháp cho tôi; người dùng cuối sẽ không hài lòng với các bảng Excel bị hỏng.
Timm

Có thể nếu bạn thay đổi phần mở rộng tệp ban đầu thành * .txt thì nó sẽ hoạt động, nhưng sau đó bạn mất liên kết giữa filetype và Excel: tức là họ không thể bấm đúp vào tệp và tự động mở trong Excel.
Duncan Smart

Điều đó sẽ không làm việc cho tôi. Không am hiểu về máy tính, người dùng cuối cần mở nó trong Excel mà không gặp bất kỳ trở ngại nào.
Timm

Tôi có các bảng Excel ".csv" của mình trông đẹp với các ký tự đặc biệt và các trường riêng biệt. Tôi bắt đầu chuỗi đầu ra của mình với "\ ufeff" dưới dạng dấu thứ tự byte (BOM), sau đó sử dụng các tab "\ t" thay cho dấu phẩy để phân tách trường và mã hóa tệp bằng "utf-16LE". Hoạt động như một sự quyến rũ, nhờ vào trang này!
Cổ phiếu Geek

Dòng đầu tiên sep=,và mã hóa UTF16LE hoạt động với tôi và không yêu cầu một ký tự phân tách khác (nó vẫn là dấu phẩy). Mở tệp bằng cách bấm đúp đã tải tệp chính xác, với các ký tự đặc biệt và ngắt dòng trong các ô còn nguyên. Nhược điểm: sep=,tiêu đề không được nhận ra bởi bất kỳ chương trình nào ngoại trừ Excel như tôi đã thấy. Tuy nhiên, OpenOffice / LibreScript không yêu cầu hack này (ngắt dòng trong nội dung ô chỉ hoạt động tốt, trong khi tải từ tệp văn bản / sử dụng văn bản vào trợ lý cột trong Excel không xử lý chính xác ngắt dòng trong các ô).
CodeManX

24

Sự hạ thấp là: Không có giải pháp. Excel 2011 / Mac không thể diễn giải chính xác một tệp CSV có chứa ô và dấu phụ, bất kể bạn mã hóa hay nhảy vòng nào. Tôi rất vui khi nghe ai đó nói với tôi khác nhau!


4
Tôi thấy các bảng mã WIN-1252 hoặc ISO-8859-1 đang hoạt động. Xin vui lòng xem câu trả lời của tôi.
mikezter

3
Giải pháp là sử dụng UTF-16LE và đảm bảo rằng việc bạn sử dụng các tab để phân tách các cột thay vì dấu phẩy.
Tim Groeneveld

Bạn đã thực sự thử điều này trên Win và Mac Tim chưa? Như tôi đã đề cập, TSV không phải là một lựa chọn trong trường hợp của tôi.
Timm

1
Đối với tôi, xuất hoạt động tốt nếu tôi sử dụng mã hóa WIN-1252, cả trên Mac và trên các phiên bản Windows của Excel. @Timm, bạn nên xem xét thay đổi câu trả lời được chấp nhận.
Pierre Arnaud

2
Đối với những người thấy điều này hoạt động, bạn có thực sự có các ký tự mở rộng (như tiếng Trung Quốc) trong bộ dữ liệu của mình không? Mã hóa WIN-1252 phá vỡ những thứ đó vì chúng nằm ngoài phạm vi.
Bill Leeper

11

Bạn chỉ đã thử CSV được phân tách bằng dấu phẩy và dấu chấm phẩy. Nếu bạn đã thử CSV được phân tách bằng tab (còn được gọi là TSV), bạn sẽ tìm thấy câu trả lời:

UTF-16LE với BOM (dấu thứ tự byte), được phân tách bằng tab


Nhưng : Trong một bình luận bạn đề cập rằng TSV không phải là một lựa chọn cho bạn (tôi chưa thể tìm thấy yêu cầu này trong câu hỏi của bạn). Đó là một điều đáng tiếc. Điều này thường có nghĩa là bạn cho phép chỉnh sửa thủ công các tệp TSV, điều này có thể không phải là một ý tưởng tốt. Kiểm tra trực quan các tập tin TSV không phải là một vấn đề. Hơn nữa, các biên tập viên có thể được thiết lập để hiển thị một ký tự đặc biệt để đánh dấu các tab.

Và vâng, tôi đã thử điều này trên Windows và Mac.


4

Đây là mấu chốt trong việc nhập CSV được mã hóa utf8 vào Excel 2011 cho Mac: Microsoft nói: "Excel cho Mac hiện không hỗ trợ UTF-8." Excel cho Mac 2011 và UTF-8

Yay, cách để đi MS!


4

Cách giải quyết tốt nhất để đọc các tệp CSV có UTF-8 trên Mac là chuyển đổi chúng thành định dạng XLSX. Tôi đã tìm thấy một kịch bản được tạo bởi Konrad Foerstner, tôi đã cải thiện chút ít bằng cách thêm hỗ trợ cho các ký tự phân cách khác nhau.

Tải xuống tập lệnh từ Github https://github.com/brablc/clit/blob/master/csv2xlsx.py . Để chạy nó, bạn sẽ cần cài đặt một mô-đun python openpyxl để thao tác tệp Excel : sudo easy_install openpyxl.


3

Trong trường hợp của tôi, điều này đã làm việc (Mac, Excel 2011, cả hai ký tự Cyrillic và Latin với các dấu phụ tiếng Séc):

  • Bộ ký tự UTF-16LE (đơn giản là UTF-16 là không đủ)
  • BOM "\ xFF \ xFE"
  • \ t (tab) làm dấu phân cách
  • Đừng quên mã hóa dấu phân cách và CRLF :-)
  • Sử dụng iconv thay vì mb_convert_encoding

2

Có vẻ như trường hợp của tôi, Excel 2011 cho Mac OS không sử dụng Encoding.GetEncoding ("10000") như tôi nghĩ và đã lãng phí 2 ngày với nhưng iso giống như trên Microsoft OS. Bằng chứng tốt nhất cho việc này là tạo một tệp trong Excel 2011 cho MAC bằng các ký tự đặc biệt, lưu nó dưới dạng CSV và sau đó mở nó trong trình soạn thảo văn bản MAC và các ký tự được xáo trộn.

Đối với tôi cách tiếp cận này có hiệu quả - có nghĩa là xuất csv trên Excel 2011 trên hệ điều hành MAC có các ký tự đặc biệt của người Tây Âu bên trong:

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

Bạn đang sử dụng ngôn ngữ nào @ user525081? Bạn có thể dịch nó sang PHP không?
Timm

@Timm trông giống như một mẫu Java nhưng trong PHP bạn có thể sử dụng iconv để thực hiện chuyển đổi - de3.php.net/manual/en/feft.iconv.php
Ashish Datta

OK @ user525081, tương tự như các câu trả lời khác. Điều này phục vụ cho người dùng Mac, khiến người dùng Windows rơi vào tình trạng trì trệ; và nó không trả lời câu hỏi ban đầu - một mã hóa hoạt động trên cả hai nền tảng. Cảm ơn.
Timm

2

UTF-8 không có BOM hiện hoạt động với tôi trong Excel Mac 2011 14.3.2.

UTF-8 + BOM loại công việc, nhưng BOM hiển thị là vô nghĩa.

UTF-16 hoạt động nếu bạn Nhập tệp và hoàn thành trình hướng dẫn, nhưng không phải nếu bạn chỉ bấm đúp vào tệp.


2

Phần sau hoạt động với tôi trên Excel cho Mac 2011 và Windows Excel 2002:

  1. Sử dụng iconv trên Mac, chuyển đổi tệp thành UTF-16 Little Endian + đặt tên cho nó * .txt (phần mở rộng .txt buộc Excel chạy Trình hướng dẫn nhập văn bản):

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

  2. Mở tệp trong Excel và trong Trình hướng dẫn nhập văn bản, chọn:

    • Bước 1: Nguồn gốc tệp : bỏ qua nó, không quan trọng bạn chọn gì
    • Bước 2: chọn các giá trị phù hợp cho Dấu phân cách và Trình phân loại văn bản
    • Bước 3: nếu cần, chọn định dạng cột

PS UTF-16LE được tạo bởi iconv có BOM byte FF FE ngay từ đầu.

PPS Tệp csv ban đầu của tôi đã được tạo trên máy tính Windows 7, ở định dạng UTF-8 (với BOM byte EF BB BF lúc đầu) và sử dụng ngắt dòng CRLF. Dấu phẩy được sử dụng làm dấu phân cách trường và trích dẫn đơn làm vòng loại văn bản. Nó chứa các chữ cái ASCII cộng với các chữ cái Latinh khác nhau có dấu ngã, âm sắc, v.v., cộng với một số chữ viết. Tất cả được hiển thị đúng trong cả Excel cho Win và Mac.

PPPS Phiên bản phần mềm chính xác:
* Mac OS X 10.6.8
* Excel cho Mac 2011 v.14.1.3
* Windows Server 2003 SP2
* Windows Excel 2002 v.10.2701.2625


Nếu bạn có tệp UTF-8 không có BOM, iconv sẽ chuyển đổi nó thành UTF-16LE mà không có BOM (và thật không may, không có cách nào để bảo iconv thêm một)
Walter Tross 13/03/2015

2

Trên hệ điều hành Mac của tôi, Text Wrangler đã xác định tệp CSV được tạo bằng Excel có mã hóa "Phương Tây".

Sau một vài lần googling tôi đã tạo ra tập lệnh nhỏ này (tôi không chắc về tính khả dụng của Windows, có thể với Cygwin ?):

$ mèo /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

Đây là điều duy nhất hoạt động với tôi trên OS X 10.14.2 (và Excel 2011)
Donald

1

Trong trường hợp của tôi, việc thêm Lời mở đầu vào tệp đã giải quyết vấn đề của tôi:

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

thay vì csv, hãy thử xuất html với phần mở rộng XLS và loại mime "application / excel". Tôi biết điều này sẽ hoạt động trong Windows, nhưng không thể nói cho MacOS


Cảm ơn @ royce23, nhưng tôi chỉ cung cấp tệp CSV để tải xuống. Tôi không thể trình bày qua HTTP vì kích thước tuyệt đối của đánh dấu sẽ làm chậm phản hồi khi thu thập dữ liệu - bảng đã xuất có thể chứa hàng triệu hàng ...
Timm

với css, html của bạn sẽ chỉ lớn hơn một phần nhỏ hơn csv, ví dụ: <r> <c> id </ c> <c> name </ c> <c> phone </ c> </ r>
royce3

Không chắc tôi có hiểu không, nhưng tôi đang lưu CSV trên máy chủ và cung cấp liên kết tải xuống. Tạo phản hồi HTML chiếm quá nhiều bộ nhớ PHP ...
Timm

Điều này sẽ hoạt động (ký tự UTF-8) nhưng nếu bạn có các ngắt dòng được nhúng trong các ô ( brthẻ), Excel cho Mac sẽ bỏ qua CSS (hoạt động với Windows) mso-data-placement:same-cell;
cropredy vào

0

Điều này làm việc cho tôi

  1. Mở tệp trong BBEdit hoặc TextWrangler *.
  2. Đặt tệp là Unicode (UTF-16 Little-Endian) (Kết thúc dòng có thể là Unix hoặc Windows). Tiết kiệm!
  3. Trong Excel: Dữ liệu> Nhận dữ liệu ngoài> Nhập tệp văn bản ...

Bây giờ là điểm chính, chọn MacIntosh làm Nguồn gốc tệp (nên là lựa chọn đầu tiên).

Đây là sử dụng Excel 2011 (phiên bản 14.4.2)

* Có một chút thả xuống ở dưới cùng của cửa sổ


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.