Выход PHP, показывающий маленькие черные алмазы с вопросительным знаком

Я пишу php-программу, которая извлекает из источника базы данных. Некоторые из varchars имеют кавычки, которые отображаются в виде черных бриллиантов с вопросительным знаком в них ( , REPLACEMENT CHARACTER , я предполагаю из текста Microsoft Word).

Как я могу использовать php для удаления этих символов?

Если вы видите этот символ («U + FFFD» REPLACEMENT CHARACTER »), это обычно означает, что сам текст кодируется в виде одного байтового кодирования, но интерпретируется в одном из кодировок Unicode (UTF8 или UTF16).

Если бы это было наоборот, было бы (обычно) выглядеть примерно так: ä.

Возможно, исходная кодировка – ISO-8859-1, также известная как Latin-1. Вы можете проверить это, не меняя сценарий: Браузеры дают вам возможность повторно интерпретировать страницу в другой кодировке – в Firefox используется «Просмотр» -> «Кодировка символов».

Чтобы браузер использовал правильную кодировку, добавьте HTTP-заголовок следующим образом:

header("Content-Type: text/html; charset=ISO-8859-1"); 

или поместить кодировку в метатег:

 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 

В качестве альтернативы вы можете попробовать прочитать из базы данных в другой кодировке (желательно UTF-8) или преобразовать текст с помощью iconv() .

Это проблема с кодировкой. Таким образом, он может ошибиться на разных уровнях, но, скорее всего, строки в вашей базе данных кодируются utf-8, и вы представляете их как iso-8859-1. Или наоборот.

Правильный способ исправить эту проблему состоит в том, чтобы получить ваши наборы символов прямо. Простейшая стратегия, поскольку вы используете PHP, заключается в использовании iso-8859-1 во всем приложении. Для этого вы должны убедиться, что:

  • Все исходные файлы PHP сохраняются как iso-8859-1 (Не путать с cp-1252).
  • Ваш веб-сервер настроен на обслуживание файлов с charset=iso-8859-1
  • Кроме того, вы можете переопределить настройки веб-серверов из PHP-документа, используя header .
  • Кроме того, вы можете вставить метатег в HTML, который указывает то же самое, но это не является строго необходимым.
  • Вы также можете указать атрибут accept-charset для своих элементов <form> .
  • Таблицы базы данных определяются с кодировкой как latin1
  • Соединение с базой данных между PHP и базой данных установлено на latin1

Если у вас уже есть данные в вашей базе данных, вы должны знать, что они, вероятно, уже запутались. Если вы еще не на стадии производства, просто протрите все и начните. В противном случае вам придется выполнять некоторую очистку данных.

Заметка о мета-тэгах, поскольку все неправильно понимают, что они собой представляют:

Когда веб-сервер обслуживает файл (HTML-документ), он отправляет некоторую информацию, которая не отображается непосредственно в браузере. Это называется HTTP-заголовками. Одним из таких заголовков является заголовок Content-Type , который задает Content-Type файла (Eg. text/html ), а также кодировку (aka charset). Хотя большинство веб-серверов отправляют заголовок Content-Type с информацией о charset , это необязательно. Если его нет, браузер будет интерпретировать любые метатеги с помощью http-equiv="Content-Type" . Важно понимать, что метатег интерпретируется только в том случае, если веб-сервер не отправляет заголовок. На практике это означает, что он используется только в том случае, если страница сохраняется на диске и затем открывается оттуда.

На этой странице есть очень хорошее объяснение этих вещей.

Я также столкнулся с этой проблемой. Между тем я столкнулся с тремя случаями, когда это произошло:

  1. зиЬзЬг ()

    Я использовал substr() в строке UTF8, которая вырезала символы UTF8, поэтому вырезанные символы не могли быть отображены правильно. Используйте mb_substr($utfstring, 0, 10, 'utf-8'); вместо. кредиты

  2. htmlspecialchars ()

    Другая проблема заключалась в использовании htmlspecialchars() в строке UTF8. Исправление заключается в использовании: htmlspecialchars($utfstring, ENT_QUOTES, 'UTF-8');

  3. preg_replace ()

    Наконец, я узнал, что preg_replace() может привести к проблемам с UTF. Код $string = preg_replace('/[^A-Za-z0-9ÄäÜüÖöß]/', ' ', $string); например, преобразовали строку UTF «F (×) = 2 × -3» в «F 2 ». Исправлено использование mb_ereg_replace() .

Надеюсь, эта дополнительная информация поможет избавиться от таких проблем.

Основываясь на вашем описании проблемы, данные в вашей базе данных почти наверняка закодированы как Windows-1252 , и ваша страница почти наверняка будет служить ISO-8859-1 . Эти два набора символов эквивалентны, за исключением того, что Windows-1252 имеет 16 дополнительных символов, которых нет в ISO-8859-1, включая левые и правые фигурные кавычки.

Предполагая, что мой анализ верен, самым простым решением является обслуживание вашей страницы как Windows-1252. Это будет работать, потому что все символы, которые находятся в ISO-8859-1, также находятся в Windows-1252. В PHP вы можете изменить кодировку следующим образом:

 header('Content-Type: text/html; charset=Windows-1252'); 

Тем не менее, вам действительно нужно проверить, какую кодировку символов вы используете в своих HTML-файлах и содержимом вашей базы данных, и следите за тем, чтобы они были последовательными или правильно конвертировались там, где это невозможно.

Чтобы ваше соединение MYSQL установлено на UTF-8 (или latin1, в зависимости от того, что вы используете), вы можете сделать это, чтобы:

 $con = mysql_connect("localhost","username","password"); mysql_set_charset('utf8',$con); 

или используйте это, чтобы проверить, какую кодировку вы используете:

 $con = mysql_connect("localhost","username","password"); $charset = mysql_client_encoding($con); echo "The current character set is: $charset\n"; 

Подробнее здесь: http://php.net/manual/en/function.mysql-set-charset.php

Как упоминалось в более ранних ответах, это происходит потому, что ваш текст был записан в базу данных в кодировке iso-8859-1 или в любом другом формате.

Поэтому вам просто нужно преобразовать данные в utf8 перед его выходом.

 $text = “string from database”; $text = utf8_encode($text); echo $text; 

Я решил снять эти символы из строки, сделав это –

 ini_set('mbstring.substitute_character', "none"); $text= mb_convert_encoding($text, 'UTF-8', 'UTF-8'); 

Попробуйте это пожалуйста

mb_substr ($ description, 0, 490, "UTF-8");

Это может быть вызвано несоответствием Unicode или другого набора символов. Попробуйте изменить кодировку в своем браузере, в настройках текст будет выглядеть нормально. Тогда вопрос о том, как конвертировать содержимое вашей базы данных в кодировку, которую вы используете для отображения. (Это может быть просто добавление инструкции charset utf-8 к вашему выводу.)

то, что я закончил делать в конце после того, как я исправил свои таблицы, было его резервное копирование и изменение настроек на utf-8, тогда я изменил файл дампа, чтобы DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci – мои записи набора символов

теперь у меня больше нет проблем с символами, потому что база данных и браузер – utf8.

Я понял, что вызвало это. Это эффект веб-страницы + браузера на БД. На терминалах, которые являются linux (ubuntu + firefox), он кодирует базу данных в latin1, что и задает табуляции. Но на окнах 10 + крайних терминалов записи были закодированы в utf8. Также я заметил, что у окон 10 проблемы остались с latin1, поэтому я решил согнуть ветер и преобразовать все в utf8.

Я подумал, что это вопрос Windows 10, потому что мы начали использовать терминалы win 10. так что опять-таки ошибки в Майкрософт вызывают проблемы. Я до сих пор не знаю, почему изменяется кодировка в формах, потому что браузер в Windows 10 показывает набор символов latin1, но когда он идет в кодировке utf8, и я получаю аномалию данных. но в linux + firefox это не делает.

Для глобальных целей.

Вместо того, чтобы конвертировать, кодировать, декодировать каждый текст, я предпочитаю, чтобы они были такими, какие они есть, и вместо этого изменять настройки php сервера. Так,

  1. Пусть алмазы
  2. В браузере в меню просмотра выберите «текстовое кодирование» и найдите тот, который позволит вам правильно видеть текст.
  3. Измените свой php.ini и добавьте:

    default_charset = "ISO-8859-1"

или вместо ISO-8859, который соответствует вашему текстовому кодированию.

Вы также можете изменить набор символов в своем браузере. Только для причин отладки.

Использование той же кодировки (как предложено здесь) как в базе данных, так и в HTML не работает для меня … Поэтому, помня, что код генерируется как HTML, я решил использовать &quot; (HTML-код) или &#34; (Код ISO Latin-1) в тексте моей базы данных, где использовались котировки. Это позволило решить проблему, предоставив мне кавычку. Странно отметить, что до этого решения только некоторые из кавычек и апострофов отображались некорректно, в то время как другие делали, однако, специальный код действительно работал во всех случаях.

Я запустил код «обнаружить кодировку» после изменения сортировки в phpmyadmin, и теперь он появляется как Latin_1.

но вот что-то, что я натолкнулся на поиск другой аномалии данных в моем приложении и как я ее исправил:

Я просто импортировал таблицу с смешанным кодированием (с алмазными вопросительными знаками в некоторых строках, и все они были в одном столбце.), Вот мой код исправления. Я использовал процесс utf8_decode, который принимает неопределенный placeholder и присваивает простой вопросительный знак вместо «алмазного вопросительного знака», после чего я использовал str_replace, чтобы заменить вопросительный знак пробелом между кавычками. здесь [код]

  include 'dbconnectfile.php'; //// the variable $db comes from my db connect file /// inx is my auto increment column /// broke_column is the column I need to fix $qwy = "select inx,broke_column from Table "; $res = $db->query($qwy); while ($data = $res->fetch_row()) { for ($m=0; $m<$res->field_count; $m++) { if ($m==0){ $id=0; $id=$data[$m]; echo $id; }else if ($m==1){ $fix=0; $fix=$data[$m]; $fix = utf8_decode($fix); $fixx =str_replace("?"," ",$fix); echo $fixx; ////I echoed the data to the screen because I like to see something as I execute it :) } } $insert= "UPDATE Table SET broke_column='".$fixx."' where inx='".$id."'"; $insresult= $db->query($insert); echo"<br>"; } ?> 

Это случилось в моем случае:

 $text = utf8_decode($text) 

Я превращаю черный алмазный персонаж в знак вопроса, чтобы вы могли:

 $text = str_replace('?', '', utf8_decode($text)); 

Добавьте эту функцию в переменные utf8_encode ($ ваша переменная);

Просто добавьте эти строки перед заголовками.

Будет .doc/docx точный формат файлов .doc/docx :

  if(ini_get('zlib.output_compression')) ini_set('zlib.output_compression', 'Off'); ob_clean(); 

Когда вы извлекаете данные из любого места, вы должны использовать функции с префиксом md_FUNC_NAME .

Если бы та же проблема помогла мне.

Или вы можете найти код этого символа и использовать regexp для удаления этих символов.

Перейдите на свой phpmyadmin и выберите свою базу данных и просто увеличьте длину / значение поля этой таблицы до 500 или 1000, это решит вашу проблему.

Это поможет вам. Поместите этот <head>

 <meta charset="iso-8859-1">