Hướng dẫn dùng ufeff JavaScript

Im trying to export String data to CSV using unicode in JavaScript using UTF-8 and \uFEFF. The problem is when the CSV file build he take the string after comma , and the first cell filled with this string : "Content-Disposition:attachment;filename="+filename+"\ ," " . I tried to change the position of the charset to the end, but the fileName must be in the end of the link.

Any ideas ?

thanks!

downloadCampaingnCsv: function(campaignIds,filename, url){

                  var s = new Server();
                  var response = s.sendJSON(ApiBaseUrl +  url,'POST',campaignIds);
                  var csvContent = "data:text/csv;charset=utf-8,/uFEFF;Content-Disposition:attachment;filename="+filename+"\ ," ;     
                  if (response != "No Data!"){
                    var encodedUri = csvContent +encodeURI(response); 
                  } else {
                    var encodedUri  = "data:text/csv;filename="+filename+"\ ,"  + encodeURI(response);
                  }
                  var link = document.createElement("a");
                  link.setAttribute("href", encodedUri);
                  link.setAttribute("download", filename);
                  link.click();
   }

Tôi đang chỉnh sửa câu trả lời ban đầu của mình. Câu trả lời ở trên thực sự đòi hỏi phải được xây dựng tỉ mỉ vì đây là một giải pháp phức tạp của Node.js.

Câu trả lời ngắn gọn là, có, mã này hoạt động.

Câu trả lời dài là, không, FEFF không phải là dấu thứ tự byte cho utf-8. Rõ ràng nút đã sử dụng một số loại phím tắt để viết mã hóa trong các tệp. FEFF là mã hóa UTF16 Little Endian như có thể thấy trong bài viết trên wikipedia Byte Order Mark và cũng có thể được xem trong trình soạn thảo văn bản nhị phân sau khi đã viết tệp. Tôi đã xác minh đây là trường hợp.

http://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding

Rõ ràng, Node.JS sử dụng \ ufeff để biểu thị bất kỳ số lượng mã hóa nào . Nó lấy dấu \ ufeff và chuyển nó thành dấu thứ tự byte chính xác dựa trên tham số tùy chọn thứ 3 của writeFile. Tham số thứ 3 bạn chuyển vào chuỗi mã hóa. Node.JS lấy chuỗi mã hóa này và chuyển đổi mã hóa byte cố định \ ufeff thành bất kỳ một trong các dấu thứ tự byte thực tế của mã hóa.

Ví dụ UTF-8:

fs.writeFile(someFilename, '\ufeff' + html, { encoding: 'utf8' }, function(err) {
   /* The actual byte order mark written to the file is EF BB BF */
}

Ví dụ UTF-16 Little Endian:

fs.writeFile(someFilename, '\ufeff' + html, { encoding: 'utf16le' }, function(err) {
   /* The actual byte order mark written to the file is FF FE */
}

Vì vậy, như bạn có thể thấy \ ufeff chỉ đơn giản là một điểm đánh dấu cho biết bất kỳ số lượng mã hóa kết quả nào. Mã hóa thực tế đưa nó vào tệp phụ thuộc trực tiếp vào tùy chọn mã hóa được chỉ định. Điểm đánh dấu được sử dụng trong chuỗi thực sự không liên quan đến những gì được ghi vào tệp.

Tôi nghi ngờ rằng lý do đằng sau điều này là do họ đã chọn không ghi các dấu thứ tự byte và dấu 3 byte cho UTF-8 không dễ dàng được mã hóa thành chuỗi javascript để ghi vào đĩa. Vì vậy, họ đã sử dụng UTF16LE BOM làm dấu giữ chỗ trong chuỗi được thay thế tại thời điểm ghi.

17 hữu ích 5 bình luận chia sẻ

Tôi đang cố gắng, chỉ cần đặt, loại bỏ một ký tự ngắt dòng có độ rộng bằng 0 ẩn (U + FEFF) trong tập lệnh của mình. Trang web mà nó đã xuất hiện là tại http://cynicode.co.uk (Xin lưu ý, trang chỉ mục đã được sửa đổi và là trang duy nhất hoạt động bình thường vào lúc này)

Bằng cách nhìn vào các phần tử html trên trang, điều này sẽ hiển thị:

Hướng dẫn dùng ufeff JavaScript

Điểm quan trọng là chấm đỏ giữa < body >< !--5-- >. Điều này, khi di chuột qua, cho thấy rằng đó là một \ufeffký tự. Vấn đề là, khi tôi xem qua kịch bản, không có nhân vật nào như vậy tồn tại.

Tôi đang sử dụng PHP và HTML để xây dựng trang này và các mục giữa < !--4-- >< !--5-- >bao gồm các mục sau. Thứ nhất, trên chính trang chỉ mục thực tế:

";
  echo "
    CyniCode :: Index
    
    
    
    
    
    
    
    
    
    
    
    
    
    

    ";
  require_once './functions/page.php';

Điều này cấu thành trang Chỉ mục. Tập lệnh page.php được tham chiếu là mẹo của tôi để thiết lập trang một cách nhanh chóng và sạch sẽ. Tuy nhiên ... có một sự khác biệt nhỏ còn lại giữa hai bình luận trên trang. Đây là sự khác biệt còn lại giữa hai ý kiến.

";

Bất kỳ sự giúp đỡ nào mà bất kỳ ai có thể cung cấp sẽ được đánh giá cao. Tất cả các đoạn mã là bản sao và dán trực tiếp từ các tập lệnh của tôi.

12 hữu ích 2 bình luận 45k xem chia sẻ