Нестандартные символы в названиях файлов

Тема в разделе "PHP", создана пользователем HatoL, 8 авг 2012.

Модераторы: latteo
  1. HatoL

    HatoL

    Регистр.:
    5 фев 2008
    Сообщения:
    206
    Симпатии:
    36
    Бьюсь второй час. Есть Windows 7 с NTFS на харде. Есть файлы, которые нужно переименовать. Новые названия берутся из другого файла. В названиях есть различные специальные символы, вроде таких — ★. Пытался сначала просто переименовать средствами пхп один файлик. Вместо звездочки получил "в..." (многоточие одним символом). Попробовал переименовать файл просто через проводник - все нормально, звездочка показывается, файл проигрывается. Значит проблема в том, что винда хранит название не в UTF-8 (в ANSI вообще нет такого символа).

    Прочитал в википедии про NTFS. Написано UTF-16. Ок, делаю mb_convert_encoding в UTF-16 из UTF-8. Переименовываю - не получается (уже не помню, то ли опять левый символ получился, то ли Warning появился).

    Начал пытаться выяснять, в какой кодировке вообще хранит винда такие специальные символы (ведь они показываются нормально!). Пробовал три разных php-команды (scandir, dir, readdir), чтобы записать символ в чистом виде в отдельный файл и проанализировать. Смотрю, в итоге символ становится "?" (знаком вопроса). Думаю, может просто отображается неправильно. Открыл в хекс-редакторе - и вправду знак вопроса (3F вроде). То есть стандартные функции пхп не смогут прочитать папку, в которой файлы со специальными символами (кстати русские символы читает).

    И как собственно с этим жить? Во-первых как массово переименовать файлы, во-вторых как читать папку, в которой файлы со спец названиями? И какая в конце концов кодировка у названий файлов в NTFS!?
     
    latteo нравится это.
  2. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    350
    мистика мля...
    readdir вернул ???
    `dir` как не странно тоже самое...

    В итоге они действительно не читаемые какие то...
    Но при этом при заходе в папку через тотал на ★ я получил 7CE0~1 и это постоянное имя... скапировал в проводник перешол получил вместо этого звезду.
    Создал папку с таким именем в звезду она не превратилась и в адресе таже белиберда...

    Боюсь подобное уже не в кодеровке кроется а в какомто костыле... гдето регистрирует это система и далее замыливает глаза подобным...
    Хот это не отвечает на вопрос какова хрена тотал видит все нормально при этом какова все же вопросы вместо набора какихто кодов хотябы и при этом тот путь что выдает тотал работает в винде и при этом код в звезду переходит... кароче что то тут не чисто но думаю вам проще отказаться отзатеи со спецсимволами.

    [​IMG]
     
    latteo нравится это.
  3. Qwest-fx

    Qwest-fx Постоялец

    Регистр.:
    3 апр 2007
    Сообщения:
    129
    Симпатии:
    39
    http://ru.wikipedia.org/wiki/8.3 (мат часть.)

    Давно DOS не запускали видимо:) расскажите для чего нужно называть файлы именами в unicode?
    У меня на компьютере winXP. и unicode не отображается.
    Попробуйте указать полный путь в обход функций php
    через командную строку. если не выйдет создать файл и выполнить его. (bat)
    Код:
    mkdir \\.\C:\ ★ 
     
  4. HatoL

    HatoL

    Регистр.:
    5 фев 2008
    Сообщения:
    206
    Симпатии:
    36
    Спец символы эт конечно полом полный. Командная строка ведет себя аналогично. Когда пишешь dir - вместо спец символа ставится звездочка. Пытаешься переименовать - винда ставит не те символы. Точнее ставит наверное те, но в проводнике они отображаются как несколько ANSI-символов.

    Я вот почему этой темой заинтересовался. Насколько знаю, в некоторых экзотических языках (например китайском) букв слишком много, чтобы они помещались в стандартную ANSI-таблицу. То есть там юникод используется по умолчанию. Как-то ведь они читают свои файлы!? Программируют на PHP!?

    Сейчас попробовал дать файлу китайское имя. Все нормально. Но dir по-прежнему отображает знаки вопроса. Фигня какая-то... Как они с этим живут?

    В php есть более низкоуровненные функции для работы с файлами?
     
  5. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    PHP файловая оболочка для Windows принимает название файла в кодировке ISO-8859-1, это латинские буквы и некоторые символы. Может назвать файлы цифрами 1.txt, 2.txt и хранить названия в каждом файле в первой строчке, или в отдельном файле как список, или в базе.
     
  6. HatoL

    HatoL

    Регистр.:
    5 фев 2008
    Сообщения:
    206
    Симпатии:
    36
    Да нет, я уже просто сделал замену всех недопустимых символом на "~". Просто хотелось бы разобраться с самой проблемой. По поводу ISO-8859-1 неправда, в ней например нет русских символов, хотя через dir, scandir и readdir они читаются.
     
  7. Qwest-fx

    Qwest-fx Постоялец

    Регистр.:
    3 апр 2007
    Сообщения:
    129
    Симпатии:
    39
    Можно поступить следующим образом. Так сказать через костыль.

    создаем bat файл с текстом.
    Код:
    chcp 65001
    mkdir ★
    Первая строчка, переводит кодировку cmd в utf-8

    далее можно с помощью php вызвать исполнение bat файла.
    PHP:
    <?php
    shell_exec
    ("test.bat");
    В результате, получается папка с именем ★, работает.

    И далее по мере необходимости, изменять с помощью php содержимое bat файла.
     
    HatoL, DrakonHaSh и latteo нравится это.
  8. HatoL

    HatoL

    Регистр.:
    5 фев 2008
    Сообщения:
    206
    Симпатии:
    36
    Проблема не в наборе символа, а в том, как винда воспринимает его... Хоть через chr, хоть просто набейте на клавиатуре, хоть в хекс-редакторе, суть от этого не меняется.