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

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

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

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

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

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

echo 'the string'...

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

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

9 ответов

Решение

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

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

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

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

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

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

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

Если вы используете 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, перейдите в корень папки вашего проекта и выполните команду, чтобы найти файлы с BOM. Если какой-либо файл найден, выполните процедуру, описанную выше, в четыре этапа.

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

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

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

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

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

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

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

Я использую IDE PhpStorm для разработки страниц php.

У меня была эта проблема, и я использовал эту опцию IDE, чтобы удалить любые BOM персонажи и проблема решена:

File -> Remove BOM

Попробуйте найти такие варианты в своей IDE.

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

myString = myString.substring(1)

Отрубает первый персонаж.

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

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

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

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

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

Другие вопросы по тегам