Вопрос по php, utf-8, encoding, unicode, filepath – UTF8 имена файлов в PHP и различные кодировки Unicode

4

У меня есть файл, содержащий символы Unicode на сервере под управлением Linux. Если я подключаюсь к серверу по SSH и использую табуляцию для перехода к файлу / папке, содержащей символы Юникода, у меня нет проблем с доступом к файлу / папке. Проблема возникает, когда я пытаюсь получить доступ к файлу через PHP (функция, с которой я обращался к файловой системе, былаstat). Если я выведу путь, сгенерированный PHP-скриптом, в браузер и вставлю его в терминал, файл также, похоже, будет существовать (хотя при взгляде на терминал пути к файлам точно такие же).

Я установил PHP, чтобы использовать UTF8 в качестве кодировки по умолчанию через php_ini, а также установитьmb_internal_encoding, Я проверил кодировку строк PHP-пути к файлу, и она выглядит как UTF8, как и должно быть. Порывшись побольше я решилhexdump & # xE9; символ завершения терминала и сравните его сhexdump из "обычного" & # XE9; символ, созданный с помощью сценария PHP или путем ручного ввода символа с клавиатуры (опция + e + e для os x). Вот результат:

echo -n é | hexdump
0000000 cc65 0081                              
0000003
echo -n é | hexdump
0000000 a9c3                                   
0000002

& # XE9; символ, разрешающий правильную ссылку на файл в терминале, является 3-байтовым. Я не уверен, куда идти дальше, какую кодировку мне следует использовать в PHP? Должен ли я преобразовывать путь в другую кодировку черезiconv или жеmb_convert_encoding?

Ваш Ответ

3   ответа
3

utf8е (0х65) с последующимобъединение & # xB4; (0xcc 0x81)в то время как 0xc3 0xa9 стоит «прямо» за& # XE9;.
Сортировка с поддержкой utf-8 должна учитывать возможные декомпозиции, но я не знаю, как вы можете включить это (и, возможно, перекомпилировать источник php) на Mac.
Лучшее, что я могу предложить, это& quot; Использование UTF-8 с Gentoo & quot; описание.

1

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

Различные (двухбайтовые и трехбайтовые) представления & # xE9; являются кодировками UTF-8 составных и разложенных вариаций этого символа в Unicode. В Unicode это разные способы представления одного и того же визуального символа. Unicode имеет концепцию «канонизации» в котором все представления одного и того же символа преобразуются в одно представление, что-то вроде сжатия двух строк в нижний регистр для сравнения без учета регистра.

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

5

приведенным в двух ответах, я смог поэкспериментировать и найти некоторые методы для нормализации различных разложений Юникода для данного персонажа. В ситуации, с которой я столкнулся, я обращался к файлам, созданным приложением OS X Carbon. Это довольно популярное приложение, и поэтому его имена файлов, как представляется, придерживаются определенной декомпозиции Unicode.

В PHP 5.3новый набор функций Был введен, что позволяет нормализовать строку Unicode для конкретной декомпозиции. Очевидно, есть четыре стандарта декомпозиции, в которые вы можете разложить свою строку в юникоде. Python имеет возможности нормализации Unicode с версии 2.3 черезunicode.normalize. Эта статья обработка Python юникодных строк была полезна для лучшего понимания кодирования / обработки строк.

Вот краткий пример нормализации пути к файлу Unicode:

filePath = unicodedata.normalize('NFD', filePath)

Я обнаружил, что формат NFD работал для всех моих целей. Интересно, это стандартная декомпозиция для имен файлов Unicode?

Похожие вопросы