Подтвердить что ты не робот

Как избежать повторения символа 65279 в php?

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

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

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

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

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

echo 'the string'...

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

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

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

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

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

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

Ответ 4

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

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

Ответ 5

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

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

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

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

Ответ 6

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

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

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

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

Ответ 7

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

Ответ 8

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

myString = myString.substring(1)

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

Ответ 9

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

Ответ 10

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

Ответ 11

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

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

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