איך ליצור קובץ CSV תקין בעברית בעזרת PHP
נתקלתי בזמן האחרון במקרה שהייתי צריך ליצור קובץ CSV עבור הורדת נתונים באתר אינטרנט. כעקרון יש מספר אפשרויות, אני בחרתי לקחת אחת מסיבות מסוימות (אין טעם לפרט), אך נתקלתי במספר בעיות, לכן החלטתי לשתף איך ליצור קובץ CSV בעברית תקין ללא בעיות קידוד.
What You'll Need
- PHP
- CSV
- HEBREW CSV
- יצוא קובץ
Tips
כעקרון יש אפשרויות נוספות, העצה שלי היא שאם אתם צריכים עברית ל CSV השתשמו ב fwrite() ולא ב fputcsv. חשוב לזכור כמו שרשמתי למעלה שקובץ CSV תומך בקידוד אחד - windows-1255.
Steps
- 1
Step 1
לאחרונה נתקלתי בבעיה ליצור קובץ CSV שתומך בעברית. עברתי על רוב הפתרונות המוצעים בגוגל שכוללים בניהם שימוש ב fputcsv וכל מיני תוספים שונים. בסופו של דבר הבנתי שעדיף פשוט להשתמש ב fwrite עם מספר תוספים שמצאתי בחיפושים… חשוב: לא לשכוח להשתמש ב ()utf2heb בייצוא הקובץ. להשתמש ב fwrite ולא ב fputcsv - 2
Step 2
replace utf8 to windows1255 (CSV Files does NOT support utf8) function utf2heb($val) { return iconv("UTF-8","WINDOWS-1255",html_entity_decode($val,ENT_COMPAT,'utf-8')); } $filename=YOUR FILE; function csv($res) { global $filename $fp = fopen($filename, 'w+b'); $str="תא 1,תא 2,תא 3\r\n"; # צריך לשים לב שמשתמשים ב \r\n ולא \n בגלל שמשתמשים ב csv. fwrite($fp,$str); foreach ($res as $line) { $str=""; foreach($line as $key=>$val) $str.="$val,"; fwrite($fp,substr($str,0,-1)."\r\n"); # הורדתי את הפסיק האחרון.... ואז צריך לרדת שורה } fclose($fp); } - 3
Step 3
עכשיו אחרי שיצרנו את הקובץ, אפשר גם לתת את האופציה להוריד אותו בלחיצה על כפתור כלשהו…. - 4
Step 4
if (isset($_POST['submit'])) { global $filename; csv($res); $out=file_get_contents("{$filename}"); // נוציא את הקובץ למחרוזת header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Content-Length: " . strlen($out)); // Output to browser with appropriate mime type, you choose ;) header("Content-type: text/x-csv; charset=windows-1255"); //header("Content-type: application/csv"); header("Content-Disposition: attachment; filename={$filename}"); echo utf2heb($out); // פה החלק הקריטי, צריך להשתמש ב utf2heb בכדיי להפוך את כל הטקסט ל windows-1255 exit(); }