php mkdir() на иврите создает папку gibrish

Я пытаюсь создать каталог, используя php на английском языке, и он работает. Но когда я пытаюсь на иврите, создается папка на тарабарщине, например: ׳”׳•׳¨׳“׳”| ׳׳©׳—׳§ ׳©׳•׳׳˜

как я могу это исправить? Благодарность


person EtayRock    schedule 28.07.2012    source источник
comment
Я знаю, но как я могу это исправить?   -  person EtayRock    schedule 28.07.2012


Ответы (3)


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, который вызывает _php_stream_mkdir, который использует plain files wrapper для вызова php_mkdir_ex, чтобы в конечном итоге создать каталог, используя virtual_mkdir, который использует функцию C mkdir для создания каталога.

Я думаю, что к тому времени, когда он вызывает mkdir для создания каталога в файловой системе, все кодировки были потеряны, и он обрабатывается как однобайтовая строка char *.

person drew010    schedule 28.07.2012
comment
Спасибо за попытку, но setlocale не сработал. в любом случае, он может создать папку на тарабарщине, но когда я пытаюсь перейти по URL-адресу, он работает на иврите. так что я могу управлять этим. Спасибо! - person EtayRock; 29.07.2012

Используйте mb_convert_encoding для преобразования имени (строки) из UTF-8 в ISO-8859-8. Я тестировал его с PHP 7 и Windows 10.

person BeBest    schedule 21.03.2016

В основном вы не можете, если система кодирования вашей ОС не поддерживает эти символы. Иврит также должен быть частью расширенного пакета UTF-8, верно?

Например, в Windows кодовая страница по умолчанию — iso-8859-1, в которой нет иврита.

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

person Opi    schedule 28.07.2012
comment
Переключиться на UTF-8 где? Я уже пробовал header('Content-Type: text/html; charset=utf-8'); - person EtayRock; 28.07.2012