Как вывести список файлов со специальными (норвежскими) символами - PullRequest
4 голосов
/ 01 марта 2012

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

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

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

Проблема в том, что файлы содержат норвежские символы (æ, ø, å), и они по какой-то причине появляются в виде вопросительных знаков. Почему это?

Я могу, по-видимому, исправить (?) Это, выполнив это до того, как вывести его на экран:

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

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


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

1 Ответ

1 голос
/ 02 марта 2012

Похоже, кодировка имен файлов указана в 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 Latin 1. Я предполагаю, что оно эквивалентно 'auto' при использовании в качестве параметра $from.

...