node_import + CSV с win-кодировкой

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

Аватар пользователя validoll validoll 31 июля 2007 в 0:26

Возникла необходимость портировать CSV файлы, созданные в Excel. Но проблема в том, что Excel напроч отказывается понимать utf-8.
Модуль node_import использует для чтения CSV файла функцию fgetcsv. Эта функция принимает во внимание настройки локали. К примеру, если LANG установлен в en_US.UTF-8, то файлы в однобайтовой кодировке будут неправильно прочитаны этой функцией.

Пришлось немного хакнуть модуль.
Собственно вот что нужно поменять в node_import.module:

  1. Вставить в модуль функцию
    <?php
    /**
     *Convert Windows string to unicode
     */

    function win2utf($string){
    $ttbl=array("А"=>"Рђ","Б"=>"Р‘","В"=>"Р’","Г"=>"Р“","Д"=>"Р”","Е"=>"Р•","Ё"=>"РЃ","Ж"=>"Р–","З"=>"Р—","И"=>"И","Й"=>"Р™","К"=>"Рљ","Л"=>"Р›","М"=>"Рњ","Н"=>"Рќ","О"=>"Рћ","П"=>"Рџ","Р"=>"Р ","С"=>"РЎ","Т"=>"Рў","У"=>"РЈ","Ф"=>"Р¤","Х"=>"РҐ","Ц"=>"Р¦","Ч"=>"Р§","Ш"=>"РЁ","Щ"=>"Р©","Ъ"=>"РЄ","Ы"=>"Р«","Ь"=>"Р¬","Э"=>"Р­","Ю"=>"Р®","Я"=>"РЇ","Ї"=>"Р‡","І"=>"Р†","Є"=>"Р„","Ў"=>"РЋ","а"=>"Р°","б"=>"Р±","в"=>"РІ","г"=>"Рі","д"=>"Рґ","е"=>"Рµ","ё"=>"С‘","ж"=>"Р¶","з"=>"Р·","и"=>"Рё","й"=>"Р№","к"=>"Рє","л"=>"Р»","м"=>"Рј","н"=>"РЅ","о"=>"Рѕ","п"=>"Рї","р"=>"СЂ","с"=>"СЃ","т"=>"С‚","у"=>"Сѓ","ф"=>"С„","х"=>"С…","ц"=>"С†","ч"=>"С‡","ш"=>"С€","щ"=>"С‰","ъ"=>"СЉ","ы"=>"С‹","ь"=>"СЊ","э"=>"СЌ","ю"=>"СЋ","я"=>"СЏ","і"=>"С–","ї"=>"С—","є"=>"С”","ў"=>"Сћ");
    return strtr($string, $ttbl);
    }
    ?>
  2. Найти функцию:
    <?php
    function _node_import_csv_get_row($filepath, $reset = FALSE) {
      static $handle;
      $size = variable_get('node_import_csv_size', 10000);
      $separator = variable_get('node_import_csv_separator', ';');

      if ($filepath == '') {
        unset($handle);
        return FALSE;
      }

      if (!isset($handle) || $reset) {
        if (isset($handle)) {
          fclose($handle);
        }
        $handle = fopen($filepath, 'r');
      }

      return fgetcsv($handle, $size, $separator);
    }
    ?>


    и заменить ее на:

    <?php
    function _node_import_csv_get_row($filepath, $reset = FALSE) {
      static $handle;
      $size = variable_get('node_import_csv_size', 10000);
      $separator = variable_get('node_import_csv_separator', ';');

      if ($filepath == '') {
        unset($handle);
        return FALSE;
      }

      if (!isset($handle) || $reset) {
        if (isset($handle)) {
          fclose($handle);
        }
        $handle = fopen($filepath, 'r');
      }
     
        $temp=fgetcsv($handle, $size, $separator);
           
            $output=array();
      foreach ($temp as $head){
        $output[]=win2utf($head);
      }
      return $output;
    }
    ?>

После этих манипуляций модуль начинает понимать Win-файлы.

Внимание: перед тем, как что либо менять сделайте копию файла (на всякий случай), и убедитесь, что локаль настроена на utf-8.

Комментарии

Аватар пользователя jason32 jason32 31 июля 2007 в 1:25

а может взять посто и пересохранить файл в UTF8 - это же простые текствые файлы.. И импортируй потом сколько влезет...

Аватар пользователя jason32 jason32 31 июля 2007 в 1:27

а может взять посто и пересохранить файл в UTF8 - это же простые текствые файлы.. И импортируй потом сколько влезет...

Аватар пользователя validoll validoll 31 июля 2007 в 10:54

Было бы хорошо!
Но пользователь, котрые работаю в Excel даже не дагадываются о существовании каких-то там кодировок.
Excel вобще не умеет работать с UTF-8. А мне лично не очень хочется ходить к заказчику, \ставить ему Open Office, и объяснять, как все это работает.
Тем более менеджер все равно потом забудет прекодировать, и придется потом еще и сайт чистить.
Так что лучше перестраховаться!

Аватар пользователя oleg2106 oleg2106 17 июля 2008 в 12:42

Классная штука, только в ряд еще надо добавить символ "№"=>"в„–" ; + создать еще одну форму для выбора кодировки ( а то файлы в ANSI теперь переводиться будут, зато те что в UTF - 8 закончат нормально функционировать) или включить условие при котором будет обращение к win2utf($string), а при каком нет