Помогите разобраться с кодировками

sverel

Новичок
Помогите разобраться с кодировками

Реализую кустарный импорт из 1С-7. Ко мне приходит архив с картинками + файл *.dbf с товарами (формат похож на excel). В нём есть столбец PICTURE в котором написан путь к картинке на локальном сервере 1С: 'Z:\Baza-фирма\Images\Здоровый дом.jpg'. Всё это в CP866 в том числе и имена файлов картинок.
Соответственно, когда я выполняю
PHP:
$path = str_replace('\\', DIRECTORY_SEPARATOR, $path);
$fileName = baseName($path); // На выходе вместо "Здоровый дом.jpg" получаю " дом.jpg".
Чтение манов не помогло. Решил пробиваться иначе:
Способ №1 (мухлюем кодировки) :
PHP:
setlocale(LC_ALL, 'en_US.UTF8');
$path = iconv('CP866', 'UTF-8', $path);
$path = str_replace('\\', DIRECTORY_SEPARATOR, $path);
$fileName = baseName($path); // На выходе получаю правильное имя файла в UTF8.
$fileName = iconv('UTF-8', 'CP866', $fileName); // перегоняю обратно
file_exists(TMP_IMAGES_DIR . $fileName); // false

Способ №2 (переписываем basename()):
PHP:
function myBaseName($path) {
   $path = str_replace('\\', DIRECTORY_SEPARATOR, $path);
   return substr(strrchr($path, DIRECTORY_SEPARATOR), 1); // Получаю всё что после крайнего слеша
}
$fileName = myBaseName($path); // На выходе получаю правильный "Здоровый дом.jpg", но:
file_exists(TMP_IMAGES_DIR . $fileName); // всё равно false
// хз почему, может там какие спец-символы режутся...
// но фейл происходит для всех 220 файлов с русскими именами.
Способ 3: пробовал после разархивации переименовать все файлы в CP1251 - тоже фейл + для трёх файлов ругалась на illegal character.


Сервак на юниксах, php 5.2.12.
Переименовать имена файлов на стороне 1С не получится.
setlocale(LC_ALL, 'ru_RU.CP866') - пробовал, возвращает false.
Кстати, ещё не понятный фэйл: архив zip я разархивирую используя стандартный php-extension zip. На выходе получаю 240 файлов с кривыми именами, хотя на домашней винде WinRar распаковывает 252 файла с нормальными именами. Пробовал распакавать через SSH стандартными средствами: unzip db.zip - на выходе получил 252 файла, но в совершенно не понятной кодировке - мне так и не удалось её расшифровать.
 

dimagolov

Новичок
Кстати, ещё не понятный фэйл: архив zip я разархивирую используя стандартный php-extension zip. На выходе получаю 240 файлов с кривыми именами, хотя на домашней винде WinRar распаковывает 252 файла с нормальными именами. Пробовал распакавать через SSH стандартными средствами: unzip db.zip - на выходе получил 252 файла, но в совершенно не понятной кодировке - мне так и не удалось её расшифровать.
это не еще один, а основной фэйл. потому что кодировка имен файлов в твоем юниксе с лучшем случае UTF-8, в худшем KOI8-R, и вменяемо распокавать архив с именами файлов в 866-й можно только с перекодировкой, учитывая в какой кодировке ФС.

а вообще, для переносимости, русских имен файлов лучше не иметь.
 

sverel

Новичок
в юниксе стоит en_US.UTF8, Когда делал SSH unzip пробовал втыкать ru_RU.UTF8 - не помогло. А что же делать? Как правильно разархивировать?

я знаю, что лучше не иметь, но такой возможности нет :( В папке с картинками вообще очень много кривых имен ".jpeg", ". . .jpeg", 'image.php' (это картинка) и т.п... Но пока что надо хотя бы "Здоровый дом.jpg" там найти и распаковать.
 

dimagolov

Новичок
sverel, ты не понимаешь что такое локали и зачем они нужны. да и не при чем они к твоей проблеме.
правильно распаковывать по-файлово, переименовывая файлы. и имена файлов нужно генерить самому, а не брать всякую муть из архива.
 

sverel

Новичок
Огромное спасибо за пинок в правильном направлении. проблема решена
 
Сверху