Как я использую функции файловой системы в PHP, с помощью строк UTF-8?

Я не вижу, что Silverlight становится уничтожителем Flash в ближайшее время. Однако Silverlight действительно обеспечивает фантастическую модель развертывания для приложений WPF. Я ожидаю видеть больше приложений направления деятельности, записанных для Silverlight, чем сумма содержания Silverlight в общедоступном направлении с веб-сайтами.

33
задан YakovL 30 March 2018 в 16:44
поделиться

2 ответа

Просто urlencode желаемая строка в качестве имени файла. Все символы, возвращаемые из urlencode , действительны в именах файлов (NTFS / HFS / UNIX), то вы можете просто urldecode вернуть имена файлов в UTF-8 (или в любой другой кодировке, в которой они были).

Предостережения (все применимы и к решениям ниже):

  • После url-кодирование, имя файла должно быть меньше 255 символов (вероятно, байтов).
  • UTF-8 имеет несколько представлений для многих символов (с использованием комбинируемых символов). Если вы не нормализуете свой UTF-8, у вас могут возникнуть проблемы с поиском с помощью glob или повторным открытием отдельного файла.
  • Вы не можете полагаться на scandir или аналогичные функции для альфа-сортировка. Вы должны urldecode имена файлов, а затем использовать алгоритм сортировки с учетом UTF-8 (и сопоставлений).

Худшие решения

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

] В Windows оболочка файловой системы PHP ожидает и возвращает строки ISO-8859-1 для имен файлов / каталогов. Это дает вам два варианта:

  1. Свободно использовать UTF-8 в именах файлов, но имейте в виду, что символы, отличные от ASCII, будут отображаться некорректно вне PHP. Символ UTF-8, отличный от ASCII, будет сохранен как несколько одиночных ISO-8859-1 символов. Например, - будет отображаться как ó в проводнике Windows.

  2. Ограничьте имена файлов / каталогов до символов, представленных в ISO-8859-1 . На практике вы Я передам ваши строки UTF-8 через utf8_decode перед их использованием в функциях файловой системы, а записи scandir передадут вам через utf8_encode , чтобы получить исходные имена файлов в UTF -8.

Множество предостережений!

  • Если какой-либо байт , переданный в функцию файловой системы, совпадает с недопустимым символом файловой системы Windows в ISO-8859-1, вы вышли из строя удачи.
  • Windows может использовать кодировку, отличную от ISO-8859-1, не на английском языке. Я предполагаю, что это обычно будет один из ISO-8859- #, но это означает, что вам нужно будет использовать mb_convert_encoding вместо utf8_decode .

Этот кошмар - вот почему вы вероятно, следует просто транслитерировать для создания имен файлов.

и передайте записи scandir через utf8_encode , чтобы получить исходные имена файлов в UTF-8.

Изобилие предостережений!

  • Если какой-либо байт прошел функции файловой системы соответствует недопустимому символу файловой системы Windows в ISO-8859-1, вам не повезло.
  • Windows может использовать кодировку, отличную от ISO-8859- 1 не на английском языке. Я предполагаю, что это обычно будет один из ISO-8859- #, но это означает, что вам нужно будет использовать mb_convert_encoding вместо utf8_decode .

Этот кошмар - вот почему вы вероятно, следует просто транслитерировать для создания имен файлов.

и передайте записи scandir через utf8_encode , чтобы получить исходные имена файлов в UTF-8.

Изобилие предостережений!

  • Если какой-либо байт прошел функции файловой системы соответствует недопустимому символу файловой системы Windows в ISO-8859-1, вам не повезло.
  • Windows может использовать кодировку, отличную от ISO-8859- 1 не на английском языке. Я предполагаю, что это обычно будет один из ISO-8859- #, но это означает, что вам нужно будет использовать mb_convert_encoding вместо utf8_decode .

Этот кошмар - то, почему вы вероятно, следует просто транслитерировать для создания имен файлов.

  • Если какой-либо байт , переданный функции файловой системы, соответствует недопустимому символу файловой системы Windows в ISO-8859-1, вам не повезло.
  • Windows может использовать кодировку, отличную от ISO-8859-1, для неанглийских языков. Я предполагаю, что это обычно будет один из ISO-8859- #, но это означает, что вам нужно будет использовать mb_convert_encoding вместо utf8_decode .

Этот кошмар - вот почему вы вероятно, следует просто транслитерировать для создания имен файлов.

  • Если какой-либо байт , переданный функции файловой системы, соответствует недопустимому символу файловой системы Windows в ISO-8859-1, вам не повезло.
  • Windows может использовать кодировку, отличную от ISO-8859-1, для неанглийских языков. Я предполагаю, что это обычно будет один из ISO-8859- #, но это означает, что вам нужно будет использовать mb_convert_encoding вместо utf8_decode .

Этот кошмар - вот почему вы вероятно, следует просто транслитерировать для создания имен файлов.

24
ответ дан 27 November 2019 в 18:19
поделиться

The problem is that Windows uses utf-16 for filesystem strings, whereas Linux and others use different character sets, but often utf-8. You provided a utf-8 string, but this is interpreted as another 8-bit character set encoding in Windows, maybe Latin-1, and then the non-ascii character, which is encoded with 2 bytes in utf-8, is handled as if it was 2 characters in Windows.

A normal solution is to keep your source code 100% in ascii, and to have strings somewhere else.

7
ответ дан 27 November 2019 в 18:19
поделиться
Другие вопросы по тегам:

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