Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Путь к файлу и utf-8
 
 автор: Gerych   (09.01.2010 в 15:42)   письмо автору
 
 

Всем здрасти. Есть задача, над которой устал биться - всё, что приходило на ум перепробовал.

Есть сервер на Win XP в локальной сети, на нём сайт с каталогом музыки. Записи в БД добавляются путём парсинга плейлиста AIMP который имеет след. формат:

...
1|F:\Музыка\Enya\1995 - The Memory of Trees\10. Enya - La soñadora.flac|Enya|The Memory of Trees|New Age|La soñadora|218240|17508989|10|1995|44100|637|2
1|F:\Музыка\Mylène Farmer\1999 - Innamoramento\09. Mylène Farmer - Serais-tu l[b]]à[/b_.flac|Mylène Farmer|Innamoramento|Pop|Serais-tu là?|287906|35475404|9|1999|44100|976|2
...

В принципе это избавляет от многих проблем (работает быстрее, чем перебирать папки/файлы + php пока не может обрабатывать lossless, и от mp3 нельзя добиться такой подробной информации).

Но есть проблема - плейлист сохраняется в формате ucs-2, и напрямую файлы найти нельзя (file_exists возвращает false), преобразуя в utf-8 тоже самое, а если в cp1251 то символы ñ, è и т.д. пропадают, т.е. снова file_exists -- false, но при этом остальные файлы добавляются без проблем. Вот собственно проблема - на диске эти файлы именно так и названы, с этими символами, как заставить парсер их найти?

  Ответить  
 
 автор: aibolit   (09.01.2010 в 16:01)   письмо автору
 
   для: Gerych   (09.01.2010 в 15:42)
 

можно попробовать, преобразовать символы в строке для поиска к одному формату.
попробуйте, поковырять

html_entity_decode()

и

htmlentities()

  Ответить  
 
 автор: Gerych   (09.01.2010 в 16:13)   письмо автору
 
   для: Gerych   (09.01.2010 в 15:42)
 

Пардон, тут форум преобразовал не так - вместо ñ и т.п. должно быть n- c тильдой сверху, e- с ковычкой сверху и т.д. ñ htmlentities() пробовал - ессесно не получилось, т.к. путь до файла изменился на несуществующий

  Ответить  
 
 автор: Trianon   (09.01.2010 в 16:56)   письмо автору
 
   для: Gerych   (09.01.2010 в 15:42)
 

>Но есть проблема - плейлист сохраняется в формате ucs-2,

не может. Файл состоит из октетов. Так что либо в UTF-16LE (что вероятнее) либо в UTF-16BE.


>и напрямую файлы найти нельзя

Что есть напрямую?
Может нужно просто iconv применить в целевую кодировку?

  Ответить  
 
 автор: Gerych   (09.01.2010 в 17:17)   письмо автору
375.8 Кб
 
   для: Trianon   (09.01.2010 в 16:56)
 

Попробую объяснить по порядку


private function add_audio(){
         
                $this->playlist = iconv("utf-8", "cp1251", playlist);  //Без этого скрипт не найдёт плейлист, т.к. сам скрипт utf-8
         
                    /*ну тут всё понятно
                     $this->play_list_open = fopen($this->playlist, "r");
                     $this->play_list_read = fread($this->play_list_open, filesize($this->playlist));
                     fclose($this->play_list_open);
                     */


                     $this->play_list_read = iconv("UCS-2", "cp1251//ignore", $this->play_list_read); //А вот без этого дальше работать невозможно, т.к. проверка на существование файла будет возвращать false

                     $this->strings = explode("\r\n", $this->play_list_read);
                     
                     for ($this->string = 1; $this->string < count($this->strings); $this->string++){

                          /*Разбиение информации о песне на составляющие*/
                          $this->song = explode("|", $this->strings[$this->string]);
     
                          if (isset($this->song[1]) && file_exists($this->song[1])){ //Это на случай, если файл был удалён или его переместили, но забыли обновить плейлист



Также далее идёт получение хэш-суммы файла (для дальнейшего обновления информации о файле, в случае изменения тэгов) - и тут также вылетает ошибка если не переводить в cp1251.

И по поводу кодировки плейлиста в аттаче

  Ответить  
 
 автор: Trianon   (09.01.2010 в 17:44)   письмо автору
 
   для: Gerych   (09.01.2010 в 17:17)
 

К самим файлам-то можно обратиться по имени в однобайтовой кодировке?
Вы в консоли можете сделать dir "такой файл" и получить отклик?
В 1251 - сомнительно мне как-то. Может попробовать локаль поменять?

А что аттач... аттач лишь подтверждает...

  Ответить  
 
 автор: Gerych   (09.01.2010 в 17:50)   письмо автору
 
   для: Trianon   (09.01.2010 в 17:44)
 

Да, ко всем у которых нет этих символов

  Ответить  
 
 автор: Gerych   (18.01.2010 в 22:40)   письмо автору
 
   для: Gerych   (09.01.2010 в 15:42)
 

Вообщем после долгих мытарств нашел ответ на свой вопрос, и похоже решения пока нет :(
http://bugs.php.net/bug.php?id=43148

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования