Microsoft Excel mangles Diacritics trong tệp .csv?


190

Tôi đang lập trình xuất dữ liệu (sử dụng PHP 5.2) vào tệp thử nghiệm .csv.
Dữ liệu ví dụ: Numéro 1(lưu ý dấu e). Dữ liệu là utf-8(không có BOM dự phòng).

Khi tôi mở tệp này trong MS Excel sẽ hiển thị dưới dạng Numéro 1.

Tôi có thể mở cái này trong trình soạn thảo văn bản (UltraEdit) để hiển thị chính xác. UE báo cáo nhân vật là decimal 233.

Làm cách nào tôi có thể xuất dữ liệu văn bản trong tệp .csv để MS Excel sẽ hiển thị chính xác , tốt nhất là không bắt buộc sử dụng trình hướng dẫn nhập hoặc cài đặt trình hướng dẫn không mặc định?


Tôi sẽ rất thích thú khi nghe thêm về giải pháp BOM của bạn, vì tôi tin rằng tôi đã thử "EF BB BF" không hiệu quả với tôi.
James Baker

3
Giải pháp làm việc được chọn là: * bao gồm BOM; utf-8 * sử dụng tiêu đề này: 'Kiểu nội dung: văn bản / thuần túy; charset = utf-8 'Điều này "đã hoạt động" trong excel 2003 và excel 2007 - nơi làm việc = đã mở mà không có trình hướng dẫn nhập khẩu và hiển thị chính xác các dấu phụ. Tôi đã không xác minh rằng BOM là bắt buộc.
Freddo411

2
BOM là bắt buộc, tôi chỉ cần thử nghiệm này ngay bây giờ. Nếu không có nó, các ký tự đặc biệt sẽ không hiển thị ok.
Alex Ciminian

2
sẽ thích nó nếu ai đó có thể nói thêm về cách thêm BOM (điểm đánh dấu thứ tự byte). Nếu tôi chỉ làm một cái gì đó như Phản hồi. Viết (EF BB BF ") thì các ký tự đó chỉ xuất hiện ở đầu tệp.
sydneyos

sydneyos: Như Fergal nói dưới đây; Chuẩn bị \ uFEFF cho chuỗi của bạn.
noocyte

Câu trả lời:


242

Một tệp UTF8 được định dạng chính xác có thể có Dấu thứ tự Byte là ba octet đầu tiên. Đây là các giá trị hex 0xEF, 0xBB, 0xBF. Các octet này dùng để đánh dấu tệp là UTF8 (vì chúng không liên quan như thông tin "thứ tự byte"). 1 Nếu BOM này không tồn tại, người tiêu dùng / người đọc còn lại để suy ra kiểu mã hóa của văn bản. Các trình đọc không có khả năng UTF8 sẽ đọc các byte như một số mã hóa khác như Windows-1252 và hiển thị các ký tự ở đầu tệp.

Có một lỗi đã biết trong đó Excel, khi mở tệp CSV UTF8 thông qua liên kết tệp, giả sử rằng chúng ở dạng mã hóa một byte, bất chấp sự hiện diện của BOM UTF8. Điều này không thể được sửa bởi bất kỳ cài đặt ngôn ngữ hoặc mã mặc định nào của hệ thống. BOM sẽ không đầu mối trong Excel - nó sẽ không hoạt động. (Một báo cáo thiểu số cho rằng BOM đôi khi kích hoạt thuật sĩ "Nhập văn bản".) Lỗi này dường như tồn tại trong Excel 2003 trở về trước. Hầu hết các báo cáo (giữa các câu trả lời ở đây) nói rằng điều này được sửa trong Excel 2007 và mới hơn.

Lưu ý rằng bạn luôn có thể * mở chính xác các tệp CSV UTF8 trong Excel bằng thuật sĩ "Nhập văn bản", cho phép bạn chỉ định mã hóa của tệp bạn đang mở. Tất nhiên điều này là ít thuận tiện hơn nhiều.

Người đọc câu trả lời này rất có thể trong tình huống họ không hỗ trợ Excel <2007, nhưng đang gửi văn bản UTF8 thô tới Excel, điều này diễn giải sai và rắc văn bản của bạn Ãvà các ký tự Windows-1252 tương tự khác. Thêm BOM UTF8 có lẽ là cách khắc phục nhanh nhất và tốt nhất của bạn.

Nếu bạn bị mắc kẹt với người dùng trên Excels cũ hơn và Excel là người tiêu dùng CSV duy nhất của bạn, bạn có thể giải quyết vấn đề này bằng cách xuất UTF16 thay vì UTF8. Excel 2000 và 2003 sẽ nhấp đúp vào mở chúng một cách chính xác. (Một số trình soạn thảo văn bản khác có thể có vấn đề với UTF16, vì vậy bạn có thể phải cân nhắc các lựa chọn của mình một cách cẩn thận.)


* Ngoại trừ khi bạn không thể, (ít nhất) Excel 2011 cho Trình hướng dẫn nhập khẩu của Mac không thực sự luôn hoạt động với tất cả các bảng mã, bất kể bạn nói gì với nó. </ giai thoại-bằng chứng> :)


14
Mất tôi mãi mãi để tìm nơi chỉ định mã hóa. Lưu hộp thoại> Nút công cụ> Tùy chọn web> Tab mã hóa. Họ chắc chắn rất giỏi trong việc che giấu những điều quan trọng như vậy.
Triynko

6
Sai: thêm BOM vào tệp UTF-8 tải tệp đó một cách chính xác mà không yêu cầu trình hướng dẫn nhập trong Excel 2007
Victor Nicollet

3
Chúng tôi đã tìm thấy điều tương tự như Victor nói hôm nay (sử dụng Excel 2010, đó là tất cả những gì chúng tôi có). Thêm BOM / Chữ ký UTF-8 (EF BB BF) dường như khắc phục việc nhấp đúp bằng cách sử dụng mã hóa mặc định của hệ thống và sử dụng chính xác UTF8 :)
Danny Tuppeny

20
Nói chung , tệp được mã hóa UTF-8 không được đặt trước Dấu hiệu đơn hàng Byte. UTF-8 không có thứ tự byte thay đổi và đặt nó ở đó phá hoại khả năng tương thích ASCII của UTF-8. Có một số định dạng tệp cụ thể cho phép hoặc khuyến khích UTF-8 giả-BOM, nhưng nếu không thì nên tránh. CSV hoàn toàn không biết gì về mã hóa, do đó, mọi người đều đoán xem liệu một công cụ đã cho sẽ giải thích chuỗi byte 0xEF 0xBB 0xBF như là một chỉ báo của UTF-8; một nhân vật điều khiển vô hình trong ô đầu tiên; các ký tự trong ô đầu tiên; hoặc một cái gì đó khác hoàn toàn.
bobince

3
@Ian: Không ai biết chắc chắn đó là UTF-8 với BOM - 0xEF 0xBB 0xBF là một chuỗi hợp lệ trong hầu hết các mã hóa kế thừa (do đó nó thường bị hiểu sai là ISO-8859-1 hoặc cp1252 và được hiển thị dưới dạng ). Nó chỉ giúp đoán các thuật toán và cho các định dạng tệp đặc biệt tạo ra các khoản phụ cấp cho nó (ví dụ: XML). Nhược điểm của việc bao gồm BOM giả trong các tệp UTF-8 là bạn phá vỡ tính tương thích ASCII của chúng (một điểm bán hàng chính cho UTF-8) Nhiều công cụ văn bản không biết mã hóa sẽ bị phá vỡ khi gặp BOM giả bất ngờ hàng đầu.
bobince

39

Chuẩn bị BOM (\ uFEFF) làm việc cho tôi (Excel 2007), trong đó Excel đã nhận ra tệp là UTF-8. Mặt khác, lưu nó và sử dụng trình hướng dẫn nhập, nhưng ít lý tưởng hơn.


1
Nó vẫn mở trình hướng dẫn nhập văn bản, do đó, sự khác biệt là bạn có thể chỉ cần nhấp đúp chuột, do đó vẫn không lý tưởng nhưng dù sao chỉ là giải pháp được biết đến.
haridsv

Đối với tôi, không có trình hướng dẫn nhập nào xuất hiện trong Excel 2007
Victor Nicollet

Không có trình hướng dẫn nhập nào cho tôi - nó hoạt động như mong đợi nếu có BOM / Chữ ký UTF8 (EF BB BF).
Daniel Tuppeny

Ngoài ra, \ufefflà một UTF-16 (BE) BOM BOM không phải là một UTF-8
Alastair McCormack

2
Không, @AlastairMcCormack, tùy thuộc vào cách mã hóa. "\ ufeff" được mã hóa dưới dạng UTF-8 chính xác là EF BB BF. (Được mã hóa dưới dạng UTF-16, nó sẽ chỉ là hai byte.)
Dave Burt

30

Dưới đây là mã PHP tôi sử dụng trong dự án của mình khi gửi Microsoft Excel cho người dùng:

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

CẬP NHẬT: Cải thiện tên tệp và BUG sửa tính toán độ dài chính xác. Cảm ơn TRiG@ ivanhoe011


1
Tôi đã thử một số đề xuất khác trên trang này, nhưng điều này có hiệu quả với tôi trong Excel 2007. Những thay đổi quan trọng nhất là sử dụng các tab thay vì dấu phẩy (mặc dù đó là tệp .csv) và dòng phía trên lặp lại hai ký tự theo sau gọi đến mb_convert_encoding (). Tôi cũng đã phải biên dịch lại PHP bằng --enable-mbopes để được hỗ trợ cho mb_convert_encoding (). Cảm ơn!
Russell G

1
Điều này làm việc tốt cho tôi quá, cảm ơn. Tuy nhiên, trong Safari tôi gặp lỗi trong bảng điều khiển của mình 'Tài nguyên được hiểu là tài liệu nhưng được chuyển thành ...' Tôi đoán đó là một trò chơi trên WebKit, đánh giá stackoverflow.com/questions/3899426/ , nhưng có lẽ đó không phải và / hoặc ai đó có tìm thấy một giải pháp. Hơn nữa, trong ví dụ của bạn, tôi sẽ đề xuất một thay đổi: 'Content-Disposition: attachment; filename="'.$filename.'.csv"'bởi vì Firefox muốn có dấu ngoặc kép hoặc nếu không, nó sẽ cắt tên tệp của bạn sau một khoảng trắng.
kas Elli

Tại sao bạn xuất ra CSV ( text/csv) nhưng gọi nó là Excel ( application/vnd.ms-excel)?
TRiG

2
Điều này làm việc tuyệt vời! Tôi có thể xác nhận nó cũng hoạt động trên Mac (trong Office 2011).
Jonathan

Điều này có nên không header('Content-Length: '. mb_strlen($encoded_csv, 'UTF-16LE'));?
Bradshaw giàu có

13

Câu trả lời cho tất cả các kết hợp phiên bản Excel (2003 + 2007) và loại tệp

Hầu hết các câu trả lời khác ở đây chỉ liên quan đến phiên bản Excel của họ và không nhất thiết phải giúp bạn, vì câu trả lời của họ có thể không đúng với phiên bản Excel của bạn.

Ví dụ: việc thêm ký tự BOM sẽ gây ra sự cố với nhận dạng dấu tách cột tự động, nhưng không phải với mọi phiên bản Excel.

Có 3 biến xác định nếu nó hoạt động trong hầu hết các phiên bản Excel:

  • Mã hóa
  • Sự hiện diện của nhân vật BOM
  • Tách tế bào

Ai đó khắc kỷ tại SAP đã thử mọi sự kết hợp và báo cáo kết quả. Kết quả cuối cùng? Sử dụng UTF16le với BOM và ký tự tab làm dấu phân cách để nó hoạt động trong hầu hết các phiên bản Excel.

Bạn không tin tôi? Tôi cũng không, nhưng đọc ở đây và khóc: http://wiki.sdn.sap.com/wiki/display/ABAP/CSV+tests+of+encoding+and+column+separator


Tại sao không chỉ thêm sep=,hoặc bất cứ điều gì bạn muốn sử dụng? Nếu bạn đã thêm BOM, tôi cho rằng bạn không phản đối việc thêm nội dung vào tệp.
Casey

Chà, thực ra, để trả lời câu hỏi của riêng tôi, bạn sẽ không thêm khai báo phân tách trường vì nó khiến thủ thuật này ngừng hoạt động. Vì vậy, về cơ bản, mã hóa bị cắt xén hoặc tệp của bạn không được hiểu đúng là CSV nếu người dùng của bạn có cài đặt vùng sai.
Casey

1
tab utf-16le + BOM (0xFF 0xFE) + là tốt nhất
zhaozhi

10

chọn mã hóa UTF-8 khi nhập. nếu bạn sử dụng Office 2007 thì đây là nơi bạn đã chọn: ngay sau khi bạn mở tệp.


1
Điều này rất hữu ích. Tôi đã sửa đổi câu hỏi để hỏi cách thực hiện điều này mà không cần dùng đến thuật sĩ
Freddo411

9

Echo UTF-8 BOM trước khi xuất dữ liệu CSV. Điều này sửa tất cả các vấn đề về ký tự trong Windows nhưng không hoạt động với Mac.

echo "\xEF\xBB\xBF";

Nó hoạt động với tôi vì tôi cần tạo một tệp sẽ chỉ được sử dụng trên PC Windows.


Không đúng với mọi loại dấu tách cột cũng như mọi phiên bản Excel. Đọc câu trả lời của tôi dưới đây (bên dưới bây giờ).
Christiaan Westerbeek

7

UTF-8 không hoạt động với tôi trong office 2007 mà không có gói dịch vụ nào, có hoặc không có BOM (U + ffef hoặc 0xEF, 0xBB, 0xBF, không hoạt động) cài đặt sp3 làm cho UTF-8 hoạt động khi 0xEF, 0xBB, 0xBF BOM chuẩn bị trước.

UTF-16 hoạt động khi mã hóa bằng python bằng cách sử dụng "utf-16-le" với BOM 0xff 0xef được chuẩn bị trước và sử dụng tab làm ngăn cách. Tôi đã phải viết BOM theo cách thủ công, sau đó sử dụng "utf-16-le" thay vì "utf-16", nếu không, mỗi mã hóa () đã đưa BOM vào mỗi hàng được viết ra như rác trên cột đầu tiên của dòng thứ hai và sau.

không thể biết liệu UTF-16 có hoạt động mà không cần cài đặt sp hay không, vì tôi không thể quay lại bây giờ. thở dài

Đây là trên windows, dunno về văn phòng cho MAC.

đối với cả hai trường hợp làm việc, quá trình nhập hoạt động khi khởi chạy tải xuống trực tiếp từ trình duyệt và trình hướng dẫn nhập văn bản không can thiệp, nó hoạt động như bạn mong đợi.


Hoạt động trên Excel 2011 cho Mac.
Adam

cảm ơn vì bài đăng của bạn, sử dụng utf-16le vẫn ổn ngay cả khi bạn không cài đặt office 2007 sp3, nhưng BOM phải là 0xFF 0xFE
zhaozhi

4

Như Fregal đã nói \ uFEFF là con đường để đi.

<%@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
Chỉ cần xem và xem cách phân tách tab của bạn bị bỏ qua trong Excel 2007 khi bạn sử dụng BOM. Bạn phải đến với một cái gì đó nhiều hơn.
Christiaan Westerbeek

3

Tôi cũng nhận thấy rằng câu hỏi đã được "trả lời" cách đây một thời gian nhưng tôi không hiểu những câu chuyện nói rằng bạn không thể mở tệp csv được mã hóa utf8 thành công trong Excel mà không cần sử dụng trình hướng dẫn văn bản.

Trải nghiệm có thể tái tạo của tôi: Old MacDonald had a farm,ÈÌÉÍØNhập vào Notepad, nhấn Enter, sau đó lưu dưới dạng (sử dụng tùy chọn UTF-8).

Sử dụng Python để hiển thị những gì thực sự có trong đó:

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

Tốt Notepad đã đặt BOM ở phía trước.

Bây giờ, hãy vào Windows Explorer, nhấp đúp vào tên tệp hoặc nhấp chuột phải và sử dụng "Mở bằng ..." và bật lên Excel (2003) với màn hình như mong đợi.


@Cocowalla: Chà, tôi mới thử cái này (một lần nữa; tôi đã kiểm tra nó trước khi đăng) và nó đã hoạt động với Excel 2007 (đó là những gì tôi đang sử dụng bây giờ). Bạn đã làm gì open('oldmac.csv', 'rb').read()để xác minh đầu vào của bạn?
John Machin

Tôi đã không thử với Excel 2007 (Tôi biết Excel 2007 đọc các tệp UTF-8 với BOM tốt), tôi đã thử với Excel 2003
Cocowalla

@Cocowalla: Vâng, nó hoạt động với tôi với Excel 2003 khi tôi có nó. Bạn có chắc chắn có gói dịch vụ mới nhất cho Excel 2003 không? Bạn đã xác minh bạn nhập liệu như tôi đề nghị?
John Machin

Tôi đã xác minh rằng notepad đã bị kẹt BOM khi bắt đầu tệp, nhưng tôi đang dùng Excel 2003 SP2 (có sẵn SP3) - vì vậy tôi đoán điều này chỉ hoạt động trong SP3
Cocowalla

2

Bạn có thể lưu tệp html với phần mở rộng 'xls' và các dấu sẽ hoạt động (ít nhất là trước năm 2007).

Ví dụ: lưu cái này (sử dụng Save As utf8 trong Notepad) dưới dạng 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>

lựa chọn thú vị. Nó mở văn bản ngay nhưng vì một số lý do, tất cả các trang hoàn toàn trắng. Không có các dòng bảng tính cổ điển phân định các hàng và cột (office for mac)
Sebastian Sastre

Yup, điều tương tự trong Office 2007 trên Windows. Thành thật luôn làm tôi ngạc nhiên rằng nó hoạt động hoàn toàn, thành thật mà nói. (Lưu ý, nếu bạn thêm border="1"vào bảng, bạn sẽ nhận được các dòng, nhưng chỉ xoay quanh 4 ô :)
Stewol

1

Đây chỉ là một câu hỏi về mã hóa nhân vật. Có vẻ như bạn đang xuất dữ liệu của mình dưới dạng UTF-8: é trong UTF-8 là chuỗi hai byte 0xC3 0xA9, khi được hiểu trong Windows-1252 là Ã ​​©. Khi bạn nhập dữ liệu của mình vào Excel, hãy đảm bảo thông báo rằng mã hóa ký tự bạn đang sử dụng là UTF-8.


Tôi đã xác nhận rằng dữ liệu là UTF-8. Tôi phải làm gì vào tệp để cho excel biết rằng dữ liệu của tôi là utf-8 (BOM?)
Freddo411

Tôi nghĩ rằng bạn cần thay đổi mã hóa tệp, excel sử dụng bảng mã mặc định của hệ thống để xử lý các tệp csv
albertein

Tôi không hoàn toàn chắc chắn, vì tôi chưa cài đặt Excel trên máy tôi đang sử dụng, nhưng với OpenOffice, có một hộp thả xuống để mã hóa ký tự khi bạn nhập tệp CSV. Từ đó, chọn Unicode (UTF-8).
Adam Rosenfield

Excel không có thả xuống AFAIK
albertein

1

Định dạng CSV được triển khai dưới dạng ASCII, không phải là unicode, trong Excel, do đó, xáo trộn các dấu phụ. Chúng tôi đã gặp phải vấn đề tương tự, đó là cách tôi theo dõi rằng tiêu chuẩn CSV chính thức được xác định là dựa trên ASCII trong Excel.


Trên thực tế, CSV không bị ràng buộc với một mã hóa cụ thể. Đó là Excel giả định ASCII. vi.wikipedia.org/wiki/Comma-separated_values
spoulson

Đó là những gì tôi nói. "Được triển khai dưới dạng ASCII trong Excel", "CSV được định nghĩa là dựa trên ASCII trong Excel". Không chắc chắn những điểm bạn đang làm khi bạn dường như đồng ý với tôi.
Jeff Yates

2
Trên thực tế, bạn nói "Định dạng CSV được triển khai dưới dạng ASCI", tôi nghĩ đó là nơi mà sự nhầm lẫn bắt nguồn từ đó.
RichardOD

1

Excel 2007 đọc chính xác UTF-8 với csv được mã hóa BOM (EF BB BF).

Excel 2003 (và có thể sớm hơn) đọc UTF-16LE bằng BOM (FF FE), nhưng với TAB thay vì dấu phẩy hoặc dấu chấm phẩy.


1

Tôi chỉ có thể nhận CSV để phân tích cú pháp chính xác trong Excel 2007 dưới dạng UTF-16 cuối cùng được phân tách bằng tab bắt đầu bằng dấu thứ tự byte thích hợp.


1

Viết BOM vào tệp CSV đầu ra thực sự có hiệu quả với tôi trong 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

Để biết thêm thông tin http://crashcoursing.blogspot.com/2011/05/exporting-csv-with-special-char character.html Cảm ơn các bạn!


Có, điều này làm việc với tôi với Excel 2010. Trong sử dụng Java printWriter.print('\ufeff'), hãy xem thêm Cách thêm BOM UTF-8 trong java .
tsauerwein

1

Một giải pháp khác tôi tìm thấy chỉ là mã hóa kết quả là Windows Code Trang 1252 (Windows-1252 hoặc CP1252). Điều này sẽ được thực hiện, ví dụ bằng cách đặt Content-Typemột cách thích hợp cho một cái gì đó giống như text/csv; charset=Windows-1252và đặt mã hóa ký tự của luồng phản hồi tương tự.


Cảm ơn vì điều này. Hoạt động trên excel windows và mac. Tôi đang sử dụng nó.
Sebastian Sastre

Điều này sẽ chỉ hoạt động nếu phạm vi ký tự không phải ascii của bạn nằm hoàn toàn trong Windows-1252. Vì vậy, ví dụ, không có tiếng Hàn / tiếng Trung / tiếng Nhật, không có tiếng nói, v.v. Nhưng tôi đoán bạn sẽ trượt theo điều này cho hầu hết các ngôn ngữ Tây Âu.
Tom McClure

1

Lưu ý rằng bao gồm BOM UTF-8 không nhất thiết phải là một ý tưởng hay - Các phiên bản Mac của Excel bỏ qua nó và thực sự sẽ hiển thị BOM dưới dạng ba ký tự khó chịu khi bắt đầu trường đầu tiên trong bảng tính của bạn.


Tôi biết nhận xét này là 6 năm sau, nhưng FWIW: Sử dụng JavaScript để tải xuống một tệp như '\uFEFF' + myCsvStringhoạt động như mong đợi trên Mac Excel 15.19.1 (2016).
bobjones

0

Kiểm tra mã hóa mà bạn đang tạo tệp, để làm cho excel hiển thị tệp chính xác, bạn phải sử dụng bảng mã mặc định của hệ thống.

Bạn đang sử dụng ngôn ngữ nào? nếu là .Net, bạn chỉ cần sử dụng Encoding.Default trong khi tạo tệp.


Dữ liệu xuất là utf-8. Tôi đang viết tệp xuất với php 5
Freddo411

Chuyển mã dữ liệu sang codepage Windows-1252, tôi không chắc làm thế nào để hoàn thành nó với php
albertein

0

Nếu bạn có mã kế thừa trong vb.net như tôi có, mã sau đây hoạt động với tôi:

    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

Tôi đã tìm ra cách để giải quyết vấn đề. Đây là một hack khó chịu nhưng nó hoạt động: mở tài liệu với Open Office , sau đó lưu nó vào bất kỳ định dạng excel nào; kết quả .xlshoặc .xlsxsẽ hiển thị các ký tự có dấu.


1
OP cho biết anh ta đang xuất khẩu theo chương trình, vì vậy anh ta không tìm kiếm một giải pháp cần can thiệp thủ công.
Christiaan Westerbeek

0

Với Ruby 1.8.7, tôi mã hóa mọi trường thành UTF-16 và loại bỏ BOM (có thể).

Đoạn mã sau được trích xuất từ ​​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 -%>

Dòng quan trọng là:

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

-2

mở tệp csv bằng notepad ++ clic trên Encode, chọn chuyển đổi sang UTF-8 (không chuyển đổi thành UTF-8 (không có BOM)) Lưu mở bằng clic kép với excel Hy vọng giúp được Kouthe GRISON


1
Điều này không trả lời câu hỏi vì nó được thực hiện theo chương trình và không yêu cầu sự can thiệp của người dùng để lưu lại thủ công mọi tệp
Joe W
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.