Кодировка в UTF-8 из PHP - PullRequest
       18

Кодировка в UTF-8 из PHP

2 голосов
/ 25 августа 2009

Я не очень хорошо разбираюсь в кодировке, но я даже падаю с основами здесь.

Я пытаюсь создать файл, который распознается как UTF-8

header("Content-Type: text/plain; charset=utf-8");
header("Content-disposition: attachment; filename=test.txt");
echo "test";
exit();

также пытался

header("Content-Type: text/plain; charset=utf-8");
header("Content-disposition: attachment; filename=test.txt");
echo utf8_encode("test");
exit();

Затем я открываю файл с помощью Notepad ++ и он говорит, что его текущая кодировка - ANSI, а не UTF-8, чего мне не хватает, как мне выводить этот файл.

В конечном итоге я выведу XML-файл продуктов для программы Affiliate Window. Также, если это помогает Мой веб-сервер - Centos, Apache2, PHP 5.2.8.

Заранее спасибо за любую помощь!

Ответы [ 6 ]

7 голосов
/ 25 августа 2009

Как сказал Филип, кодировка не является внутренним атрибутом файла; Это неявно. Это означает, что, если вы не знаете, в какой кодировке должен интерпретироваться файл, определить его невозможно. Лучшее, что вы можете сделать, это сделать предположение. Это, вероятно, то, что делают такие программы, как Notepad ++. Поскольку фактические данные, которые вы отправили, могут интерпретироваться во многих различных кодировках, он просто выбирает кандидата, который ему нравится больше всего. Для Notepad ++ это выглядит как ANSI (что само по себе является довольно неточной классификацией), тогда как другие программы могут по умолчанию использовать что-то еще.

Причина, по которой вы должны указать кодировку в HTTP-заголовке, заключается именно в том, что сам файл не содержит эту информацию, поэтому браузер должен быть проинформирован об этом. После сохранения файла на диск эта информация становится недоступной.

Если файл, который вы собираетесь обслуживать, является XML-документом, у вас есть возможность поместить информацию о кодировке в фактический документ. Таким образом, он сохраняется после сохранения файла на диск. Например. если вы используете utf-8, вы должны поместить это в верхней части документа:

<?xml version="1.0" encoding="utf-8" ?>

Обратите внимание, что помимо передачи мета-информации о кодировке, вам также необходимо убедиться, что данные, которые вы обслуживаете, действительно кодируются в формате utf-8. Это почти тот же сценарий: вам нужно неявно знать, в какой кодировке находятся ваши данные. Функция utf8_encode (несмотря на название) явно предназначена для преобразования iso-8859-1 в utf-8. Таким образом, если вы используете его для уже кодированных данных utf-8, вы получите его в двойном кодировании с результатом искаженных данных.

Кодировки не так уж сложны сами по себе. Проблема в том, что, если вы не будете осторожны, вы все испортите. Всякий раз, когда у вас есть строка, вы должны быть абсолютно уверены, что знаете, в какой кодировке она находится. В противном случае это не строка - это просто двоичный объект двоичных данных.

6 голосов
/ 25 августа 2009

test - это все ASCII. Так что для этого не нужно использовать UTF-8.

Но на самом деле первые 128 символов кодировки Unicode совпадают с кодировкой ASCII. И UTF-8 использует тот же код для этих символов, что и ASCII. См. описание Википедии UTF-8 для дальнейшей информации.

5 голосов
/ 25 августа 2009

После загрузки файла он больше не несет информацию о кодировке, поэтому Notepad ++ должен угадать его по содержимому. Есть вещь под названием Byte-Order-Mark, которая позволяет указывать кодировки UTF по префиксу в содержимом.

См. Вопрос «Когда используется спецификация, она только в 16-битном тексте Unicode?» .

Я бы предположил, что использование чего-то вроде echo "\xEF\xBB\xBF" перед записью реального содержимого заставит Notepad ++ правильно распознать файл.

2 голосов
/ 25 августа 2009

Не существует такой вещи, как заголовки для загруженных txt-файлов. Когда вы все равно попытаетесь создать XML-файлы и можете указать кодировку в объявлении XML, попробуйте создать простую XML-структуру и сохранить / открыть ее, тогда она должна работать, если ОС поддерживает utf-8 , который должен иметь любой современный дистрибутив Linux.

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