আমি কীভাবে পিএইচপি-তে কোনও ইউটিএফ -8 সিএসভি আউটপুট করতে পারি যা এক্সেলটি সঠিকভাবে পড়বে?


191

আমি এই খুব সহজ জিনিস পেয়েছি যা কেবল CSV ফর্ম্যাটে কিছু স্টাফ আউটপুট করে তবে এটি ইউটিএফ -8 হতে পারে। আমি এই ফাইলটিকে টেক্সটএইডিট বা টেক্সটমেট বা ড্রিমউইভারে খুলি এবং এটি ইউটিএফ -8 অক্ষরগুলি যথাযথভাবে প্রদর্শন করে, তবে আমি যদি এটি এক্সেলে খুলি তবে এটি পরিবর্তে এই নির্বোধ íÄ ধরণের জিনিস করছে। আমার নথির শিরোনামে আমি যা পেয়েছি তা এখানে:

header("content-type:application/csv;charset=UTF-8");
header("Content-Disposition:attachment;filename=\"CHS.csv\"");

এক্সেল (ম্যাক, ২০০৮) ব্যতীত এগুলিগুলির পছন্দসই প্রভাব রয়েছে বলে মনে হয় এটি সঠিকভাবে আমদানি করতে চায় না। আমার কাছে "ইউটিএফ -8 হিসাবে খোলার" বা অন্য কোনও কিছু করার জন্য এক্সেলের কোনও বিকল্প নেই, তাই… আমি একটু বিরক্ত হচ্ছি।

অনেক লোক একই সমস্যা থাকা সত্ত্বেও আমি এর কোনও পরিষ্কার সমাধান খুঁজে পাচ্ছি না। আমি যে জিনিসটি সর্বাধিক দেখছি তা হ'ল বিওএম অন্তর্ভুক্ত করা, তবে কীভাবে এটি করা যায় তা আমি ঠিক বুঝতে পারি না। আপনি উপরে দেখতে পাচ্ছেন echoযে আমি কেবল এই ডেটাটি ইনগ করছি, আমি কোনও ফাইল লিখছি না। আমি এটি করতে পারি যদি আমার প্রয়োজন হয়, আমি কেবল তাই না কারণ এই মুহুর্তে এটির প্রয়োজনের মতো মনে হয় না। কোন সাহায্য?

আপডেট: আমি বিওএমকে প্রতিধ্বনিত করার চেষ্টা করেছি echo pack("CCC", 0xef, 0xbb, 0xbf);যা আমি ঠিক এমন কোনও সাইট থেকে টেনেছি যা বিওএম সনাক্ত করার চেষ্টা করছে। এক্সেল যখন আমদানি করে তখন কেবলমাত্র তিনটি অক্ষরকে একেবারে প্রথম ঘরে যুক্ত করে এবং এখনও বিশেষ অক্ষরগুলিকে মিস করে।


2
এক্সেল আগত ফাইলের চরিত্রের সেটটি সামঞ্জস্য করার কোনও বিকল্প সরবরাহ করে না? আপনি কি এটি সম্পর্কে 100% নিশ্চিত? আমার কাছে অনুলিপি নেই তাই আমি চেষ্টা করতে পারি না তবে আমি ধারণা করি কোথাও কোনও ড্রপ ডাউন বাক্স থাকতে হবে।
পেক্কা

এটি ম্যাকের উপর এক্সেল - এটি পিসিতে এক্সেলের চেয়ে বেশি সীমাবদ্ধ বলে মনে হয়। ওপেন ডায়ালগটিতে কোনও ড্রপডাউন নেই, এর বাইরে যে ফাইল ফাইলগুলি খুলতে সক্ষম হবে। আমি সর্বত্র দেখেছি। যদি এটি সেখানে থাকে তবে এটি অস্পষ্ট। আমি 98% নিশ্চিত বলব।
বেন সাফলি

মাইক্রোসফ্ট অফিস বা ওপেন অফিসে?
আজ্রিয়াল

মাইক্রোসফ্ট এক্ষেত্রে আরও ভাল, ওপেন অফিসকে চারসেট সনাক্ত করতে কোনও উপায় নেই (যা আমি খুঁজে পেয়েছি), এমনকি বিওএমও নয়। ধ্যাত্তেরি.
সায়েন্টিক

ম্যাকের জন্য মাইক্রোসফ্ট এক্সেল ২০০ on এ বিওমের কোনও প্রভাব নেই।
বেন সাফলে

উত্তর:


134

একটি মাইক্রোসফ্ট সমর্থন ইঞ্জিনিয়ার উদ্ধৃত করতে ,

ম্যাকের জন্য এক্সেল বর্তমানে ইউটিএফ -8 সমর্থন করে না

আপডেট, 2017 : অফিস 2016 এর আগে ম্যাকের জন্য মাইক্রোসফ্ট এক্সেলের সমস্ত সংস্করণে এটি সত্য । আরও নতুন সংস্করণ (অফিস 365 থেকে) এখন ইউটিএফ -8 সমর্থন করে।

উইন্ডোজ এবং ওএস এক্স উভয়ই এক্সেল সফলভাবে পড়তে সক্ষম হবে ইউটিএফ -8 সামগ্রীটি আউটপুট দেওয়ার জন্য আপনাকে দুটি জিনিস করতে হবে:

  1. নিশ্চিত হয়ে নিন যে আপনি আপনার UTF-8 CSV পাঠ্যটিকে UTF-16LE তে রূপান্তর করেছেন

    mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
  2. আপনি ফাইলটির শুরুতে UTF-16LE বাইট অর্ডার চিহ্ন যুক্ত করেছেন তা নিশ্চিত করুন

    chr(255) . chr(254)

ওএস এক্সে (তবে উইন্ডোজ নয় ) কেবল এক্সেলের সাথে প্রদর্শিত পরবর্তী সমস্যাটি যখন কমা দ্বারা পৃথক হওয়া মানগুলির সাথে কোনও সিএসভি ফাইল দেখবে তখন এক্সেলটি কেবল প্রথম সারিতে কমা সহ একটি সারি এবং সমস্ত পাঠ্য সহ সারিগুলি সরবরাহ করবে।

এটি এড়ানোর উপায় হ'ল ট্যাবগুলি আপনার পৃথক মান হিসাবে ব্যবহার করা।

আমি পিএইচপি মন্তব্যগুলি থেকে এই ফাংশনটি ব্যবহার করেছি (কমাগুলির পরিবর্তে "\ t" ট্যাব ব্যবহার করে) থেকে ব্যবহার করেছি এবং এটি ওএস এক্স এবং উইন্ডোজ এক্সেলে পুরোপুরি কাজ করেছে।

নোট করুন যে একটি সারির শেষ হিসাবে খালি কলাম দিয়ে কোনও সমস্যা সমাধান করতে, আমাকে কোডের লাইনটি পরিবর্তন করতে হবে যা বলছে:

    $field_cnt = count($fields);

প্রতি

    $field_cnt = count($fields)-1;

যেমন এই পৃষ্ঠার অন্যান্য মন্তব্যগুলির মধ্যে কিছু বলছে, অন্যান্য স্প্রেডশিট অ্যাপ্লিকেশন যেমন ওপেন অফিস ক্যালক, অ্যাপলের নিজস্ব নম্বর এবং গুগল ডকের স্প্রেডশিটের কোনও ইউটিএফ -8 ফাইল কমা সহ কোনও সমস্যা নেই।

এক্সেলের ইউনিকোড সিএসভি ফাইলগুলির জন্য কী কাজ করে এবং কাজ করে না তার জন্য এই প্রশ্নের টেবিলটি দেখুন


পার্শ্ব নোট হিসাবে, আমি যুক্ত করতে পারি যে আপনি যদি সুরকার ব্যবহার করছেন তবে League\Csvআপনার প্রয়োজনীয়তাগুলিতে যুক্ত হওয়া উচিত । League\Csvহয়েছে CSV ফাইল নির্মাণের জন্য একটি সত্যিই চমৎকার এপিআই

League\Csvসিএসভি ফাইল তৈরির এই পদ্ধতিটি ব্যবহার করতে এই উদাহরণটি দেখুন


1
আমাকে বোকা বলুন, তবে আমি এই কাজটি করতে পারি না। আমি mb_convert_encoding ফাংশনটি ব্যবহার করে আমার ডেটা রূপান্তর করেছি এবং ফাইলের সামগ্রীর আগে বিওএম আউটপুট আউটপুট দিয়েছি, তবে আমি যখন এক্সেলে ফাইলটি খুলি তখন আমি কেবলমাত্র একক সারি চাইনিজ অক্ষর পাই। আমি এখনও আপাতত ট্যাবগুলির পরিবর্তে কমা ব্যবহার করছি, তবে সম্ভবত এটি যা দেখছে তা সৃষ্টি করা উচিত নয়।
জন রিক্স 11'14

পছন্দ করেছেন আমদানিকারকরা কেবলমাত্র কমা গ্রহণ করবে তা ব্যতীত - এই কোডটি CSV ফাইলগুলি রফতানি করার সাথে আমার যে সমস্ত সমস্যা ছিল তা আক্ষরিক অর্থেই সমাধান করেছে। আপনি কি দয়া করে আমাকে যে কোডটি ব্যবহার করছেন সেটির একটি পেস্টবিন আপনি যে কোনও সিএসভিতে রূপান্তর করছেন এবং রফতানি হওয়া ফাইলটির একটি অনুলিপি পাঠাতে পারেন?
টিম গ্রিনিভেল্ড

2
এই সমাধানটি ম্যাক এবং উইন্ডোতে আমার জন্য ইউটিএফ 8 সমস্যাটিও সমাধান করেছে। আমি এটিও খুঁজে পেয়েছি sep=;বা এর সাথে একটি লাইন যুক্ত করছিsep=, সিএসভি ফাইলের এক্সেলকে জানায় যে কীভাবে সিএসভি বিভাজিত হয়েছে এবং কলামগুলি আবার সঠিকভাবে তৈরি হবে।
ওয়ালান্টস

5
আমি দেখতে পেলাম যে আমি যদি বিওএম হিসাবে স্ট্রিং শুরু করি "sep=,\n", তবে অন্য লাইনে ডেটা যুক্ত করা হয়েছে, অন্য লাইনে এটি যুক্ত হয়েছে things আমি যদি এক লাইনে এগুলি করে থাকি তবে বিষয়গুলি ঠিক ছিল $csv = chr(255) . chr(254) /* BOM */ . "sep=,\n" . mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');। ম্যাকের সবকিছু এখন দুর্দান্ত দেখাচ্ছে। আমার সাথে উইন্ডোজ পরীক্ষা করার দরকার নেই।
কাঁপুনি

2
সম্পূর্ণরূপে আমার পক্ষে কাজ করা একমাত্র জিনিস। মাইক্রোসফ্টের অসঙ্গতি কখনও আমাকে অবাক করে দেয় না। একটি সাধারণ সিএসভি ফাইল সংরক্ষণ করে "," ডিলিমিটার হিসাবে ব্যবহার করে তবে কোনও বিওএম থাকলে এটি কোনও কারণে "\ t" ব্যবহার করে সংরক্ষণ করে। সি ইন সি। সিএসভি মানে "সিওএমএএমএ" ড্যামিমিট। এটি করা সত্যিই কঠিন নয়।
ফিল

288

আমার একই (বা অনুরূপ) সমস্যা আছে।

আমার ক্ষেত্রে, আমি যদি আউটপুটে কোনও বিওএম যোগ করি তবে এটি কাজ করে:

header('Content-Encoding: UTF-8');
header('Content-type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename=Customers_Export.csv');
echo "\xEF\xBB\xBF"; // UTF-8 BOM

আমি বিশ্বাস করি এটি একটি সুন্দর কুরুচিপূর্ণ হ্যাক, তবে এটি আমার পক্ষে কমপক্ষে এক্সেল 2007 উইন্ডোজের জন্য কাজ করেছিল। নিশ্চিত নয় এটি ম্যাকের সাথে কাজ করবে।


10
কুরুচিপূর্ণ, কিন্তু সুপার সহায়ক। ধন্যবাদ.
অ্যাবলিটো

7
দুর্ভাগ্যক্রমে আমি নিশ্চিত যে এটি ওএস এক্সে মোটেই ভাল কাজ করে না। আমি মনে করি আপনি আমদানি করার সময় এটি
বিওএমটি

2
এটা সঠিক। কমপক্ষে, আমি একটি বিওএম নিয়ে প্রিপেন্ডিং চেষ্টা করেছি, যেমন উপরের উদাহরণের মতো, তবে এটি শুরুতে কিছু ফানী চরিত্র দেখিয়েছে এবং বিশেষ অক্ষরগুলি ভুল প্রদর্শন করে চলেছে (এক্সেল ২০১১-এ পরীক্ষিত)। এটি আমার কাছে সমস্ত সেটিংসে সবচেয়ে ভাল কাজ করেছে বলে মনে হয়েছিল: stackoverflow.com/a/1648671/1005334 (পিএইচপি ব্যবহার করে)।
কাসিমির

4
আমি এই প্রশ্নের উপর সতর্কতা অব্যাহত রাখছি কারণ সম্ভবত আরও অনেক লোক এটির সামনে গিয়ে হোঁচট খায়। আমি আশা করি আমি এটিকে সঠিক হিসাবে চিহ্নিত করতে পারলাম, কারণ এটি অনেকটা উপরে উন্নীত হয়েছে। দুর্ভাগ্যক্রমে, আমি অবশেষে এই সমাধানটি একটি শট দিয়েছি (সেই প্রকল্পটি অনেক আগেই ছেড়ে দেওয়া হয়েছিল) এবং এটি ম্যাকের জন্য এক্সেল ২০০৮ এ আমার পক্ষে কাজ করছে না। খুশী এটা আপনার জন্য কাজ করে। আমি সমাধান upvote। তবে এটি ম্যাক ২০০৮ সমস্যাটি এক্সেল সমাধান করে না। কারও কাছে ম্যাকের ভাগ্য থাকলে অবশ্যই আমাকে (এবং স্পষ্টতই সবাই ) তা জানান।
বেন সাফলি 31'12

এমএস এক্সেল স্টার্টার 2010 এ একটি সিএসভি ফাইল সুন্দরভাবে আউটপুট তৈরি করে কাজ করে Thanks অনেক ধন্যবাদ!
জেমি ডেক্সটার

32

এটি আমি এখানে কীভাবে করেছি (তা ব্রাউজারকে সিএসভি ফাইল ডাউনলোড করার অনুরোধ জানায়):

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=file.csv');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
echo "\xEF\xBB\xBF"; // UTF-8 BOM
echo $csv_file_content;
exit();

আপনি যখন ম্যাকের উপর স্পেস বারটি চাপলেন তখন সিএসভি পূর্বরূপে ইউটিএফ 8 এনকোডিংয়ের সমস্যাটি কেবলমাত্র ঠিক করা হয়েছিল .. তবে এক্সেল ম্যাক ২০০৮ এ নয় ... কেন জানি না


1
কোডের ইউটিএফ -8 বিওএম লাইনটি আমার দিনটি
এক্সএলএসে

6
আমি ইউটিএফ 8 হিসাবে সরাসরি ব্রাউজারে আউটপুট দেওয়ার একটি উপায় খুঁজছিলাম, যখন আমি এই পোস্টটি পেরিয়ে এসেছি, এখানে বিওএম এবং বাইনারি স্থানান্তর শিরোনামের জন্য এই পোস্টে ক্রেডিট সহ আমার সমাধান রয়েছে। $outstream = fopen( "php://output", 'w' ); fputs( $outstream, "\xEF\xBB\xBF" ); foreach ( $export as $fields ) { fputcsv( $outstream, $fields ); } fclose( $outstream );
fyrye

টাইপো - ডাবল সরান ))
সাইটলিজ

22

আমি কেবল একই সমস্যাটি মোকাবিলা করেছি, এবং দুটি সমাধান নিয়ে এসেছি।

  1. বিপিটারসন 76 এর পরামর্শ অনুসারে পিএইচপিইপেক্সেল ক্লাস ব্যবহার করুন ।

    • এই শ্রেণিটি ব্যবহার করে সর্বাধিক ব্যাপকভাবে সামঞ্জস্যপূর্ণ ফাইল উত্পন্ন হয়, আমি ইউটিএফ -8 এনকোডড ডেটা থেকে এক্সেল 2008 ম্যাক, এক্সেল 2007 উইন্ডোজ এবং গুগল ডক্সে সূক্ষ্মভাবে একটি ফাইল তৈরি করতে সক্ষম হয়েছি।
    • পিএইচপিইএক্সসেল ব্যবহারে সবচেয়ে বড় সমস্যা হ'ল এটি ধীর গতির এবং প্রচুর মেমরি ব্যবহার করে, যা যুক্তিসঙ্গত আকারের ফাইলগুলির জন্য কোনও সমস্যা নয়, তবে যদি আপনার এক্সেল / সিএসভি ফাইলটিতে কয়েকশো বা কয়েক হাজার সারি থাকে তবে এই লাইব্রেরিটি ব্যবহারযোগ্য হয়ে উঠবে না
    • এখানে একটি পিএইচপি পদ্ধতি রয়েছে যা কিছু টিএসভি ডেটা নেবে এবং ব্রাউজারে একটি এক্সেল ফাইল আউটপুট নেবে, নোট করুন এটি এক্সেল 5 রাইটার ব্যবহার করে যার অর্থ ফাইলটি এক্সেলের পুরানো সংস্করণগুলির সাথে সামঞ্জস্যপূর্ণ হওয়া উচিত, তবে আমার আর কোনও অ্যাক্সেস নেই, সুতরাং আমি তাদের পরীক্ষা করতে পারছি না।

      function excel_export($tsv_data, $filename) {
          $export_data = preg_split("/\n/", $tsv_data);
          foreach($export_data as &$row) {
              $row = preg_split("/\t/", $row);
          }
      
          include("includes/PHPExcel.php");
          include('includes/PHPExcel/Writer/Excel5.php');
      
          $objPHPExcel = new PHPExcel();          
      
          $objPHPExcel->setActiveSheetIndex(0);
          $sheet = $objPHPExcel->getActiveSheet();
          $row = '1';
          $col = "A";
          foreach($export_data as $row_cells) {
              if(!is_array($row_cells)) { continue; }
                  foreach($row_cells as $cell) {
                      $sheet->setCellValue($col.$row, $cell);
                      $col++;
                  }
              $row += 1;
              $col = "A";
          }
      
          $objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
          header('Content-Type: application/vnd.ms-excel');
          header('Content-Disposition: attachment;filename="'.$filename.'.xls"');
          header('Cache-Control: max-age=0');
          $objWriter->save('php://output');   
          exit;   
      }
  2. পিএইচপিইএক্সসেলের দক্ষতার সমস্যাগুলির কারণে, আমি কীভাবে ইউটিএফ -8 এবং এক্সেল সামঞ্জস্যপূর্ণ সিএসভি বা টিএসভি ফাইল তৈরি করতে পারি তাও বের করতে হয়েছিল।

    • আমি সবচেয়ে ভালভাবে আসতে পেরেছিলাম এমন একটি ফাইল যা এক্সেল ২০০ Mac ম্যাক এবং এক্সেল ২০০ PC পিসির সাথে সামঞ্জস্যপূর্ণ ছিল, তবে গুগল ডক্স নয়, যা আমার অ্যাপ্লিকেশনের জন্য যথেষ্ট উপযুক্ত।
    • আমি এখানে সমাধানটি পেয়েছি , বিশেষ করে এই উত্তরটি , তবে আপনার গ্রহণযোগ্য উত্তরটিও পড়া উচিত সমস্যাটি ব্যাখ্যা করার সাথে সাথে ।
    • আমি যে পিএইচপি কোড ব্যবহার করেছি তা এখানে, নোট করুন যে আমি টিএসভি ডেটা ব্যবহার করছি (কমাগুলির পরিবর্তে ডিলিমেটার হিসাবে ট্যাবগুলি):

      header ( 'HTTP/1.1 200 OK' );
      header ( 'Date: ' . date ( 'D M j G:i:s T Y' ) );
      header ( 'Last-Modified: ' . date ( 'D M j G:i:s T Y' ) );
      header ( 'Content-Type: application/vnd.ms-excel') ;
      header ( 'Content-Disposition: attachment;filename=export.csv' );
      print chr(255) . chr(254) . mb_convert_encoding($tsv_data, 'UTF-16LE', 'UTF-8');
      exit;

আমি উইন্ডোজ -7 এক্সেল 2007 এ একই সমস্যার মুখোমুখি হয়েছি এবং সমস্ত পরামর্শ চেষ্টা করেছি তবে ব্যর্থ :(
পিএইচপি ফেরারি

UTF-16LE সমাধানটি কাজ করে worked মনে রাখবেন যে আপনাকে টিএসভিটি সঠিকভাবে ফর্ম্যাট করতে হবে এবং এটি টিএসসি করতে হবে, তাই ট্যাব সীমিত করা হয়েছে, কমা বিস্মৃত নয়। এখানে মার্কের পোস্টটিও
Ellert ভ্যান Koperen

16

আমার একই সমস্যা ছিল এবং এটি নীচের মত সমাধান করা হয়েছিল:

    header('Content-Encoding: UTF-8');
    header('Content-Type: text/csv; charset=utf-8' );
    header(sprintf( 'Content-Disposition: attachment; filename=my-csv-%s.csv', date( 'dmY-His' ) ) );
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');

    $df = fopen( 'php://output', 'w' );

    //This line is important:
    fputs( $df, "\xEF\xBB\xBF" ); // UTF-8 BOM !!!!!

    foreach ( $rows as $row ) {
        fputcsv( $df, $row );
    }
    fclose($df);
    exit();

13

এক্সেল ইউটিএফ -8 সমর্থন করে না। আপনাকে আপনার ইউটিএফ -8 পাঠ্যটি ইউসিএস -2 এলিতে এনকোড করতে হবে।

mb_convert_encoding($output, 'UCS-2LE', 'UTF-8');

3
উপরে প্রস্তাবিত হিসাবে ভাল ব্যবহারের জন্য ইউটিএফ -16LE, যা প্রতিটি চরিত্রকে অস্তিত্ব জুড়ে covers
এলার্ট ভ্যান কোপেরেন

আমি লক্ষ্য করেছি যে এই এমবি_কন্টভার্ট_কোডিংটি ভালভাবে কাজ করছে এবং আমার এক্সপোর্ট করা এক্সএলএস ফাইলে ডায়াক্রিটিক্স সঠিকভাবে দেখায় showing আমার mysql ডিফল্ট কনফিগারেশন এবং অ্যাপাচি + পিএইচপি utf-8 এর সাথে কাজ করতে সেট করেছে
জুনিয়র মেহে

10

আমার ক্ষেত্রে নিম্নলিখিতটি ইউটিএফ -8 অক্ষরের সাথে সিএসভি ফাইল তৈরি করতে খুব সুন্দর কাজ করে যা এক্সেলে সঠিকভাবে প্রদর্শিত হয়।

$out = fopen('php://output', 'w');
fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));
fputcsv($out, $some_csv_strings);

0xEF 0xBB 0xBFBOM হেডার এক্সেল সঠিক এনকোডিং তা জানাবে।


1
আপনার পক্ষে বড় হোন <3
এড্রিয়েন জি

fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));<- এটি ঠিক আমার প্রয়োজন ছিল। ইহা যাদুর মত কাজ করে।
অ্যালেক্স

8

এটি অনুসরণ করতে:

দেখা যাচ্ছে সমস্যাটি কেবল ম্যাকের এক্সেলের সাথেই রয়েছে। এটি কীভাবে আমি ফাইলগুলি তৈরি করছি তা নয়, এমনকি এক্সেল থেকে সিএসভি তৈরি করাও করাও তাদের ভেঙে দিচ্ছে। আমি সিএসভি হিসাবে সংরক্ষণ করি, এবং রিমপোর্ট করি এবং সমস্ত চরিত্র গোলযোগ পেয়ে যায়।

সুতরাং… এর সঠিক উত্তর বলে মনে হচ্ছে না। সমস্ত পরামর্শ জন্য ধন্যবাদ।

আমি বলব যে আমি সমস্ত পড়েছি, @ ড্যানিয়েল ম্যাগলিওলার বিওএম সম্পর্কে পরামর্শ সম্ভবত অন্য কোনও কম্পিউটারের সেরা উত্তর হতে পারে। তবে এটি এখনও আমার সমস্যার সমাধান করে না।


যেহেতু ইউটিএফ 8 সমর্থনটি ম্যাক বনাম উইন্ডোজ জুড়ে অসামঞ্জস্যপূর্ণ, তাই পুরোপুরি আলাদা একটি এনকোডিং ব্যবহার করা ভাল বেট। আমি সিপি 1252 পেয়েছি সাধারণত মাইক্রোসফ্ট স্টাফ সঙ্গে ভাল খেলা করে। en.wikipedia.org/wiki/Windows-1252
s29

1
বেন, এই প্রশ্নের সঠিক উত্তর আছে :) আমার দেখুন!
টিম গ্রিনিভেল্ড

7

এটি উইন্ডোজ এবং ম্যাক ওএস উভয়ের জন্যই এক্সেলে দুর্দান্ত কাজ করে।

এক্সেলে এমন বিষয়গুলি স্থির করুন যা ডায়াক্রিটিক্স, সিরিলিক বর্ণগুলি, গ্রীক চিঠি এবং মুদ্রার চিহ্নগুলি সহ অক্ষর প্রদর্শন করছে না।

function writeCSV($filename, $headings, $data) {   

    //Use tab as field separator
    $newTab  = "\t";
    $newLine  = "\n";

    $fputcsv  =  count($headings) ? '"'. implode('"'.$newTab.'"', $headings).'"'.$newLine : '';

    // Loop over the * to export
    if (! empty($data)) {
      foreach($data as $item) {
        $fputcsv .= '"'. implode('"'.$newTab.'"', $item).'"'.$newLine;
      }
    }

    //Convert CSV to UTF-16
    $encoded_csv = mb_convert_encoding($fputcsv, 'UTF-16LE', 'UTF-8');

    // Output CSV-specific headers
    header('Set-Cookie: fileDownload=true; path=/'); //This cookie is needed in order to trigger the success window.
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private",false);
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"$filename.csv\";" );
    header("Content-Transfer-Encoding: binary");
    header('Content-Length: '. strlen($encoded_csv));
    echo chr(255) . chr(254) . $encoded_csv; //php array convert to csv/excel

    exit;
}

এই সমাধানটি আমাকে গুগল শীটগুলির জন্যও রফতানি করার অনুমতি দেয় (কিছু অন্যান্য ব্যর্থ হয়েছিল)
ক্যাফন

6

সিএসভি ফাইল মাস্টে একটি বাইট অর্ডার চিহ্ন অন্তর্ভুক্ত রয়েছে।

বা প্রস্তাবিত এবং কর্মপরিকল্পনা হিসাবে কেবল এটি HTTP বডি দিয়ে প্রতিধ্বনিত হয়


4

যেহেতু ইউটিএফ 8 এনকোডিং এক্সেলের সাথে ভাল খেলছে না। আপনি ব্যবহার করে অন্য একটি এনকোডিং প্রকারে ডেটা রূপান্তর করতে পারেনiconv()

যেমন

iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $value),

এক্সেল ম্যাক ২০১১
ক্রিস্টার ফার্নস্ট্রোম

4

যোগ করুন

fprintf($file, chr(0xEF).chr(0xBB).chr(0xBF));

বা:

fprintf($file, "\xEF\xBB\xBF");

সিএসভি ফাইলে কোনও সামগ্রী লেখার আগে writing

উদাহরণ:

<?php
$file = fopen( "file.csv", "w");
fprintf( $file, "\xEF\xBB\xBF");
fputcsv( $file, ["english", 122, "বাংলা"]);
fclose($file);

3

ইতিমধ্যে utf-8 এনকোডযুক্ত পাঠ্যটি ব্যবহার করে রূপান্তর করার mb_convert_encodingদরকার নেই। মূল সামগ্রীর সামনে কেবল তিনটি অক্ষর যুক্ত করুন:

$newContent = chr(239) . chr(187) . chr(191) . $originalContent

আমার জন্য এটি সিএসভি ফাইলগুলিতে বিশেষ অক্ষরের সমস্যা সমাধান করেছে।


অবিশ্বাস্য; আমি ন্যূনতম 10 টি সমাধান সমাধান করার চেষ্টা করেছি এবং ইউটিএফ -8 বিওএম-এর মাধ্যমে সংযুক্ত হয়ে আমার পক্ষে একমাত্র সমাধানটি এটিই মনে হয় fputs
কর্টো

2

আমি যেমন তদন্ত করেছি এবং আমি দেখতে পেয়েছি যে ইউটিএফ -8 এমএসি এবং উইন্ডোজে ভাল কাজ করছে না তাই আমি উইন্ডোজ -১২২২ দিয়ে চেষ্টা করেছি, এটি উভয়ের পক্ষে ভাল সমর্থন করে তবে আপনাকে অবশ্যই উবুন্টুতে এনকোডিংয়ের ধরন নির্বাচন করতে হবে। এখানে আমার কোড$valueToWrite = mb_convert_encoding($value, 'Windows-1252');

$response->headers->set('Content-Type', $mime . '; charset=Windows-1252');
    $response->headers->set('Pragma', 'public');
    $response->headers->set('Content-Endcoding','Windows-1252');
    $response->headers->set('Cache-Control', 'maxage=1');
    $response->headers->set('Content-Disposition', $dispositionHeader);
    echo "\xEF\xBB\xBF"; // UTF-8 BOM

2
**This is 100% works fine in excel for both Windows7,8,10 and also All Mac OS.**
//Fix issues in excel that are not displaying characters containing diacritics, cyrillic letters, Greek letter and currency symbols.

function generateCSVFile($filename, $headings, $data) {

    //Use tab as field separator
    $newTab  = "\t";
    $newLine  = "\n";

    $fputcsv  =  count($headings) ? '"'. implode('"'.$newTab.'"', $headings).'"'.$newLine : '';

    // Loop over the * to export
    if (! empty($data)) {
      foreach($data as $item) {
        $fputcsv .= '"'. implode('"'.$newTab.'"', $item).'"'.$newLine;
      }
    }

    //Convert CSV to UTF-16
    $encoded_csv = mb_convert_encoding($fputcsv, 'UTF-16LE', 'UTF-8');

    // Output CSV-specific headers
    header('Set-Cookie: fileDownload=true; path=/'); //This cookie is needed in order to trigger the success window.
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private",false);
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"$filename.csv\";" );
    header("Content-Transfer-Encoding: binary");
    header('Content-Length: '. strlen($encoded_csv));
    echo chr(255) . chr(254) . $encoded_csv; //php array convert to csv/excel
    exit;
}

2
সাধারণত, উত্তরগুলি আরও কার্যকর হয় যদি সেগুলিতে কোডটি কী করা উচিত এবং কেন এটি অন্যকে পরিচয় করিয়ে না দিয়ে সমস্যার সমাধান করে তার ব্যাখ্যা অন্তর্ভুক্ত করে।
টিম ডিকম্যান

1

শুধু এক্সেল নিজেই আউটপুট আউট সম্পর্কে? এটি একটি দুর্দান্ত ক্লাস যা আপনাকে এক্সএলএস ফাইল সার্ভার-সাইড তৈরি করতে দেয়। আমি এটি ক্লায়েন্টদের জন্য ঘন ঘন ব্যবহার করি যারা সিএসভির "চিত্র বের করতে" পারে না এবং এখনও পর্যন্ত কোনও অভিযোগ করেনি। এটি কিছু অতিরিক্ত ফর্ম্যাটিং (শেডিং, রোহাইট, গণনা ইত্যাদি) এরও অনুমতি দেয় যা সিএসভি কখনও করবে না।


সচেতন থাকুন যে phpexcel এ লেগ পরিমাণে ডেটা নিয়ে সমস্যা রয়েছে।
এলার্ট ভ্যান কোপেরেন

1

আপনি আপনার সিএসভি স্ট্রিং আইকনভের সাথে রূপান্তর করতে পারেন । উদাহরণ স্বরূপ:

$csvString = "Möckmühl;in Möckmühl ist die Hölle los\n";
file_put_contents('path/newTest.csv',iconv("UTF-8", "ISO-8859-1//TRANSLIT",$csvString) );

দুর্দান্ত নমুনা পাঠ্য;)
এনজিেক

1

আপনাকে "উইন্ডোজ -১২২২" এনকোডিংটি ব্যবহার করতে হবে।

header('Content-Encoding: Windows-1252');
header('Content-type: text/csv; charset=Windows-1252');
header("Content-Disposition: attachment; filename={$filename}");

হতে পারে আপনাকে আপনার স্ট্রিং রূপান্তর করতে হবে:

private function convertToWindowsCharset($string) {
  $encoding = mb_detect_encoding($string);

  return iconv($encoding, "Windows-1252", $string);
}

1

রফতানির আগে আপনি ফাইলটিতে 3 বাইট যুক্ত করতে পারেন, এটি আমার পক্ষে কাজ করে। সিস্টেমটি করার আগে কেবল উইন্ডোজ এবং এইচপি-ইউএক্সে কাজ করে তবে লিনাক্সে ব্যর্থ হয়েছিল।

FileOutputStream fStream = new FileOutputStream( f );
final byte[] bom = new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF };
OutputStreamWriter writer = new OutputStreamWriter( fStream, "UTF8" );
fStream.write( bom );

ফাইলটির শুরুতে একটি ইউটিএফ -8 বিওএম (3 বাইট, হেক্স ইএফ বিবি বিএফ) রাখুন। অন্যথায় এক্সেল আপনার লোকেলের ডিফল্ট এনকোডিং (যেমন সিপি 1252) অনুযায়ী utf-8 এর পরিবর্তে ডেটাটি ব্যাখ্যা করবে

এক্সেলের জন্য সিএসভি ফাইল তৈরি করা হচ্ছে, কীভাবে কোনও মানের ভিতরে একটি নতুন লাইন থাকে


1

আমি ম্যাকের সাথে আছি, আমার ক্ষেত্রে আমাকে কেবল বিভাজকটি নির্দিষ্ট করে "sep=;\n"ইউটিএফ -16 এল-তে ফাইলটি এনকোড করতে হয়েছিল:

$data = "sep=;\n" .mb_convert_encoding($data, 'UTF-16LE', 'UTF-8');

1

আমার জন্য উপরের সমাধানগুলির কোনওটিই কাজ করেনি। সমস্যাটি সমাধান করার জন্য নীচে আমি কী করেছি: পিএইচপি কোডে এই ফাংশনটি ব্যবহার করে মানটি সংশোধন করুন:

$value = utf8_encode($value);

এই আউটপুটটি একটি এক্সেল শীটে সঠিকভাবে মূল্য দেয়।


0

যখন আমার কাছে এক্সেল ভিবিএ রুটিন ছিল যা ডেটা আমদানি করে তখন আমারও একই সমস্যা ছিল। যেহেতু সিএসভি একটি সরল পাঠ্য ফর্ম্যাট, তাই আমি ওয়ার্ডপ্যাডের মতো একটি সাধারণ ফাইল সম্পাদকটিতে ডেটাটি প্রোগ্রামোগ্রাফিকভাবে খোলার মাধ্যমে, এবং এটি ইউনিকোড পাঠ্য হিসাবে পুনরায় সংরক্ষণ করে বা সেখান থেকে ক্লিপবোর্ডে অনুলিপি করে এবং এটি এক্সেলের কাছে আটকানো দিয়ে কাজ করছিলাম। যদি এক্সেল স্বয়ংক্রিয়ভাবে সিএসভিগুলিকে কোষগুলিতে পার্স করে না, তবে এটি "টেক্সট টু কলামে টেক্সট" বৈশিষ্ট্যটি ব্যবহার করে সহজেই প্রতিকার করে।


আমি চেষ্টা করেছি! তবে এটি ইতিমধ্যে ইউনিকোড পাঠ্য হিসাবে এনকোড হয়েছে ... এটি ইউনিকোড পাঠ্য হিসাবে সংরক্ষণ করা কোনও পরিবর্তন করে না। বিশেষ চরিত্রের অকারণে ব্যাখ্যা না করে আমি কীভাবে এটি সরল পাঠ্য হিসাবে সংরক্ষণ করব?
বেন সাফলি

আমি মনে করি "এটিকে ইউনিকোড পাঠ্য হিসাবে সংরক্ষণ করে" আলেনের অর্থ হতে পারে "ইউটিএফ -16 এলই"। উইন্ডোজ প্রায়শই (দুঃখের সাথে) একটি লিডিং বিওএম সহ UTF-16LE বা UTF-16LE ভুলভাবে উল্লেখ করতে "ইউনিকোড" ব্যবহার করে। নোটপ্যাডের ফাইল -> সেভ কথোপকথন এইভাবে "ইউনিকোড" ব্যবহার করে।
থানাটোস

0

আপনি যখন এটি একটি টেক্সট ফাইল হিসাবে সংরক্ষণ করেন এবং সেগুলি ডিলিমিটার হিসাবে অবিচ্ছিন্নভাবে খুললে সমস্যাটি কি এখনও ঘটে?

সমস্যাটি একেবারেই এনকোডিং নাও হতে পারে, কেবলমাত্র এমনটি হতে পারে যে এক্সেল মান অনুযায়ী ফাইলটি কোনও সিএসভি নয়।


আমি যতদূর জানি, সিএসভি ফর্ম্যাটিং ঠিক আছে। আমি টেক্সটএইডিতে একটি "নিখুঁত" সিএসভি তৈরি করতে পারি, কোনও সমস্যা নেই, বা এমনকি সিএসভি হিসাবে একটি টেক্সটটির নাম পরিবর্তন করতে পারি, যাতে এটি কোনও গোপন অনুপস্থিত না - সিএসভিগুলি কেবল পাঠ্য ফাইল। এছাড়াও, বিন্যাসটি এক্সেলের মধ্যে সমস্ত নিখুঁত, এটি কেবলমাত্র বিশেষ অক্ষরগুলি ভেঙে দেয়। তবে কেবলমাত্র আমি আপনার পরামর্শটি চেষ্টা করেছি এবং দুঃখের সাথে একই সমস্যা তৈরি করছে producing
বেন সাফলি

"ডাব্লুটিএফ থেকে তারা কি চিন্তা করছিল" বিভাগীয়: মাইক্রোসফ্ট অনুসারে সঠিক ক্ষেত্র বিভাজক লোকাল নির্ভর dependent একটি 'কমা-বিচ্ছিন্ন' ফাইলের জন্য কিছু লোকেলগুলিতে ক্ষেত্রগুলিকে প্রকৃত অর্ধিকোলন-বিচ্ছিন্ন করার প্রয়োজন হতে পারে - এবং ওপেন অফিসের পরামর্শ ছাড়া কিছুই করতে পারে না
djn

এটি বেশ ক্রেজি - দুর্ভাগ্যক্রমে ক্ষেত্রগুলি যথাযথভাবে সীমাবদ্ধ করতে আমার সমস্যা হচ্ছে না। এই বিশেষ চরিত্রগুলি নিয়ে আমার কেবল সমস্যা হচ্ছে।
বেন সাফলি

0

এই পোস্টটি বেশ পুরানো, তবে কয়েক ঘন্টা চেষ্টা করার পরেও আমি আমার সমাধানটি ভাগ করতে চাই ... সম্ভবত এটি এক্সেল এবং ম্যাক এবং সিএসভি নিয়ে কাজ করে এমন কাউকে সহায়তা করে এবং এই হুমকির জন্য হোঁচট খায়। আমি এক্সেল ব্যবহারকারীদের কথা মাথায় রেখে ডাটাবেস থেকে আউটপুট হিসাবে গতিশীলভাবে একটি সিএসভি তৈরি করছি। (বিওএম সহ ইউটিএফ -8)

আমি প্রচুর আইকনভের চেষ্টা করেছি কিন্তু ম্যাক এক্সেল 2004 এ জার্মান আমলাতরা কাজ করতে পারছি না One একটি সমাধান: পিএইপপিএক্সেল। এটি দুর্দান্ত তবে আমার প্রকল্পের জন্য কিছুটা বেশি। আমার জন্য যা কাজ করে তা সিএসভি ফাইল তৈরি করে এই সিএসভি ফাইলটিকে এই পিএইচপিএসনিপেট: সিএসভি 2 এক্সএলস দ্বারা এক্সএলএস এ রূপান্তর করে । এক্সএল এক্সএল এক্সেল জার্মান আমলাউটের সাথে কাজ করে (ä, ö, Ü, ...)।


0

আমি এই শিরোলেখগুলি কেবল চেষ্টা করেছি এবং একটি বিশেষ উইন্ডোজ 7 পিসিতে বিশেষ অক্ষর সহ সিএসভি ফাইলটি সঠিকভাবে আমদানি করতে এক্সেল 2013 পেয়েছি। বাইট অর্ডার মার্ক (বিওএম) চূড়ান্ত কী যা এটি কার্যকর করেছিল।

    শিরোনাম ('সামগ্রী-এনকোডিং: ইউটিএফ -8');
    শিরোনাম ('বিষয়বস্তুর ধরণ: পাঠ্য / সিএসভি; চরসেট = ইউটিএফ -8');
    শিরোনাম ("বিষয়বস্তু-স্বভাব: সংযুক্তি; ফাইলের নাম = ফাইলের নাম। সিএসভি");
    শিরোনাম ("প্রগমা: সর্বজনীন");
    শিরোনাম ("মেয়াদ শেষ: 0");
    প্রতিধ্বনি "\ xEF \ xBB \ xBF"; // ইউটিএফ -8 বিওএম


হ্যাঁ, যে সঠিক, এটি সঠিকভাবে Windows এর জন্য Excel এ কাজ করবে, কিন্তু আমার উত্তর ব্যাখ্যা, এটা OS X এর জন্য এক্সেল কাজ করবে না
টিম Groeneveld

0

অন্যথায় আপনি করতে পারেন:

header("Content-type: application/x-download");
header("Content-Transfer-Encoding: binary");
header("Content-disposition: attachment; filename=".$fileName."");
header("Cache-control: private");

echo utf8_decode($output);

0

ম্যাক এক্সেল ২০০ for এর জন্য সহজ সমাধান: আমি এই অনেক সময় ধরে লড়াই করেছি, তবে এখানে আমার সহজ সমাধানটি ছিল: টেক্সটরঙ্গলারের মধ্যে .csv ফাইলটি খুলুন যা আপনার ইউটিএফ -8 অক্ষর সঠিকভাবে খুলতে হবে। এখন নীচের স্ট্যাটাস বারে "ইউনিকোড (ইউটিএফ -8)" থেকে "ওয়েস্টার্ন (আইএসও ল্যাটিন 1)" এ ফাইল ফর্ম্যাটটি পরিবর্তন করুন এবং ফাইলটি সংরক্ষণ করুন। এখন আপনার ম্যাক এক্সেল ২০০৮ এ যান এবং ফাইল> আমদানি> সিএসভি নির্বাচন করুন> আপনার ফাইল সন্ধান করুন> ফাইল উত্সে "উইন্ডোজ (এএনএসআই)" নির্বাচন করুন এবং ইউটিএফ -8 অক্ষরটি সঠিকভাবে প্রদর্শিত হচ্ছে তা বেছে নিন। অন্তত এটা আমার জন্য না...


0

আমি এটি ব্যবহার করি এবং এটি কাজ করে

header('Content-Description: File Transfer');
header('Content-Type: text/csv; charset=UTF-16LE');
header('Content-Disposition: attachment; filename=file.csv');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
// output headers so that the file is downloaded rather than displayed
// create a file pointer connected to the output stream
$output = fopen('php://output', 'w');
fputs( $output, "\xEF\xBB\xBF" );
// output the column headings
fputcsv($output, array('Thông tin khách hàng đăng ký'));
// fetch the data
$setutf8 = "SET NAMES utf8";
$q = $conn->query($setutf8);
$setutf8c = "SET character_set_results = 'utf8', character_set_client =
'utf8', character_set_connection = 'utf8', character_set_database = 'utf8',
character_set_server = 'utf8'";
$qc = $conn->query($setutf8c);
$setutf9 = "SET CHARACTER SET utf8";
$q1 = $conn->query($setutf9);
$setutf7 = "SET COLLATION_CONNECTION = 'utf8_general_ci'";
$q2 = $conn->query($setutf7);
$sql = "SELECT id, name, email FROM myguests";
$rows = $conn->query($sql);
$arr1= array();
if ($rows->num_rows > 0) {
// output data of each row
while($row = $rows->fetch_assoc()) {
    $rcontent = " Name: " . $row["name"]. " - Email: " . $row["email"];  
    $arr1[]["title"] =  $rcontent;
}
} else {
     echo "0 results";
}
$conn->close();
// loop over the rows, outputting them
foreach($arr1 as $result1):
   fputcsv($output, $result1);
endforeach;

0

# পিএইচপি-তে এমন একটি ইউটিএফ -8 সিএসভি আউটপুট করুন যা এক্সেলটি সঠিকভাবে পড়বে।

//Use tab as field separator   
$sep  = "\t";  
$eol  = "\n";    
$fputcsv  =  count($headings) ? '"'. implode('"'.$sep.'"', $headings).'"'.$eol : '';

জনপ্রতি একটি উত্তর যথেষ্ট। ভবিষ্যতে মনে রাখবেন যে কোনও সময় আপনি নিজের উত্তরে তথ্য যুক্ত করতে পারেন, আপনাকে 2 তৈরি করতে হবে না
রিগসফলি

-1
//convert UTF-8 file without BOM to UTF-16LE for excel on mac
$fileUtf8String = file_get_contents("file.ext");
file_put_contents("file.ext", "\xFF\xFE" . mb_convert_encoding($fileUtf8String, "UTF-16LE", "UTF-8"));

এই প্রশ্নটি রূপান্তর কীভাবে জিজ্ঞাসা করে না, এটি আউটপুট কীভাবে তা জিজ্ঞাসা করে। এই অবদানের প্রাসঙ্গিক অংশটি ইউটিএফ -১ in এ আউটপুট প্রদান ইতিমধ্যে নির্বাচিত উত্তরে অবদান রয়েছে ।
বেন সাফলে

@ বেনসোফলে ঠিক আছে তবে এটি দুটি সাধারণ লাইন কোডের মাধ্যমে প্রশ্নের সমস্যা সমাধান করে
বি3উইই

প্রশ্নটি ইতিমধ্যে সমাধান করা হয়েছে এবং আরও ভালভাবে ব্যাখ্যা করা হয়েছে।
বেন সাফলে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.