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

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!?
 
мистика мля...
readdir вернул ???
`dir` как не странно тоже самое...

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

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

1344460133-clip-18kb.png
 
м
В итоге они действительно не читаемые какие то...
Но при этом при заходе в папку через тотал на ★ я получил 7CE0~1 и это постоянное имя... скапировал
Для просмотра ссылки Войди или Зарегистрируйся (мат часть.)

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

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

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

В php есть более низкоуровненные функции для работы с файлами?
 
PHP файловая оболочка для Windows принимает название файла в кодировке ISO-8859-1, это латинские буквы и некоторые символы. Может назвать файлы цифрами 1.txt, 2.txt и хранить названия в каждом файле в первой строчке, или в отдельном файле как список, или в базе.
 
PHP файловая оболочка для Windows принимает название файла в кодировке ISO-8859-1, это латинские буквы и некоторые символы. Может назвать файлы цифрами 1.txt, 2.txt и хранить названия в каждом файле в первой строчке, или в отдельном файле как список, или в базе.

Да нет, я уже просто сделал замену всех недопустимых символом на "~". Просто хотелось бы разобраться с самой проблемой. По поводу ISO-8859-1 неправда, в ней например нет русских символов, хотя через dir, scandir и readdir они читаются.
 
Можно поступить следующим образом. Так сказать через костыль.

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

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

И далее по мере необходимости, изменять с помощью php содержимое bat файла.
 
2 Qwest-fx
тогда уж проще через Для просмотра ссылки Войди или Зарегистрируйся

Проблема не в наборе символа, а в том, как винда воспринимает его... Хоть через chr, хоть просто набейте на клавиатуре, хоть в хекс-редакторе, суть от этого не меняется.
 
Назад
Сверху