Я создаю папку следующим образом.
function create(){ if ($this->input->post('name')){ ... ... $folder = $this->input->post('name'); $folder = strtolower($folder); $forbidden = array(" ", "å", "ø", "æ", "Å", "Ø", "Æ"); $folder = str_replace($forbidden, "_", $folder); $folder = 'images/'.$folder; $this->_create_path($folder); ...
Однако он не заменяет норвежский символ _ (под баром)
Например, Åtest øre создаст папку под названием ã … test_r¸re.
у меня есть
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
в заголовке.
Я использую PHP / codeigniter на XAMPP / Windows Vista.
Как я могу решить эту проблему?
Использовать это.
$string = $this->input->post('name'); $regexp = '/( |å|ø|æ|Å|Ø|Æ|Ã¥|ø|æ|Ã…|Ø|Æ)/iU'; $replace_char = '_';
Вы должны помнить, что сохраните свой PHP-файл в правильной кодировке. Попробуйте сохранить его в ISO-8859-1 или UTF8. Также не забудьте повторно открыть его после сохранения, чтобы вы могли убедиться, что он сохранен правильно или символы были преобразованы. Ваша IDE может конвертировать их в байты (странные символы) без отображения изменений в редакторе.
Попробуйте явно установить внутреннюю кодировку, используемую PHP:
mb_internal_encoding('UTF-8');
Изменить: на самом деле, теперь, когда я думаю об этом … Я бы посоветовал использовать strtr
. Он поддерживает многобайтовые символы и будет намного быстрее:
$from = ' åøæÅØÆ'; $to = '_______'; $fixed = strtr($string, $from, $to);
Большинство нормальных строковых функций не обрабатывают символы Unicode, если вообще.
В этой ситуации вы можете использовать регулярное выражение, чтобы обойти это.
<?php $string = 'Åtest øre'; $regexp = '/( |å|ø|æ)/iu'; $replace_char = '_'; echo preg_replace($regexp, $replace_char, $string) ?>
Возвращает:
_test__re
Интерфейс, который вы получаете в файловой системе Windows с PHP, является стандартной библиотекой C. Windows сопоставляет схему именования файловой системы Unicode в байтах для PHP, используя кодовую страницу по умолчанию. Вероятно, ваша системная кодовая страница по умолчанию – 1252 западноевропейская, если вы находитесь в Норвегии, но это деталь развертывания, которая может измениться, когда вы переместите ее на живой сервер, и это не то, что легко исправить.
Ваша кодировка страницы / сайта – UTF-8. К сожалению, в то время как современные Linux-серверы обычно используют UTF-8 в качестве кодировки доступа к файловой системе, Windows не может, потому что кодовая страница по умолчанию никогда не является UTF-8. Вы можете преобразовать строку UTF-8 в cp1252 с помощью iconv ; естественно, все символы, которые не соответствуют этой кодовой странице, будут потеряны или искажены. Альтернативой было бы заставить весь сайт использовать charset=iso-8859-1
, который может (в большинстве случаев) быть сохранен в cp1252. Немного назад, чтобы использовать кодировку, отличную от UTF-8, хотя и, конечно, она все равно сломается, если вы развернете ее на машине с использованием другой кодовой страницы по умолчанию.
По этой причине и другие имена файлов сложны. Вы должны сделать все возможное, чтобы избежать создания имени файла из произвольной строки. Есть еще много символов, которые вам нужно будет блокировать, чтобы строка соответствовала имени файла в Windows и избегала атак на обход каталога. Намного лучше хранить идентификатор типа 123.jpeg
в файловой системе и использовать перезапись сценариев или переписывание URL, если вы хотите, чтобы он отображался под другим именем строки.
Если вы должны сделать имя файла с поддержкой Windows с произвольной строкой, было бы проще сделать что-то похожее на создание slug: preg_replace прочь всех символов (Unicode или иначе), которые не подходят для известных безопасных, таких как `[A-Za -z0-9_-], проверьте, что результат не пуст и не соответствует одному из плохих имен файлов (если это так, добавьте подчеркивание) и, наконец, добавьте расширение.