2012-02-29 2 views
4

Я делаю простой (я думал) список каталогов файлов, например так:Как список файлов со специальными (норвежском) символами

$files = scandir(DOCROOT.'files'); 

foreach($files as $file) 
{ 
    echo ' <li>'.$file.PHP_EOL; 
} 

Проблема файлы содержат НОРВЕЖСКИЕ символы (æ, ø, å), и они почему-то выходят как вопросительные знаки. Почему это?

я могу по-видимому, это исправить, делая это, прежде чем я повторить его (?):

$file = mb_convert_encoding($file, 'UTF-8', 'pass'); 

Но это не имеет никакого смысла для меня, почему это помогает, так как передача должна означать никакое преобразование кодировки символов не выполняется, согласно документации ... * смущен *


Вот пример: http://random.geekality.net/files/index.php

+0

У меня нет ответа, но у меня есть подсказка: попробуйте использовать 'DirectoryIterator' (http://php.net/manual/en/class.directoryiterator.php), это немного более новая часть кода, чем' scandir', он может работать лучше. –

+0

Вы используете Windows? –

+0

@webarto Да, но у меня была такая же проблема на веб-хосте, который работает * nix. – Svish

ответ

1

Похоже, что кодировка имен файлов соответствует ISO Latin 1, но страница интерпретируется по умолчанию с использованием UTF-8. Символы не выходят как «вопросительные знаки», а как символы замены Юникода (). Это означает, что браузер, который пытается интерпретировать поток байтов как UTF-8, столкнулся с байт-недопустимым в UTF-8 и вместо этого вставляет символ в эту точку. Переключите браузер на ISO Latin 1 и посмотрите разницу (View> Encoding> ...).

Так что вам нужно преобразовать строки из ISO Latin 1 в UTF-8, если вы указали, что ваша страница кодируется UTF-8. Используйте для этого mb_convert_encoding($file, 'UTF-8', 'ISO-8859-1').

Почему это работает, если вы указали кодировку $from как pass Я могу только догадываться. Что вы говорите mb_convert_encoding с тем, чтобы конвертировать из pass в UTF-8. Я предполагаю, что mb_convert_encoding принимает значение mb_internal_encoding как кодировку $from, которая является ISO латинской 1. Я полагаю, что она эквивалентна 'auto' при использовании в качестве параметра $from.

+0

Обновлена ​​тестовая страница, чтобы попробовать auto и iso-8859-1 как 'from'. iso-8859-1 действительно работает, но для авто буквы просто исчезают? Также попытался поместить его на другой сервер, и там результаты выглядят как обратное: s -> http://random.geekality.net/files/ – Svish

+0

Одно можно сказать точно: вы должны * знать *, какую кодировку вы «иметь дело с и преобразовывать соответствующим образом. Предоставление части программного обеспечения для автоматического преобразования в произвольные кодировки обязательно даст вам довольно случайные результаты. Почему это ведет себя к этому конкретному виду случайных - это догадка. – deceze

+0

Но если я развернусь на случайном сервере, как я могу узнать, какую кодировку я должен использовать?Я имею в виду, что преобразование из mb_internal_encoding не удалось в одном из моих примеров. – Svish

Смежные вопросы