Я пытаюсь создать каталог, используя php на английском языке, и он работает. Но когда я пытаюсь на иврите, создается папка на тарабарщине, например: ׳”׳•׳¨׳“׳”| ׳׳©׳—׳§ ׳©׳•׳׳˜
как я могу это исправить? Благодарность
Я пытаюсь создать каталог, используя php на английском языке, и он работает. Но когда я пытаюсь на иврите, создается папка на тарабарщине, например: ׳”׳•׳¨׳“׳”| ׳׳©׳—׳§ ׳©׳•׳׳˜
как я могу это исправить? Благодарность
PHP имеет некоторую поддержку Unicode при работе со строками, но внутри PHP строковый тип является однобайтовым и не поддерживает многобайтовые кодировки. Если вы сохраните файл PHP в формате UTF-8, вы сможете выводить строки в UTF-8 с правильными кодировками HTTP, но многие функции PHP не поддерживают многобайтовые строки. Есть некоторые, которые делают, но все же большинство, которые не делают.
Я просмотрел исходный код PHP, и большинство функций файловой системы, таких как mkdir
, не поддерживают Unicode. Они работают с однобайтовыми строками, поэтому вы получаете тарабарщину ASCII, когда пытаетесь создать каталог.
Вы можете попробовать вызвать setlocale
и установить его в he_IL
перед вызовом mkdir
, чтобы увидеть, имеет ли это какое-то значение.
Чтобы получить больше информации:
Строка представляет собой последовательность символов, где символ совпадает с байтом. Это означает, что PHP поддерживает только набор из 256 символов и, следовательно, не предлагает встроенной поддержки Unicode. См. подробности о типе строки.
Подробности говорят больше о различных кодировках, функциях, поддерживающих многобайтность, и различном поведении в зависимости от того, включена ли в PHP поддержка Zend Multibyte, и как сохранение файлов в разных кодировках влияет на строки в PHP.
К сожалению, в настоящее время я не верю, что вы сможете напрямую создать каталог, содержащий многобайтовые строки в PHP.
Внутри функция mkdir
вызывает эту функцию mkdir в файле.c a>, который вызывает _php_stream_mkdir, который использует plain files wrapper
для вызова php_mkdir_ex, чтобы в конечном итоге создать каталог, используя virtual_mkdir, который использует функцию C mkdir для создания каталога.
Я думаю, что к тому времени, когда он вызывает mkdir для создания каталога в файловой системе, все кодировки были потеряны, и он обрабатывается как однобайтовая строка char *.
Используйте mb_convert_encoding для преобразования имени (строки) из UTF-8 в ISO-8859-8. Я тестировал его с PHP 7 и Windows 10.
В основном вы не можете, если система кодирования вашей ОС не поддерживает эти символы. Иврит также должен быть частью расширенного пакета UTF-8, верно?
Например, в Windows кодовая страница по умолчанию — iso-8859-1, в которой нет иврита.
Я думаю, что переключение на UTF-8 может сработать, так как теперь новая версия Windows позволяет использовать все символы Unicode в именах файлов, но на самом деле это не рекомендуется.