feeds и кодировка Кириллица Windows-1251 пробовал кто?

Главные вкладки

Аватар пользователя VasyOK VasyOK 27 декабря 2011 в 20:39

feeds и импорт из файла в кодировке Кириллица Windows-1251. Пробовал кто?

Нашел тут патч
http://drupal.org/node/704532

У меня не получилось его применить. Точнее применить получидлось, но не заработало.

Комментарии

Аватар пользователя Sun-fire Sun-fire 28 декабря 2011 в 2:06

Сразу скажу, именно такой задачи не делал, но как вариант первое, что в голову приходит - по ходу исполнения Feeds для элемента применять iconv(), то есть конвертацию строки в нужную кодировку.

Попадался на глаза модуль Feeds Tamper, в котором есть (или предполагалось создать, обсуждение этого функционала по крайней мере читал) возможность выполнения произвольного РНР-кода относительно каждого элемента данных перед его сохранением.

Аватар пользователя Sun-fire Sun-fire 28 декабря 2011 в 3:37

Нашел тот issue на drupal.org, о котором писал выше: http://drupal.org/node/1297968

Исходя из текста, плагин пока на стадии needs review, поэтому в списке официальных не числится. Допиливать до нормальной работоспособности скорее всего придется. Повторюсь, сам не пользовался, за результат не ручаюсь.

Аватар пользователя VasyOK VasyOK 9 января 2012 в 12:48

Хорошо. Патч я применил.Тепрь мне нужно каждую ячейку преобразовать из одной кодировки в другую.

а какой PHP код для этого мне вставлять?

Такой?

<?php print iconv("CP1251", "UTF-8", $source_field_name) ?>

А $source_field_name откуда брать (если у меня Ubercart)?

Аватар пользователя Sun-fire Sun-fire 11 января 2012 в 23:08

$source_field_name - это значение поля, которое вы получаете при импорте. Может браться из XML или CSV файла или еще откуда то. В зависимости от того, как у вас парсер в Feeds настроен.

По поводу общей конструкции строки, исходя из патча, нужно использовать именно print.

Аватар пользователя VasyOK VasyOK 12 января 2012 в 2:50

Хорошо самый простой пример:
что писать заместо $source_field_name для поля "Заголовок материала" и зачем там токены?

Аватар пользователя standby standby 6 августа 2012 в 11:51

Недавно пришлось импортировать таблицу с кириллицей с помощью feeds. Сделал так:в файле ParserCSV.inc в папке sites\all\modules\feeds\libraries заменил строчку
$fields[] = $currentField;
на
$fields[] = iconv("CP1251","UTF-8",$currentField);
3 раза. Все получилось.

Аватар пользователя Sun-fire Sun-fire 12 августа 2012 в 20:46

Получится то получилось. Но это хак модуля. Что кагбе намекает, что подход не правильный. При первом же обновлении модуля правка слетит, и импорт будет работать не правильно.

Аватар пользователя VasyOK VasyOK 13 августа 2012 в 5:05

К большому сожалению этот модуль обновляется очень редко. Предпоследняя рабочая версия под 7-ку была за год до последней.

Аватар пользователя Alexandr.ua Alexandr.ua 4 января 2013 в 12:47

Лучше подготавливать импортируемый файл изначально в кодировке UTF-8, это избавит от возни с патчами и хаками модулей. Благо существует много бесплатных текстовых редакторов, позволяющих конвертировать в любую кодировку (AcelPad, Notepad++ и др.)

Аватар пользователя VasyOK VasyOK 4 января 2013 в 14:43

Да можно. Но лучше избавиться от лишнего шага при импорте. Особенно когда кому то этот импорт объясняешь.

Аватар пользователя petu petu 21 марта 2014 в 5:41

Столкнулся с той же проблемой: необходимо перекодировать csv-ленту с cp-1251 в utf-8, перед тем, как скормить её в feeds.
Решил проблему иным способом. Сделал php-скрипт, который производит перекодировку, выложил его на сервер с сайтом и в качестве параметра передал путь к csv-ленте.
То есть, в feeds при импорте указываю путь типа http://site.ru/encode.php?filename=pupkin.csv
Внутри скрипта добавляется имя сервера, с которого берется csv-лента, которую нужно перекодировать, загружается нужный файл и построчно распарсивается и перекодируется. На входе в скрипт с внешнего сервера попадает лента в cp-1251, на выходе скрипта отдается лента в utf8.

Текст скрипта:


<?php

header

('Content-Encoding: UTF-8');
header('Content-type: text/csv; charset=UTF-8');
header("Content-disposition: attachment; filename=filename.csv");
header("Pragma: public");
header("Expires: 0");
echo 
"\xEF\xBB\xBF"// UTF-8 BOM

$file_path $_GET['filename'];

$file_path 'http://app.marketmixer.net/content/export/' $file_path;

ini_set('auto_detect_line_endings'TRUE);
$handle fopen($file_path'r');

while ((

$data fgetcsv($handle0';''"')) !== FALSE) {
  foreach (
$data as $item) {
    echo 
'"' addslashes(iconv('cp1251''UTF-8//TRANSLIT'$item)) . '";';
  }
  echo 
"
"
;
}
ini_set('auto_detect_line_endings'FALSE);

?>

Вроде ошибок не обнаружено. Удачно загружает большие файлы длиной в 50 тысяч и более строк, десяток полей.

Если у кого есть усовершенствования - делитесь!

Аватар пользователя heron77 heron77 24 декабря 2015 в 23:49

Нарисовал вот такой модуль - feeds_cp1251 с двумя хуками. Все по правилам, все работает.
Сначала перекодирует из cp1251 в utf8, а затем возвертает обратно. Причина обратной конвертации в том, что уже загруженный файл может быть пользователем случайно еще раз запущен на импортирование без повторной загрузки и тогда в сайт попадет инфа с испорченной кодировкой.

<?php
/**
* @author heron77
*/

function feeds_cp1251_feeds_before_import(FeedsSource $source) {
$fetcher_config = $source->getConfigFor($source->importer->fetcher);
if ($fetcher_config && $fetcher_config['source']) {
$path = drupal_realpath($fetcher_config['source']);
if(file_exists($path)) {
exec("iconv -f cp1251 -t utf8 ".$path." > csv_tmp && mv -f csv_tmp ".$path);
}
}
}

function feeds_cp1251_feeds_after_import(FeedsSource $source) {^M
$fetcher_config = $source->getConfigFor($source->importer->fetcher);
if ($fetcher_config && $fetcher_config['source']) {
$path = drupal_realpath($fetcher_config['source']);
if(file_exists($path)) {
exec("iconv -f utf8 -t cp1251 ".$path." > csv_tmp && mv -f csv_tmp ".$path);
}
}
}