Как избежать повторения символа 65279 в php? - PullRequest
33 голосов
/ 30 июня 2011

Я столкнулся с подобной проблемой, описанной здесь (и в других местах) - где при обратном вызове ajax я получаю xmlhttp.responseText, который кажется нормальным (когда я его предупреждаю - он показывает правильный текст) - но при использовании оператора 'if' для сравнения его со строкой - возвращается false.

(я также написал код на стороне сервера, возвращающий эту строку) - после большого изучения строки- Я обнаружил, что строка имела «невидимый символ» в качестве первого символа.Персонаж, который не был показан.Если я скопировал его в Блокнот - затем удалил первый символ - он не будет удален, пока снова не нажмем Удалить.

Я сделал charCodeAt (0) для возвращенной строки в xmlhttp.responseText.И он вернул 65279 .

Поиск в Google показывает, что это какой-то управляющий символ UTF-8, который должен устанавливать кодировку "big-endian" или "small-endian".

Итак, теперь я знаю причину проблемы - но ... почему этот персонаж повторяется?В исходном php я просто использую

echo 'the string'...

, и он, очевидно, как-то выводит [chr (65279)] строку ...

Почему?И как мне этого избежать?

Ответы [ 11 ]

77 голосов
/ 01 июля 2011

В заключение и укажите решение:

Блокнот Windows добавляет символ спецификации (3 байта: EF BB BF) к файлам, сохраненным в кодировке utf-8.

PHP не делает 'Это, кажется, беспокоит его - если вы не включите один php-файл в другой - тогда все станет беспорядочно и строки будут отображаться с символом (65279), к которому добавлен символ.

Вы можете редактировать файл с помощью другого текстового редактора,как Notepad ++ и использовать кодировку«Кодировать в UTF-8 без BOM»,и это, кажется, решает проблему.

Кроме того, вы можете сохранить другой файл php с кодировкой ANSI в блокноте - и это также, похоже, работает (то есть, если вы на самом деле не используете никаких расширенных символовв файле, наверное ...)

4 голосов
/ 25 ноября 2015

Если вы используете Linux или Mac, вот элегантное решение для избавления от персонажа в PHP.

Если вы используете WordPress (25% интернет-сайтов работают на WordPress), есть вероятность, что плагин или активная тема вводят символ спецификации из-за файла, который содержит спецификацию (возможно, этот файл был отредактирован в Windows) , Если это так, перейдите в папку wp-content / themes / и выполните следующую команду:

grep -rl $'\xEF\xBB\xBF' .

Это будет искать файлы с спецификацией. Если в списке есть результаты .php, сделайте следующее:

  1. Переименуйте файл в что-то вроде filename.bom.bak.php
  2. Откройте файл в редакторе и скопируйте содержимое в буфер обмена.
  3. Создайте новый файл и вставьте содержимое из буфера обмена.
  4. Сохраните файл с исходным именем filename.php

Если вы имеете дело с этим локально, то в конечном итоге вам потребуется повторно загрузить новые файлы на сервер.

Если у вас нет результатов после выполнения команды grep, и вы используете WordPress, тогда другим местом для проверки файлов спецификации является папка / wp-content / plugins. Идите туда и снова введите команду. Кроме того, вы можете начать деактивацию всех плагинов, а затем проверить, решена ли проблема при повторной активации плагинов.

Если вы не используете WordPress, перейдите в корень папки вашего проекта и выполните команду, чтобы найти файлы с спецификацией. Если какой-либо файл найден, выполните процедуру, описанную выше, в четыре этапа.

4 голосов
/ 01 сентября 2015

Если вы хотите напечатать строку, содержащую символ ZERO WIDTH NO-BREAK SPACE (например, путем включения внешнего файла, отличного от PHP), попробуйте следующий код:

echo preg_replace("/\xEF\xBB\xBF/", "", $string);
3 голосов
/ 20 февраля 2012

Вы также можете удалить символ в javascript с помощью:

myString = myString.replace(String.fromCharCode(65279), "" );

2 голосов
/ 30 сентября 2015

У меня была эта проблема, и я изменил свою кодировку на utf-8 без Bom, Ansi и т. Д. Без удачи.Моя проблема была вызвана использованием функции php include в теле html.Перемещение функции включения выше моего html (над тегом! DOCTYPE) решило проблему.

После того, как я узнал, что моя проблема, которую я протестировал, включает в себя include_once и требуют функции.Все попытки включить файл из html-тела создавали дополнительный символ mis в том месте, где должен начинаться код PHP.

Я также пытался присвоить результат включения переменной ... т.е.$ result = include ("myfile.txt");с добавлением того же дополнительного символа

Обратите внимание, что перемещение включаемого выше HTML-кода не приведет к удалению дополнительного символа из отображения, однако оно удалит его из моих данных и из области содержимого.

1 голос
/ 30 марта 2016

Я использую «Dreamweaver CC 2015», по умолчанию у него включена эта опция: «включить подпись спецификации» или что-то подобное, когда вы нажимаете кнопку «Сохранить как» в меню «Файл».В открывшемся окне вы можете увидеть «Параметры Unicode ...».Вы можете отключить параметр спецификации.И не забудьте изменить все ваши файлы, как это.Или вы можете просто перейти к настройкам и отключить опцию BOM и сохранить все свои файлы.

1 голос
/ 02 июля 2015

В дополнение к вышесказанному, у меня только что была эта проблема при извлечении некоторых данных из базы данных MySQL (кодировка установлена ​​в UTF-8) - проблема заключалась в тегах HTML, я допустил некоторые основные, такие как

и Когда я отобразил его на странице, у меня появился символ looking, просматривающий Dev Tools в Chrome.

Поэтому я удалил теги из таблицы, и это устранило проблему ? (и пустую строку над полем гдетекст должен был быть отображен.

Я просто хотел добавить к этому, так как мой представитель недостаточно высок, чтобы фактически комментировать ответ.

РЕДАКТИРОВАТЬ: Используя VIM, я смогудалите спецификацию с помощью :set nobomb, и вы можете подтвердить наличие спецификации с помощью :set bomb?, которая будет отображать либо bomb, либо nobomb

0 голосов
/ 26 апреля 2019

Мое решение - создать php-файл с содержанием:

<?php
header("Content-Type:text/html;charset=utf-8");
?>

Сохраните его как ANSI, тогда другой файл php потребует / включит его перед любым кодом HTML или php

0 голосов
/ 11 января 2019

Решение Linux для поиска и удаления этого символа из файла заключается в использовании sed -i 's/\xEF\xBB\xBF//g' your-filename-here

0 голосов
/ 22 ноября 2016

При использовании атома это пробел в начале документа перед <?php

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