Intereting Posts
PHP – запрашивать одно значение для каждой итерации или извлекать все при запуске и извлекать из массива? PHP-скрипт для вычисления Alpha Криппендорфа Включить JUST-файлы в массив scandir? неправильный порядок php mysql по метке времени PHP JAXB Эквивалент Как читать значения подгрупп из файла .ini в java? Я не могу сохранить дату, используя datepicker в моей базе данных я хочу получить общее количество пользователей заданных идентификаторов направления в таблице Не удалось открыть входной файл composer.phar в Windows 7 Разделение числа на случайные неравные части преобразовать массив в отдельные строки Настройка заголовков ответов с промежуточным программным обеспечением в Lumen Удалить cookie сеанса facebook из моего приложения при выходе из системы Как создать учетную запись электронной почты в Cpanel через PHP? Отключить или ускорить индексацию DLTK в Eclipse PDT?

Подпись UTF-8 BOM в файлах PHP

Я писал некоторые комментируемые классы PHP, и я наткнулся на проблему. Мое имя (для тега @author) заканчивается символом ș (который является символом UTF-8, … и странным именем, я знаю).

Хотя я сохраняю файл как UTF-8, некоторые друзья сообщили, что они видят, что персонаж полностью перепутался ( È™ ). Эта проблема уходит, добавляя подпись спецификации. Но эта вещь немного меня беспокоит, поскольку я не знаю об этом много, кроме того, что я видел в Википедии, и о некоторых других подобных вопросах здесь, на SO.

Я знаю, что он добавляет некоторые вещи в начале файла, и из того, что я понял, это не так уж плохо, но меня беспокоит, потому что единственные проблемные сценарии, которые я читал, касались файлов PHP. И поскольку я пишу классы PHP для их совместного использования, то на 100% совместимость важнее, чем мое имя в комментариях.

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

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

Я считаю, что проблема заключается в настройках редактора вашего и вашего друга. Без спецификации, редактор вашего друга не может автоматически распознавать файл как UTF-8. Он может попытаться настроить свой редактор таким образом, что редактор ожидает, что файл будет находиться в UTF-8 (если вы используете реальную среду IDE, такую ​​как NetBeans, тогда это может быть даже сделана настройка проекта, которую вы можете перенести вместе с кодом) ,

Альтернатива – попробовать некоторые трюки: некоторые редакторы пытаются определить кодировку, используя некоторые эвристики на основе введенного текста. Вы можете попытаться запустить каждый файл с помощью

 <?php //Úτƒ-8 encoded 

и, возможно, эвристика это получит. Там, вероятно, лучше всего добавить туда, и вы можете либо Google, для каких эвристик обнаружения кодирования, или просто попробовать некоторые из них 🙂

В целом, я рекомендую только установить настройки редактора.

О, подождите, я неправильно прочитал последнюю часть: для распространения кода в любом месте, я думаю, вы безопаснее всего, чтобы все файлы содержали только более низкие 7-битные символы, то есть простой ASCII, или просто принять, что некоторые люди с древними редакторами видят ваше имя написано смешно. Нет отказоустойчивого пути. Спецификация определенно плоха из-за уже отправленных заголовков. С другой стороны, до тех пор, пока вы добавляете только символы UTF-8 в комментарии, и поэтому единственное влияние некоторых редакторов на непонимание кодировки – это странные символы. Я бы правильно написал ваше имя и добавил комментарий, ориентированный на эвристику, чтобы большинство редакторов его получили, но всегда найдутся люди, которые вместо этого найдут фиктивные символы.

BOM приведет к тому, что Headers already sent ошибку, поэтому вы не можете использовать спецификацию в файлах PHP

Это старый пост и уже был дан ответ, но я могу оставить вам некоторые другие ресурсы, которые я нашел, когда столкнулся с этой проблемой спецификации.

http://people.w3.org/rishida/utils/bomtester/index.php с этой страницей вы можете проверить, содержит ли конкретный файл спецификацию.

Существует также удобный скрипт, который выводит все файлы с спецификацией в ваш текущий каталог.

 <?php function fopen_utf8 ($filename) { $file = @fopen($filename, "r"); $bom = fread($file, 3); if ($bom != b"\xEF\xBB\xBF") { return false; } else { return true; } } function file_array($path, $exclude = ".|..|design", $recursive = true) { $path = rtrim($path, "/") . "/"; $folder_handle = opendir($path); $exclude_array = explode("|", $exclude); $result = array(); while(false !== ($filename = readdir($folder_handle))) { if(!in_array(strtolower($filename), $exclude_array)) { if(is_dir($path . $filename . "/")) { // Need to include full "path" or it's an infinite loop if($recursive) $result[] = file_array($path . $filename . "/", $exclude, true); } else { if ( fopen_utf8($path . $filename) ) { //$result[] = $filename; echo ($path . $filename . "<br>"); } } } } return $result; } $files = file_array("."); ?> 

Я нашел этот код на php.net

Dreamweaver также помогает в этом, он дает вам возможность сохранить файл и не включать в него материал спецификации

Его поздний ответ, но я все еще надеюсь, что это поможет. до свидания

Просто, чтобы вы знали, есть опция в php, zend.multibyte , которая позволяет php читать файлы с BOM без предоставления Headers already sent ошибки Headers already sent .

Из файла php.ini:

 ; If enabled, scripts may be written in encodings that are incompatible with ; the scanner. CP936, Big5, CP949 and Shift_JIS are the examples of such ; encodings. To use this feature, mbstring extension must be enabled. ; Default: Off ;zend.multibyte = Off 

В PHP, помимо ошибки «заголовки уже отправлены», наличие спецификации может также испортить HTML в браузере более тонким образом.

См. Эту ссылку для описания проблемы.

Когда это происходит, не только обычно появляется заметное пространство в верхней части страницы, но, если вы проверяете HTML в Firefox или Chrome, вы можете заметить, что раздел главы пуст, и его элементы, по-видимому, находятся в теле. Конечно, источник просмотра покажет все, где он должен быть, но каким-то образом браузер интерпретирует это неправильно.

Или вы можете активировать буферизацию вывода в php.ini, которая решит проблему с «заголовками уже отправленных». Также очень важно использовать буферизацию вывода для производительности, если ваш сайт имеет значительную нагрузку.

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

В случае файлов PHP это не файл, а сгенерированный вывод, который отправляется как ответ, поэтому, очевидно, не рекомендуется сохранять все файлы PHP с помощью спецификации в начале, но это не значит, что вы не должны использовать спецификацию в вашем ответе.

Фактически вы можете безопасно ввести следующий код непосредственно перед объявлением doctype (в случае, если вы генерируете HTML как ответ):

<?="\xEF\xBB\xBF"?>

Для дальнейшего чтения: https://www.w3.org/International/questions/qa-byte-order-mark#transcoding