Возникла необходимость портировать 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.
Комментарии
а может взять посто и пересохранить файл в UTF8 - это же простые текствые файлы.. И импортируй потом сколько влезет...
а может взять посто и пересохранить файл в UTF8 - это же простые текствые файлы.. И импортируй потом сколько влезет...
Было бы хорошо!
Но пользователь, котрые работаю в Excel даже не дагадываются о существовании каких-то там кодировок.
Excel вобще не умеет работать с UTF-8. А мне лично не очень хочется ходить к заказчику, \ставить ему Open Office, и объяснять, как все это работает.
Тем более менеджер все равно потом забудет прекодировать, и придется потом еще и сайт чистить.
Так что лучше перестраховаться!
не проще вместо своей функции использовать встроенную ?
$output[]=iconv("CP1251", "UTF-8",$head);
Классная штука, только в ряд еще надо добавить символ "№"=>"в„–" ; + создать еще одну форму для выбора кодировки ( а то файлы в ANSI теперь переводиться будут, зато те что в UTF - 8 закончат нормально функционировать) или включить условие при котором будет обращение к win2utf($string), а при каком нет
для 6того друпала е решение?