2013-07-11 2 views
4

В MySQL я установил свой тип поля данных utf8_bin, и я храню данные в Unicode. Тексты отображаются на веб-страницах правильно.PHP экспорт CSV, когда данные имеют UTF8 charcters

Я хочу сгенерировать файл excel, экспортирующий данные из моей таблицы в него. Выходной сигнал в .xls и .cvs - - «????».

Я извлекаю другие ответы здесь, его были передан использовать заголовки:

header("content-type:application/csv;charset=UTF-8");

similar question. Но это не работает. После использования заголовка в csv Output будет - à¤¸à ¥, ठ° à ¥ या.

Пожалуйста, помогите. Благодарю.

+0

Используйте заголовок спецификации –

+0

@Mark Baker да, я прочитал об этом в некоторых сообщениях, но я не уверен, как его использовать. Вы можете помочь. – Sajal

+0

Прежде чем вывести какие-либо данные в файл, напишите «\ xEF \ xBB \ xBF» в файл ...он также может помочь написать строку «sep =» после спецификации и перед данными (или соответствующим символом, если вы не используете запятую), поскольку разделитель по умолчанию MS Excel имеет специфику для локали –

ответ

15

Это сообщение решить мою проблему -

https://stackoverflow.com/a/4762708/2349494

И это то, что сделал преобразование -

печати CHR (255). chr (254). mb_convert_encoding ($ csv_output, 'UTF-16LE', 'UTF-8');

Раньше я получал символы мусора, теперь правильные данные экспортируются.

+0

Да, работал на меня! –

+0

Обратите внимание, что полученный csv будет в два раза больше размера UTF8. Небольшая цена за очень легкое решение волосатой проблемы, которая долгое время преследовала многих людей! –

+0

Небольшой вывод, который я хотел бы добавить здесь, если вы делаете tsv, а не csv, тогда добавьте \ t, используя двойные кавычки "", а не одинарные кавычки '' –

0

Попробуйте ввести код;

ob_end_clean(); 
$_filename = date('Y_m_d_H_i').".csv"; 

header("Cache-Control: public"); 
header("Content-Type: application/octet-stream"); 
header("Content-Type: text/csv; charset=utf-8"); 
header("Content-Disposition: attachment; filename=$_filename"); 
// Read the file from disk 
readfile($filename); 
exit(); 
+0

@ AshwinP - не работает yar :( – Sajal

+0

Пожалуйста, обратитесь к этому http://stackoverflow.com/questions/4348802/how-can-i-output-a-utf-8-csv-in-php-that-excel- will-read-correct? rq = 1' –

11

У меня была такая же проблема, и я сделал это, объединив две вещи:

во-первых, вы должны изменить таблицу сопоставления в UTF8, например: «utf8_general_ci» (или просто убедиться в том, что), то добавить этот код после запроса MySQL:

mysql_query("SET NAMES utf8"); 

Как

$result = mysql_query("SHOW COLUMNS FROM table WHERE Field NOT IN ('user_id', 'password')"); 
mysql_query("SET NAMES utf8"); 

а затем используйте это как он Адер (адаптируются с вашими потребностями):

header('Content-Description: File Transfer'); 
header("Content-type: application/vnd.ms-excel"); 
header("Content-disposition: csv" . date("Y-m-d") . ".csv"); 
header("Content-disposition: filename=".$filename.".csv"); 
header('Content-Transfer-Encoding: binary'); 
header('Pragma: public'); 
print "\xEF\xBB\xBF"; // UTF-8 BOM 
print $csv_output; 
exit; 
+0

din't работал мой друг. Показывал мусорных символов в файле elx/csv. Я поставил здесь весь код. Plz check - http://oxyjone.blogspot.in/2013/07 /generating-excel-having-utf-8.html – Sajal

+1

Я думаю, что это мое плохое! mysql_query ("SET NAMES utf8"); должно быть befor основного запроса! :) – Poorya

+0

совет: спецификация "\ xEF \ xBB \ xBF" дает вам ошибку при использовании nginx, вы не можете принудительно загрузить ее. потраченные на это потраченные часы. – lsouza

4

У меня есть вариант ответа Sajal и нашел его на php.net по адресу: http://www.php.net/manual/en/function.iconv.php#104287

Echo это в начале содержания в формате CSV:

chr(255).chr(254).iconv("UTF-8", "UTF-16LE//IGNORE", $data) 

Я предпочитаю с iconv(), но кажется, что он делает то же самое, что и mb_convert_encoding(). Не забудьте заменить ; на вкладки (\t), и это сработало для меня так!