Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Запись в csv файл

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Описание: Почему не записываются русские буквы
lalmazl
Отправлено: 21 Октября, 2015 - 10:42:41
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Окт. 2015  


Помог: 0 раз(а)




Приветствую, помогите понять и разобраться...

Пытаюсь записать в csv файл русские буквы, англ записываются норм, но русские буквы совсем не пишутся в файл, пытался по разному:

PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3.             $f=fopen("folder/file1.csv","a+");
  4.             $write_text = "$max;$d;$name;$email;$url;$text \n";
  5.             fwrite($f, "\xEF\xBB\xBF", 3);
  6.             fputs($f, iconv("cp1251", "utf-8", $write_text));
  7.             fclose($f);
  8.  
  9.  



PHP:
скопировать код в буфер обмена
  1.  $f=fopen("folder/file1.csv","a+");
  2.             $write_text = "$max;$d;$name;$email;$url;$text \n";
  3.             fwrite($f, "\xEF\xBB\xBF", 3);
  4.             fputs($f, $write_text);
  5.             fclose($f);
  6.  


PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3.             $csvFile = 'folder/file1.csv';
  4.             $csvData = "$max;$d;$name;$email;$url;$text \n";
  5.             file_put_contents( $csvFile, $csvData, FILE_APPEND );
  6.  
  7.  
  8.  


а на это ошибка

PHP:
скопировать код в буфер обмена
  1.  
  2.           $csvFile = 'folder/file.csv';
  3.            //setlocale('LC_ALL', 'ru_RU.CP1251');
  4.              setlocale('LC_ALL', 'ru_RU.UTF-8');
  5.             $csvData = file_get_contents($csvFile);
  6.             $csvData = iconv('cp1251', 'UTF-8', $csvData);
  7.             $csvData = "$max;$d;$name;$email;$url;$text \n";
  8.             file_put_contents( $csvFile, $csvData, FILE_APPEND );
  9.  
  10.  

CODE (html):
скопировать код в буфер обмена
  1.  
  2. Deprecated: setlocale(): Passing locale category name as string is deprecated. Use the LC_* -constants instead in
  3.  


Вопрос как записать?
 
 Top
andrewkard
Отправлено: 21 Октября, 2015 - 11:58:01
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


Помог: 30 раз(а)




lalmazl пишет:
Вопрос как записать?

fputcsv
 
 Top
lalmazl
Отправлено: 21 Октября, 2015 - 12:24:39
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Окт. 2015  


Помог: 0 раз(а)




andrewkard пишет:
lalmazl пишет:
Вопрос как записать?

fputcsv


И так не записывает...
 
 Top
Мелкий Супермодератор
Отправлено: 21 Октября, 2015 - 12:31:14
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Как проверяете, что не записывает? Может, вы просто прочитать не можете?
fwrite и file_put_contents не только для кириллицы, они вообще для любых бинарных данных безопасны.


-----
PostgreSQL DBA
 
 Top
Faraon-san
Отправлено: 21 Октября, 2015 - 12:34:40
Post Id



Посетитель


Покинул форум
Сообщений всего: 318
Дата рег-ции: Сент. 2013  


Помог: 8 раз(а)




посмотри какая кодировка у csv файла
 
 Top
lalmazl
Отправлено: 21 Октября, 2015 - 12:54:50
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Окт. 2015  


Помог: 0 раз(а)




Цитата:
Как проверяете, что не записывает?

через echo при отправке + тупо открываю файл.
Цитата:
посмотри какая кодировка у csv файла

UTF-8 без bom

Если открыть и написать вручную что-то на русском то ок, а через php не записывает...

(Отредактировано автором: 21 Октября, 2015 - 12:57:13)

 
 Top
Мелкий Супермодератор
Отправлено: 21 Октября, 2015 - 13:12:12
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




lalmazl пишет:
через echo при отправке

Здесь кириллица есть? В какой кодировке?

lalmazl пишет:
тупо открываю файл.

Чем? В какой кодировке?
Откройте чем-нибудь тупым и глупым, например hexdump'ом.

lalmazl пишет:
UTF-8 без bom

Зачем тогда этот самый BOM пишете?

CODE (bash):
скопировать код в буфер обмена
  1. melkij@melkij:~$ cat test.php
  2. <?php
  3. $fp = fopen('file', 'a');
  4. fputcsv($fp, [
  5.     'name' => 'мелкий',
  6.     'age' => 24,
  7. ]);
  8. fclose($fp);
  9. melkij@melkij:~$ php -f test.php
  10. melkij@melkij:~$ cat file
  11. мелкий,24
  12. melkij@melkij:~$ hd file
  13. 00000000  d0 bc d0 b5 d0 bb d0 ba  d0 b8 d0 b9 2c 32 34 0a  |............,24.|
  14. 00000010
  15. melkij@melkij:~$

Как видите, всё на месте, всё пишется.


-----
PostgreSQL DBA
 
 Top
lalmazl
Отправлено: 21 Октября, 2015 - 17:55:45
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Окт. 2015  


Помог: 0 раз(а)




просто скажите в какой кодировке он должен быть?
в php у меня по дефолту чарсет 1251... я уже просто запутался...
 
 Top
Мелкий Супермодератор
Отправлено: 21 Октября, 2015 - 18:16:10
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Писать и читать этот файл вы должны в одной и той же кодировке везде. Это единственное требование.


-----
PostgreSQL DBA
 
 Top
lalmazl
Отправлено: 22 Октября, 2015 - 00:22:36
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Окт. 2015  


Помог: 0 раз(а)




да вроде везде одинаковая стоит windows-1251 чарсет по дефолту php, мета тег html, преобразовал и перекодировал csv файл ansi 1251 и все равно не записывает, что я еще делаю не так?

И почему таким образом совсем не записывает ничего?
PHP:
скопировать код в буфер обмена
  1.  
  2.                 $d=date("d/m/Y H:i");  
  3.                         $write_text = array (array ($max,$d,$name,$email,$url,$text));
  4.                         $f=fopen("folder/file.csv", "a+");     
  5.                         foreach ($write_text as $fields) {
  6.                                         fputcsv($f, $fields);
  7.                                         }
  8.                 fclose($f);
  9.  

(Отредактировано автором: 22 Октября, 2015 - 00:24:44)

 
 Top
lastdays
Отправлено: 22 Октября, 2015 - 06:31:10
Post Id



Частый гость


Покинул форум
Сообщений всего: 221
Дата рег-ции: Март 2013  


Помог: 7 раз(а)




lalmazl пишет:

И почему таким образом совсем не записывает ничего?
PHP:
скопировать код в буфер обмена
  1.  
  2.                 $d=date("d/m/Y H:i");  
  3.                         $write_text = array (array ($max,$d,$name,$email,$url,$text));
  4.                         $f=fopen("folder/file.csv", "a+");     
  5.                         foreach ($write_text as $fields) {
  6.                                         fputcsv($f, $fields);
  7.                                         }
  8.                 fclose($f);
  9.  


- error_reporting(-1);
- Есть ли права на запись?
- Указать полный путь к файлу

При чем тут кодировка не понял, записать должно так или иначе.
 
 Top
lalmazl
Отправлено: 22 Октября, 2015 - 10:47:43
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Окт. 2015  


Помог: 0 раз(а)




да есть права.

PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3.                 $d=date("d/m/Y H:i");  
  4.                 $f=fopen("folder/file.csv", "a+");
  5.                 $write_text = "$max;$d;$name;$email;$url;$text \n";                    
  6.                 fputs($f, $write_text);
  7.                 fclose($f);
  8.  
  9.  


Так то записывает, но только англ. Русский не записывает...
 
 Top
Мелкий Супермодератор
Отправлено: 22 Октября, 2015 - 11:15:45
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




lastdays пишет:
При чем тут кодировка не понял, записать должно так или иначе.

Вот я и пляшу от очевидной ситуации: латиницу автор видит, кириллицу нет. fwrite бинарно безопасен. Значит запись проходит нормально.
Единственный логичный вывод - ошибка именно при чтении.

Как однозначно снять подозрения с писателя я уже сказал:
Мелкий пишет:
Откройте чем-нибудь тупым и глупым, например hexdump'ом.

hexdump врать не будет. Что ему системное апи отдаст, то так побайтово и покажет. Если покажет байтики с успешно записанной кириллицей - вопрос к читателю. Если вдруг не покажет - то только тогда вопрос к писателю.


-----
PostgreSQL DBA
 
 Top
lalmazl
Отправлено: 22 Октября, 2015 - 12:11:14
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Окт. 2015  


Помог: 0 раз(а)




PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. 00000000  31 3b 32 32 2f 31 30 2f  32 30 31 35 20 31 32 3a  |1;22/10/2015 12:|
  4. 00000010  30 38 3b 74 65 73 74 3b  74 65 73 74 40 67 6d 61  |08;test;test@gma|
  5. 00000020  69 6c 2e 63 6f 6d 3b 3b  20 0a                    |il.com;; .|
  6. 0000002a
  7.  
  8.  
  9.  
 
 Top
Мелкий Супермодератор
Отправлено: 22 Октября, 2015 - 13:18:45
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Ну вот, наконец-то что-то определённое. Моя гипотеза не подтвердилась, значит разбираемся с писателем.

Что выведет var_dump при такой модификации:
PHP:
скопировать код в буфер обмена
  1. $d=date("d/m/Y H:i");
  2. $f=fopen("file.csv", "a+");
  3. $write_text = "$max;$d;$name;$email;$url;$text \n";
  4. $ret = fputs($f, $write_text);
  5. var_dump($write_text, mb_strlen($write_text, '8bit'), $ret);
  6. fclose($f);


-----
PostgreSQL DBA
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB