Проблема чтения акцентированных символов в PHP - PullRequest
0 голосов
/ 14 апреля 2009

Есть странная проблема в PHP земли. Вот урезанный пример:

    $handle = fopen("file.txt", "r");
    while (($line = fgets($handle)) !== FALSE) {
        echo $line;
    }
    fclose($handle);

Например, если у меня есть файл, который выглядит следующим образом:

Lucien Frégis

Затем приведенный выше код, запускаемый из командной строки, выдает то же имя, но вместо острой ошибки я получаю:

Lucien FrÚgis

Глядя на шестнадцатеричный дамп файла, я вижу, что рассматриваемый байт - это E9, что я и ожидал бы для острой точки в кодировке php по умолчанию (ISO-8859-1), что подтверждается выводом текущего значения default_charset .

Есть мысли?

EDIT:

Как и предполагалось, я проверил кодовую страницу Windows и, по-видимому, ее 850, которая устарела (но объясняет, почему 0xE9 отображается таким, какой он есть ...)

Ответы [ 3 ]

2 голосов
/ 14 апреля 2009

0xE9 - кодировка для é в iso-8859-1. Это также кодовая точка Unicode для того же символа. Если ваша консоль интерпретирует выходные данные в другой кодировке (например, cp-850), то один и тот же байт будет преобразован в другую кодовую точку, отображая на экране другой символ. Если вы посмотрите на кодовую страницу для cp-850 , вы увидите, что байт 0xE9 преобразуется в Ú (кодовая точка Unicode 0xDA). Таким образом, ваша консоль неправильно интерпретирует байты. Я не знаю как, но вы должны изменить кодировку вашей консоли на iso-8859-1.

0 голосов
/ 14 апреля 2009

Перед запуском вашего php в командной строке попробуйте выполнить команду:

chcp 1252

Это изменит кодовую страницу на ту, где символы с акцентом будут такими, как вы ожидаете.

См. Следующие ссылки для различия между кодовыми страницами 850 и 1252:

http://en.wikipedia.org/wiki/Code_page_850

http://en.wikipedia.org/wiki/Windows-1252

0 голосов
/ 14 апреля 2009

Акцент может считаться данными Юникода, и вам придется хранить его как таковой. Взгляните на функции utf_decode, utf_encode и iconv.

Не нужно ждать, он находится в кодировке ISO 8859-1 . Я не знаю. Вы пробовали читать в двоичном режиме или с помощью file_get_contents?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...