node_import + CSV с win-кодировкой
Прислано: validoll
пн, 30/07/2007 - 20:26
Возникла необходимость портировать CSV файлы, созданные в Excel. Но проблема в том, что Excel напроч отказывается понимать utf-8.
Модуль node_import использует для чтения CSV файла функцию fgetcsv. Эта функция принимает во внимание настройки локали. К примеру, если LANG установлен в en_US.UTF-8, то файлы в однобайтовой кодировке будут неправильно прочитаны этой функцией.
Пришлось немного хакнуть модуль.
Собственно вот что нужно поменять в node_import.module:
-
Вставить в модуль функцию
<?php /** *Convert Windows string to unicode */ function win2utf($string){ $ttbl=array("А"=>"Рђ","Б"=>"Р‘","В"=>"Р’","Г"=>"Р“","Д"=>"Р”","Е"=>"Р•","Ё"=>"РЃ","Ж"=>"Р–","З"=>"Р—","И"=>"Р","Й"=>"Р™","К"=>"Рљ","Л"=>"Р›","М"=>"Рњ","Н"=>"Рќ","О"=>"Рћ","П"=>"Рџ","Р"=>"Р ","С"=>"РЎ","Т"=>"Рў","У"=>"РЈ","Ф"=>"Р¤","Х"=>"РҐ","Ц"=>"Р¦","Ч"=>"Р§","Ш"=>"РЁ","Щ"=>"Р©","Ъ"=>"РЄ","Ы"=>"Р«","Ь"=>"Р¬","Э"=>"Р","Ю"=>"Р®","Я"=>"РЇ","Ї"=>"Р‡","І"=>"Р†","Є"=>"Р„","Ў"=>"РЋ","а"=>"Р°","б"=>"Р±","в"=>"РІ","г"=>"Рі","д"=>"Рґ","е"=>"Рµ","ё"=>"С‘","ж"=>"Р¶","з"=>"Р·","и"=>"Рё","й"=>"Р№","к"=>"Рє","л"=>"Р»","м"=>"Рј","н"=>"РЅ","о"=>"Рѕ","п"=>"Рї","р"=>"СЂ","с"=>"СЃ","т"=>"С‚","у"=>"Сѓ","ф"=>"С„","х"=>"С…","ц"=>"С†","ч"=>"С‡","ш"=>"С€","щ"=>"С‰","ъ"=>"СЉ","ы"=>"С‹","ь"=>"СЊ","э"=>"СЌ","ю"=>"СЋ","я"=>"СЏ","і"=>"С–","ї"=>"С—","є"=>"С”","ў"=>"Сћ"); return strtr($string, $ttbl); } ?>
-
Найти функцию:
<?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.
- validoll's blog
- Для комментирования войдите или зарегистрируйтесь
а может взять посто и пересохранить файл в UTF8 - это же простые текствые файлы.. И импортируй потом сколько влезет...
- Для комментирования войдите или зарегистрируйтесь
а может взять посто и пересохранить файл в UTF8 - это же простые текствые файлы.. И импортируй потом сколько влезет...
- Для комментирования войдите или зарегистрируйтесь
Было бы хорошо!
Но пользователь, котрые работаю в Excel даже не дагадываются о существовании каких-то там кодировок.
Excel вобще не умеет работать с UTF-8. А мне лично не очень хочется ходить к заказчику, \ставить ему Open Office, и объяснять, как все это работает.
Тем более менеджер все равно потом забудет прекодировать, и придется потом еще и сайт чистить.
Так что лучше перестраховаться!
- Для комментирования войдите или зарегистрируйтесь
не проще вместо своей функции использовать встроенную ?
$output[]=iconv("CP1251", "UTF-8",$head);
- Для комментирования войдите или зарегистрируйтесь
Классная штука, только в ряд еще надо добавить символ "№"=>"в„–" ; + создать еще одну форму для выбора кодировки ( а то файлы в ANSI теперь переводиться будут, зато те что в UTF - 8 закончат нормально функционировать) или включить условие при котором будет обращение к win2utf($string), а при каком нет
- Для комментирования войдите или зарегистрируйтесь
для 6того друпала е решение?
- Для комментирования войдите или зарегистрируйтесь





Комментарии