Как избежать повторения символа 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 в списке, то сделайте это:
- Переименуйте файл в что-то вроде filename.bom.bak.php
- Откройте файл в вашем редакторе и скопируйте содержимое в буфер обмена.
- Создайте новый файл и вставьте содержимое из буфера обмена.
- Сохраните файл с оригинальным именем 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 не приведет к удалению дополнительного символа из списка, однако оно удалит его из моих данных и из области содержимого.
В дополнение к вышесказанному, у меня просто была эта проблема при извлечении некоторых данных из базы данных MySQL (кодировка установлена в UTF-8) - проблема заключалась в тегах HTML, я допустил некоторые основные, такие как
Поэтому я удалил теги из таблицы, и это устранило проблему & # 65729 (и пустую строку над тем местом, где должен был отображаться текст.
Я просто хотел добавить к этому, так как мой представитель недостаточно высок, чтобы фактически комментировать ответ.
РЕДАКТИРОВАТЬ: С помощью VIM я смог удалить спецификацию с :set nobomb
и вы можете подтвердить наличие спецификации с :set bomb?
который будет отображать либо bomb
или же nobomb
Я использую "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