Как избежать повторения символа 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)] строку...
Почему? И как я могу избежать этого?
Ответы
Ответ 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