Jump to content
  • 0

Определение кодировки сервера


Switch74
 Share

Question

Ситуация следующая:

Есть PHP скрипт index.php в кодировке UTF-8 крутится это все например под Windows у которой кодировка CP1251

Если попробуем создать в корне сайта файлик с именем "тест.php" через скрипт, все будет работать нормально, но при входе на сервер через FTP мы увидим "тест.php"

А если закачаем этот файл через ftp, то выглядеть в файловой системе он будет как "тест.php", но вот из index.php данный файл будет доступен только при перекодировании названия в CP1251

 

Цель: попробовать как-то автоматизировать определение кодировки системы, хотелось бы, чтобы файлы нормально смотрелись как в родной файловой системе, так и были доступны из скриптов в отличной от серверной кодировки.

Link to comment
Share on other sites

12 answers to this question

Recommended Posts

  • 0

а зачем вы называете файл кириллицей?


вот тут есть пример определения с помощью заголовков: http://f9r.ru/kodir2.html

и еще как вариант попробовать вытащить чисто только кодировку с помощью php info: http://php.net/manual/ru/function.phpinfo.php

Link to comment
Share on other sites

  • 0

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

Link to comment
Share on other sites

  • 0

Попробую чуть подробнее описать ситуацию:
PHP скрипт в UTF-8, который может крутиться на одном сервере или отдельном например с 1С или какой-нибудь другой программой, под управлением Win или Unix (каждый из которых может иметь свои настройки кодировки и т.п.)

 

в папочку со скриптом попадают файлы:
1. какая-то сторонняя программа на сервере или через ftp доступ может создавать файлы (если например это Win с cp1251, то в скрипте нужно кодировать запрашиваемое имя файла из UTF-8 в cp1251)

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

в этом и заключается основная проблема - разные пути и способы появления файлов в папке при условии, что кодировка скрипта отличается от кодировки системы приводят к путанице.

 

файлы переименовывать не желательно, т.к. в названии присутствуют критерии выборки данных файлов (там может быть указана дата, название чего-либо, ФИО...)

 

через скрипт пользователь должен получить нужные ему файлы, указав например ФИО и период времени за который ему нужны данные

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

 

Идея сделать данный скрипт максимально автоматически настраиваемым, чтобы было достаточно скопировать его и все работало.

Сторонние программы уже имеют функционал выгрузки файлов и делать доработку или разработку дополнительных модулей не хотелось бы.

 

Сразу оговорюсь - это ни какой-то проект, чисто научное изыскание результаты которого будут опубликованы здесь.

Link to comment
Share on other sites

  • 0

Я бы посоветовал FTP-сервер, который работает с UTF. Имена файлов в CP1251 — это жуткий геморрой. В том же proftpd, если включить перекодировку в cp1251 для клиента, то у имён файлов отрезается буква Я и следующая за ней. А если там ЯЯ, то файл вроде бы вообще не прочитается. В общем, устаревшие сервера и клиенты нет смысла использовать.

Link to comment
Share on other sites

  • 0

Я это понимаю, но хотелось бы добиться того, чтобы скрипт работал на любой системе без индивидуальных доработок. В UNIX подобных системах под UTF-8 все работает идеально :)

Link to comment
Share on other sites

  • 0

Не сталкивался с таким. Если бы поставили задачу сегодня "сделать!", то:


1. Если либо русские имена либо английские, то плюс - можно корректировать их, видя какой за что отвечает. Тогда для создания мне нужна версия системы. Можно обходным: если win, то запрос батником версию, линукс -баш, т.к. через phpinfo не вариант - она в первых местах на отключение по секьюрности. Или вроде этого, человек выдрал с wp и через setlocale выдрал кодовую http://stackoverflow.com/questions/20408377/utf-8-characters-in-uploaded-file-name-are-jumbled-on-file-upload - хотя я не изучал эту функцию, просто нашел.
А вот если файл заливается, то для чтения - детект имени и перекодировка, больше ведь никаких данных-то и нет. Имя файла никак не связано с версией системы. Необязательно, что на 1251 зальют именно 1251, все что угодно может быть.


2. Если алфавиты разные, то или через хеши, или таблицу сопоставлений, определять и кодировать в таких разных случаях я бы не рискнул, пример тут http://www.yiiframework.com/forum/index.php/topic/52052-upload-file-with-any-charset/

 

 

3. Постарался бы откреститься от 1. Если нужно пройтись какой тулзой по файлам, то будут проблемы, причем раз русские символы, то логично ожидать, что там utf - это малоочевидно. Ну, или забил исключение на все, кроме 1251 и utf8, причем проверять это нужно где-то и если файл заливается в обход итнтерфейса, то разве что кроном, а когда он уже зальется, толку от такого предупреждения. и как-то нужно предупредить, что там солянка, или в имени папки, либо файл туда залить или еще как. Да и функции детекта кодировок могут глючить, да и при использовании в стороннем коде, при переносе модуля - это ж все скажется. Последующие разработчики - проклянут. Хотя может я чего очевидного не вижу.

 

UPD. Не заметил, что нужно отдать пользователю - тогда еще дополнительные сложности.

UPD2. По логике, например, пользователь запрашивает себя по фамилии - Помидоров. Этот файл может храниться как в ютф, так и в 1251, так и в другом. Получается, нужно подключать или искать в одной кодировке, потом в другой, если нет, то нет. а если перекодировалось с ошибкой и он есть, то все равно скрипт его не найдет. Вообще, это выглядит подозрительно с точки зрения быстродействия и с т.з. ошибок.

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

Edited by bryknyk
Link to comment
Share on other sites

  • 0

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

 

1. Вариант был - создать эталонный файл в системе и искать его по названию в разных кодировках, как-только мы его найдем - мы найдем и кодировку системы, но хотелось бы избавиться от столь специфического действия для ее определения.

 

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

Link to comment
Share on other sites

  • 0

Нет обычно такого понятия как "кодировка файловой системы". Имя файла для ОС (ядра, драйвера, ФС) - набор байтов, программы сами решают в какой кодировке показывать или отображать. Если нужно показать пользователю имя файла, записанного неизвестной программой, с большой вероятностью не следующей соглашениям о кодировках, то нужно или знать в какой кодировке пишется, либо спрашивать у пользователя, либо применять эвристики для определения кодировки. Но на коротких именах эвристики часто очень плохо работают, если не стоит выбор лишь из двух кодировок. 

 

В любом случае при использовании больше одной кодировки в предполагаемом окружении все операции с файлом нужно приводить к одному внутреннему представлению, обычно какому-нибудь варианту Unicode, а перекодировку осуществлять в обёртке над физическим уровнем, и пользоваться исключительно ею - физические вызовы API ОС осуществлять исключительно в обёртке. Вообще это хорошая практика для любых действий с файлами и прочим вводом-выводом - в любой момент может потребоваться расширение (типа логирования), изменения (типа перенаправления) или отмены деволтного поведения дефолтной ОС с дефолтной файловой или иной системы хранения.

Edited by VolCh
Link to comment
Share on other sites

  • 0
Нет обычно такого понятия как "кодировка файловой системы".

тут речь не о файловой системе, а о кодировке сервера (апач, нжикс и иже с ними...), в заголовке темы это указано.

Link to comment
Share on other sites

  • 0
тут речь не о файловой системе, а о кодировке сервера (апач, нжикс и иже с ними...), в заголовке темы это указано.

Указано   "под Windows у которой кодировка CP1251" (это какая, кстати, 95-ая? :) ), а не под "веб-сервером". Да и проблема к локали демона или сервиса веб-сервера никакого отношения не имеет.

 

Есть четыре субъекта (ОС, веб-сервер, php, сторонний софт типа ftp-сервер) и один объект (файловая система). ОС только задает дефолтные локали для веб-сервера, php и ftp-сервера, веб-сервер в проблеме не участвует, файловая система Windows хранит имена файлов в UTF-16LE (по факту в любой двубайтовой кодировке, но это вообще экзотика), если пользователь работает с другой, то задача стороннего приложения конвертировать имя файла перед записью в  UTF-16LE. Если же стороннее приложение не хочет этого делать, а нашему приложению (php в нашем случае) нужно корректно показывать пользователю файлы, то наше приложение должно как-то догадаться о том, какая кодировка использовалась для записи и переконвертировать его (если вообще получится прочитать) в ту, которую отдаёт пользователю. Если в каталог пишут разные приложения, использующие разные кодировки, то единственный выход - эвристики, но нужно понимать, что 100% угадывания они могут не давать, особенно на коротких строках, которыми обычно являются имена файлов. Если же известно что сторонние приложения пишут в одной известной кодировке, то лучше и нашему приложению писать в ней же. 

Link to comment
Share on other sites

  • 0

Вот тут как раз та самая проблема не известности кодировки. Возьмем для примера только UTF8 и cp1251

1. При создании файла средствами ОС (в моем случае windows 7 pro х64 рус) название файла получается в cp1251 и если программка , например 1С создает файлик в ней, то он и будет в этой кодировке (помоему 1С нельзя заставить сохранять название файла в нужной кодировке, содержимое - ДА, название в 99% случаев зависит от настроек ОС).

2. Через FTP клиент может быть все что угодно, провел эксперимент с двумя файлами в разных кодировках cp1251 и UTF8. При входе через эксплорер и FTP клиент (под виндой с cp1251) видим только cp1251 корректно, через браузер (страница отображения файлов в UTF8) видит все файлы корректно, (видать на ходу определяет и перекодирует cp1251 в utf8)

 

Так вот, цель хранить на данном компе файлы в кодировке ОС, чтобы ориентироваться в них, если смотреть не через сайт, а например FTP или шару.

Файлы могут попадать через те же FTP и шару как в UTF8 так и в cp1251 все зависит от настроек системы на которой они были созданы.

Перебрав файлики один раз по названиям перекодируя в разные кодировки можно определить в какой они находятся и перекодировать раз и на всегда название в кодировку ОС. Но как узнать какая она без вмешательства человека?

 

Чтобы выводить файлы на сайте нужно просто перекодировать из кодировки ОС в UTF8.

Нужно найти эту неизвестную.

 

Эвристика естесно не очень подходит на мой взгляд.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy