Как избежать эха характера 65279 в php? (Этот вопрос также относится к Javascript xmlhttp.responseText (ajax))

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

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

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

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

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

echo 'the string'... 

и это, по-видимому, каким-то образом выводит [chr (65279)] строку …

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 echo preg_replace("/\xEF\xBB\xBF/", "", $string); 

В дополнение к вышесказанному, я просто столкнулся с этой проблемой при извлечении некоторых данных из базы данных MySQL (charset установлен в UTF-8) – проблема связана с HTML-тегами, я допустил некоторые базовые, такие как <p> и <a>, когда Я отобразил его на странице, я получил символ & # 65729, просматривающий инструменты Dev в Chrome.

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

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

EDIT: Используя VIM, я смог удалить спецификацию с помощью :set nobomb и вы можете подтвердить наличие спецификации :set bomb? который будет отображать либо bomb либо nobomb

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

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

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

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

Наверное, что-то на сервере. Если вы знаете, что это там, я бы просто обошел его, пока не решился.

myString = myString.substring(1)

Отбивает первый символ.

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

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