PDA

View Full Version : سوال: مشکل حروف فارسی در خروجی CSV



پیام حیاتی
چهارشنبه 27 مرداد 1395, 15:19 عصر
سلام
این کدهای بنده :


<?php
mysql_connect('localhost', 'root', '');
mysql_select_db('school');
mysql_query('set names "utf8"');


// output headers so that the file is downloaded rather than displayed
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=data.csv');


// create a file pointer connected to the output stream
$output = fopen('php://output', 'w');


// output the column headings
fputcsv($output, array('Column 1', 'Column 2', 'Column 3'));


// fetch the data


$rows = mysql_query('SELECT * FROM student');


// loop over the rows, outputting them
while ($row = mysql_fetch_assoc($rows)) fputcsv($output, $row);


?>

عبارت های فارسی :

142020

اگر از کد :


mysql_query('set names "utf8"');

قبل از کوئری یا کد انتخاب بانک استفاده کنم ، نتیجه :

142021

در صفحه تگ متا utf-8 موجوده و کالکشن بانک و جدول هم بر همین اساس ایجاد شده است.

Unique
پنج شنبه 28 مرداد 1395, 00:55 صبح
این پست من (http://www.geekfarsi.com/%D8%AE%D8%B1%D9%88%D8%AC%DB%8C-csv-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-excel-%D8%AF%D8%B1-php/59) را بخون مشکلت حل میشه.

پیام حیاتی
پنج شنبه 28 مرداد 1395, 02:22 صبح
این پست من (http://www.geekfarsi.com/%D8%AE%D8%B1%D9%88%D8%AC%DB%8C-csv-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-excel-%D8%AF%D8%B1-php/59) را بخون مشکلت حل میشه.
تشکر ، شما با فایل txt انجام دادید ، من نتونستم از طریق اون کدهای خودم رو بهینه کنم لطفا اگر امکانش هست کدهای بنده رو اصلاح کنید.
تشکر

aaaaaaaa1
جمعه 29 مرداد 1395, 13:56 عصر
سلام
بنده برای یکی از پروژه هام نیاز به همین خروجی داشتم
مشکلم با جستجو در نت حل شد
الان دسترسی بهدکد ها ندارم.
وگرنه برلتون قرار میدادم
در فروم های خارجی جستجو کنید موجوده

پیام حیاتی
جمعه 29 مرداد 1395, 17:57 عصر
سلام
بنده برای یکی از پروژه هام نیاز به همین خروجی داشتم
مشکلم با جستجو در نت حل شد
الان دسترسی بهدکد ها ندارم.
وگرنه برلتون قرار میدادم
در فروم های خارجی جستجو کنید موجوده
جستجو کردم عزیز در انجمن های مختلف از جمله Stack مطرح کردم.اینجا (http://stackoverflow.com/questions/39011117/dont-show-persian-correct-in-export-csv-use-php)
بیش از دو هفته است این مشکل رو در سایت ها و انجمن های مختلف پیگیری می کنم.انجمن دیگر (http://forum.barnamenevis.ir/Thread-%D9%85%D8%B4%DA%A9%D9%84-%D8%AF%D8%B1-%D8%AE%D8%B1%D9%88%D8%AC%DB%8C-%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA-%D8%A8%D8%A7%D9%86%DA%A9-%D8%A8%D8%A7-%D9%81%D8%B1%D9%85%D8%AA-CSV)
برای دات نت در همین انجمن.اینجا (http://barnamenevis.org/showthread.php?528735-%D9%85%D8%B4%DA%A9%D9%84-%D8%AF%D8%B1-%D8%AE%D8%B1%D9%88%D8%AC%DB%8C-%D8%A8%D8%A7-%D9%81%D8%B1%D9%85%D8%AA-%D8%A7%DA%A9%D8%B3%D9%84-%D8%8C-%D8%B9%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA-%D9%86%D8%A7%D9%85%D9%81%D9%87%D9%88%D9%85-%D8%A8%D9%87-%D8%AC%D8%A7%DB%8C-%D8%B9%D8%A8%D8%A7%D8%B1%D8%AA-%D9%87%D8%A7%DB%8C-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C)
مانده ام این همه پروژه فارسی انجام شده ، دارای قسمت گزارش گیری نیستند!!
با آموزشگاه های فنی و حرفه ای و انیستیتو ایز هم تماس گرفتم جهت ارائه کلاس خصوصی فقط برای گزارش گیری ، اما یا پیچوندن یا گفتن فقط طبق سرفصل های آموزش میدیم!
متاسفانه راه کار اساسی وجود ندارد مثل اینکه و ما همچنان پیگیر...

Unique
جمعه 29 مرداد 1395, 23:13 عصر
شما با فایل txt انجام دادید ، من نتونستم از طریق اون کدهای خودم رو بهینه کنم
دوست عزیز من اطلاعات ورودیم متنیه ! چه ربطی داره !؟ میخوای با Sqlite برات بگذارم !؟


متاسفانه راه کار اساسی وجود ندارد مثل اینکه و ما همچنان پیگیر...
به نظرم مشکل از خودتونه ! کاری که میخوای بکنی خیلی پیش پا افتاده هستش !!!! اصل مشکل توی Excel همین حماقتش در استفاده از UTF16LE به جای UTF-8 هست ! مثلا LibreOffice خیلی راحت تشخیص میده ! من از همین کد ۱۰۰ ها جا استفاده کردم و براحتی کار کرده ! متاسفانه من نمیتونم کد شما را ویرایش کنم ! یعنی اصلا وقتشو ندارم . توی وبلاگ یک نمونه کد خیلی واضح گذاشتم ! فقط باید مطمئن بشی از اطلاعات ورودیت فارسی باشه ! و مثلا از Encoding دیگه مثل Windows-1256 نباشه !

پیام حیاتی
شنبه 30 مرداد 1395, 03:09 صبح
دوست عزیز من اطلاعات ورودیم متنیه ! چه ربطی داره !؟ میخوای با Sqlite برات بگذارم !؟


به نظرم مشکل از خودتونه ! کاری که میخوای بکنی خیلی پیش پا افتاده هستش !!!! اصل مشکل توی Excel همین حماقتش در استفاده از UTF16LE به جای UTF-8 هست ! مثلا LibreOffice خیلی راحت تشخیص میده ! من از همین کد ۱۰۰ ها جا استفاده کردم و براحتی کار کرده ! متاسفانه من نمیتونم کد شما را ویرایش کنم ! یعنی اصلا وقتشو ندارم . توی وبلاگ یک نمونه کد خیلی واضح گذاشتم ! فقط باید مطمئن بشی از اطلاعات ورودیت فارسی باشه ! و مثلا از Encoding دیگه مثل Windows-1256 نباشه !
در فایل نمونه شما منبع فایل txt هست نه جدول بانک!
من نگفتم کارم حرفه ای ! ادعایی هم نکردم!
از اون ۱۰۰ جایی که استفاده کردید یک نمونش رو میتونستید قرار بدید!
وقتشو ندارید کلا پاسخ ندید به سوالات پیش پا افتاده ،سنگین ترید!

پیام حیاتی
یک شنبه 31 مرداد 1395, 01:44 صبح
بالاخره مشکل با راهنمایی استاد شهرکی عزیز برطرف شد، کدهای فوق مشکلی ندارند و به راحتی در اکسل نمایش داده می شوند فقط اسکریپتتون باید با کدگذاری UTF-8-BOM ذخیره شده باشه.

142079

نتیجه :

142080

توضیحات و نمونه کد بیشتر :
http://forum.barnamenevis.ir/Thread-%D9%85%D8%B4%DA%A9%D9%84-%D8%AF%D8%B1-%D8%AE%D8%B1%D9%88%D8%AC%DB%8C-%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA-%D8%A8%D8%A7%D9%86%DA%A9-%D8%A8%D8%A7-%D9%81%D8%B1%D9%85%D8%AA-CSV-%D8%AD%D9%84-%D8%B4%D8%AF

nokhodi
یک شنبه 31 مرداد 1395, 08:39 صبح
من اینکارو هم انجام دادم اما همچنان ???? خروجی میده!!! اینجا (http://barnamenevis.org/showthread.php?528709-%D8%B9%D8%AF%D9%85-%D9%86%D9%85%D8%A7%DB%8C%D8%B4-%D9%81%D9%88%D9%86%D8%AA-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%D8%9F%D8%9F%D8%9F%D8%9F-(-%D8%AA%D9%85%D8%A7%D9%85-%D8%B1%D8%A7%D9%87-%D8%AD%D9%84-%D9%87%D8%A7-%D8%AA%D8%B3%D8%AA-%D8%B4%D8%AF%D9%87-%D8%A7%D9%85%D8%A7-))

Unique
سه شنبه 02 شهریور 1395, 01:28 صبح
در فایل نمونه شما منبع فایل txt هست نه جدول بانک!
هیچ فرقی نداره ! وقتی Data از نوع utf-8 باشه مهم نیست از فایل txt فراخونی میکنی یا mysql.


من نگفتم کارم حرفه ای ! ادعایی هم نکردم!
منم نگفتم شما چنین ادعایی کردین ! گفتم مشکل از سورس کد خودتونه !


از اون ۱۰۰ جایی که استفاده کردید یک نمونش رو میتونستید قرار بدید!
من سورس کد را گذاشتم ! فرض بر این هست که کاربر میدونه چطوری اطلاعات فارسی را توی mysql درج کنه و بخونه !


وقتشو ندارید کلا پاسخ ندید به سوالات پیش پا افتاده ،سنگین ترید!
سوال پیش پا افتاده نیست. موضوعی که اشاره میکنید راه حل اساسی نداره پیش پا افتاده هست!
در مورد وقت هم کلا تا جایی که من میدونم توی انجمن کمتر پیش میاد کسی کد بگداره. یا کد ویرایش کنه. معمولا راهنمایی در حد تغییر یا اضافه کردن چند خط کد هست و بس.


بالاخره مشکل با راهنمایی استاد شهرکی عزیز برطرف شد، کدهای فوق مشکلی ندارند و به راحتی در اکسل نمایش داده می شوند فقط اسکریپتتون باید با کدگذاری UTF-8-BOM ذخیره شده باشه.
قراردادن BOM برای فایل PHP نه تنها هیچ تاثیری در فایل خروجی CSV دانلود شده نداره ! بلکه BOM روی لینوکس قبل از تابع header خطای Headers Already Sent میده و توابع مربوط به Header شما کلا ارسال نمیشه.

پی نوشت : البته اگه BOM را توی خروجی ارسال کنین که توی فایل CSV درج بشه و Excel بتونه تشخیص بده اونوقت میتونه نتیجه بده اما بعید میدونم مایکروسافت توی نسخه های جدید Office تشخیص Encoding را اضافه کرده باشه و باید بهش بفهمونی ! حتی وقتی نمیتونه تشخیص بده نمیپرسه از چه Encoding ی استفاده کنم !

راستی لینکی که نوشتین توضیحات بیشتر هم خطای ۴۰۴ میده.

Unique
سه شنبه 02 شهریور 1395, 03:17 صبح
با اینکه اصلا وقتش را نداشتم وساعت ۳:۳۰ دقیقه صبح دارم اینو براتون میفرستم ! اما اشکال نداره. حداقل دعاش را به جون ما بکنید اگه مشکلتون حل میشه.

دوست عزیز ،‌توی ویندوز و نرم افزار های Office کلا Default Encoding به صورت پیش فرض UTF-16LE هست. واگه بخوای توی باز کردن فایل ها به مشکل نخوری باید اطلاعات را بر اساس این Encoding ذخیره کنی. اما علت اینکه جواب نمیگیری چند تا چیز میتونه باشه :

۱ - کلا مقادیرت توی پایگاه داده به فارسی نیست یا خروجی را فارسی به utf-8 نمیگیری !
۲ - وقتی از تابع fputcsv استفاده میکنی و میخوای مقادیر را utf16le ذخیره کنی نباید تبدیل را توی تابع انجام بدی چون Delimiter و End Of Line و غیره به utf-8 برگشت داده میشوند !
۳ - من با Delimiter ی غیر از TAB جواب نگرفتم. پس حتما از t\ استفاده کن.

من خیلی وقته از ویندوز و Office کلا استفاده نمیکنم و آخرین تجربه من مربوط به Excel 2007 بوده ! البته فایل های utf-16le قطعا توی نسخه های جدید هم به خوبی کار میکنند اما ممکنه مایکروسافت مشکل عدم تشخیص صحیح utf-8 را توی نسخه های بعد از ۲۰۰۷ حل کرده باشه که قطعا نمیتونی روی این حساب کنی که همه نسخه های جدیدتر Office را دارن ! پس لقمه را دور سرت نچرخون و تبدیل کن تا خیالت راحت باشه.

برای اینکه خیالت راحت بشه من نسخه های آنلاین Sample و Source و Database را برات میگذارم تا خودت تست کنی.

http://www.geekfarsi.com/downloads/csv-export.zip
http://geekfarsi.com/samples/csv-export/list.php
http://geekfarsi.com/samples/csv-export/export.php

من نمیدونم آقای شهرکی به شما چی گفته اما باز هم میگم که عوض کردن BOM فایل PHP قطعا راه حل درستی نیست (حتی برات مشکل پیش میاره) و ممکنه کلا موضوع را به شما اشتباه گفتند ! حیف نیستند ببینیم منظورشون چی بوده.

پی نوشت : راستی چرا از mysql Library استفاده میکنید ؟! آخه توی PHP7 که دیگه پشتیبانی نمیشه و توی نسخه های آخر 5 هم کلا Depricate شده. بهتره از mysqli یا PDO استفاده کنید. من توی مثال از mysqli استفاده کردم.

موفق باشی

پیام حیاتی
سه شنبه 02 شهریور 1395, 13:11 عصر
ممنون از راهنمایی ، نمونه کدها و زمانی که قرار دادید.
متاسفانه من هر طور می خوام لینک رو قرار بدم در پست ، لینک صحیح قرار نمی گیرد؟!
f o r u m .n c i s . i r
دو نکته اشاره کردن این که این دو خط رو بعد از انتخاب دیتابیس قرار بدم :


mysql_set_charset('utf8');
mysql_query("SET NAMES UTF8");


و اینکه باید فایل اسکریپت با کدگذاری UTF-8 without BOM ذخیره شده باشه.
ولی مورد دوم با UTF-8-BOM ذخیره کردم که جواب داد.

تمامی collaction های مربوط به جداول و بانک هم بر اساس utf8_persian_ci ایجاد شدند.
--------------------------------------------------------------------------------------------------------
بنده در php مبتدی هستم و زمان تقریبا" زیادی رو صرف دات نت کردم ، بعد از یادگیری مفاهیم مقدماتی دارم سعی می کنم پروژه هایی که در دات نت انجام دادم رو به قسمت های کوچکتر تقسیم کنم و نحوه کار آنها در php را فرا بگیرم (خروجی ها ، پنل مدیریت ، سطوح دسترسی و ...).در اکثر آموزش های یوتیوب از mysql استفاده کرده اند ، به همین خاطر تمرینات رو با این کتابخانه انجام می دم اما قطعا جهت استفاده در پروژه های غیر تمرینی از mysqli یا PDO استفاده خواهم کرد.
--------------------------------------------------------------------------------------------------------
خیلی دوست داشتم php رو با لینوکس شروع کنم اما بعد از مدتی کار با نسحه اوبونتو 16.4 من زده شدم.
من در ویندوز با نصب wamp یا xamp شروع به کدنویسی و تمرین می کنم اما در اوبونتو با دستورات خط های فرمان موجود در نت برای نصب php و mysql زمان زیادی رو از دست می دادم ، دستور را وارد می کردم apache نصب می شد و بعد نوبت php که پیام های خطا داشتم حالا باید جستجو می کردم برای رفع این خطاها و بعد نوبت نصب mysql و سر و کله زدن با خطاهای نصب بود... .:اشتباه:

Unique
چهارشنبه 03 شهریور 1395, 10:27 صبح
mysql_set_charset('utf8');
mysql_query("SET NAMES UTF8");

این دو خط برای اینه که اتصالت به mysql با utf-8 باشه و مقادیر درج شده و خونده شده را به utf8 بگیری. توی mysqli با خط زیر یکیه.

$db->set_charset("utf8");


و اینکه باید فایل اسکریپت با کدگذاری UTF-8 without BOM ذخیره شده باشه.
ولی مورد دوم با UTF-8-BOM ذخیره کردم که جواب داد.

حالا شد ، ایشون گفتن بدون BOM که این درسته! ، اینکه شما با BOM نتیجه گرفتی دو تا نکته داره :
۱ - روی ویندوز BOM خطا نمیده اما روی لینوکس اینطور نیست و خطای Headers Already Sent میگیری. توجه داشته باشه بهترین نتیجه را روی سرور های لینوکسی میگیری و نه ویندوزی.
۲ - راستش همونظور که گفتم BOM گذاشتن روی فایل PHP تاثیری نداره مگه اینکه مقدارش را روی CSV ذخیره کنه و MS Excel هم توی نسخه شما تشخیص بده فایل UTF8 هست. (از چه نسخه Excel استفاده میکنی ؟! میشه روی MS Excel 2007 فایلت را تست کنی خبرش را بدی ؟ چون من اطمینان دارم Excel با utf8 مشکل داره و تشخیصش نمیده)


بنده در php مبتدی هستم و زمان تقریبا" زیادی رو صرف دات نت کردم
من هم زمان زیادی نزدیک به ۸ سال با Net. کار کردم ولی الان ۵ سالی میشه کلا به PHP اومدم و به عنوان شغل اصلی کار وب میکنم. نمیدونم چرا PHP را انتخاب کردی اما قطعا پشیمون نمیشی ! فقط توصیه میکنم روی یکی کامل تمرکز کنی. نمیگم بلد بودن چند تا تکنولوژی بده اما کلا همه کاره هیچ کارست !


خیلی دوست داشتم php رو با لینوکس شروع کنم اما بعد از مدتی کار با نسحه اوبونتو 16.4 من زده شدم.
کلا PHP مستقل از سکو هست و همه جا میشه ازش استفاده کرد.
در مورد اوبونتو راستش خودم دارم از 16.04 استفاده میکنم الان ۳ سالی میشه کامل اومدم روی لینوکس و توزیع اوبونتو. نمیدونم چرا زده شدی چون هر کسی دلایل خوشد را داره و دوستی را میشناسم که فقط به خاطر Game ویندوز را انتخاب میکنه و Steam هم راضیش نمیکنه ! اما من همیشه میگم زمانی میتونی بگی لینوکس و یکی از توزیع هاش خوب نیست که حداقل ۵۰ درصد زمانی که صرف یادگیی و آزمون و خطا توی ویندوز کردی توی لینوکس هم انجام بدی.

من توی وبلاگم در مورد لینوکس زیاد مینویسم و فکر میکنم پست های زیر برات جالب باشن و مشکلاتت را حل کنن :

مجموعه پست کامل من در مورد مهاجرت یک برنامه نویس وب به لینوکس:
http://www.geekfarsi.com/%DA%86%D8%B1%D8%A7-%DB%8C%DA%A9-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3-%D9%88%D8%A8-%D8%A8%D8%A7%DB%8C%D8%AF-%D8%A8%D9%87-%D9%85%D9%87%D8%A7%D8%AC%D8%B1%D8%AA-%D8%A8%D9%87/79
مهاجرت من :
http://www.geekfarsi.com/%D9%85%D9%87%D8%A7%D8%AC%D8%B1%D8%AA-%D9%85%D9%86-%D8%A7%D8%B2-%D9%88%DB%8C%D9%86%D8%AF%D9%88%D8%B2-%D8%A8%D9%87-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3/28

انتخاب لپ تاپ مناسب :
http://www.geekfarsi.com/%D8%A7%DA%AF%D8%B1-%D9%82%D8%B5%D8%AF-%D9%85%D9%87%D8%A7%D8%AC%D8%B1%D8%AA-%D8%A8%D9%87-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3-%D8%B1%D8%A7-%D8%AF%D8%A7%D8%B1%DB%8C%D9%86-%D8%AF%D8%B1-%D8%B2%D9%85%D8%A7/298

توی این انجمن هم بحث های خوبی در موردش شده که توصیه میکنم بخونیش :
http://barnamenevis.org/showthread.php?472805-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3-%D8%A8%D8%AC%D8%A7%DB%8C-%D9%88%DB%8C%D9%86%D8%AF%D9%88%D8%B2-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D9%88-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%B3%D8%A7%DB%8C%D8%AA-%DA%86%D9%87-%D9%85%D8%AD%D8%AF%D9%88%D8%AF%DB%8C%D8%AA%D9%87%D 8%A7%DB%8C%DB%8C-%D8%AF%D8%A7%D8%B1%D8%AF%D8%9F

http://barnamenevis.org/showthread.php?483505-%DA%86%D8%B1%D8%A7-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3-%D9%81%D9%82%D8%B7-%D8%A8%D8%B1%D8%A7%DB%8C-php-%D8%AE%D9%88%D8%A8-%D8%A7%D8%B3%D8%AA%D8%9F(%D8%A2%D9%86-%D9%87%D9%85-%D8%AC%D8%A7%DB%8C-%D8%A8%D8%AD%D8%AB-%D8%AF%D8%A7%D8%B1%D8%AF)

موفق باشی