Вывод PHP показывает маленькие черные ромбики с вопросительным знаком

Я пишу программу php, которая извлекает из источника базы данных. У некоторых варчаров есть кавычки, которые отображаются в виде черных ромбов с вопросительным знаком (�, ЗАМЕНА ХАРАКТЕРА, я полагаю, из текста Microsoft Word).

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

Не снимайте их, исправьте время. См. Также «черный бриллиант» в stackoverflow.com/questions/38363566/…

Rick James 21.04.2019 08:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
82
1
137 197
21

Ответы 21

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

Если вы видите этот символ (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().

Пока это наиболее близкое решение. Однако теперь у меня есть мета: <meta http-Equiv = "Content-Type" content = "text / html; charset = UTF-8">, и я использую iconv для преобразования из iso-8859-1 в utf- 8, символы теперь отображаются в виде прямоугольника с 0096 и 0092 соответственно special ('или -) какие-либо другие мысли?

vishnuvyas 09.11.2008 04:17

да, у меня есть еще одна мысль: сделайте домашнее задание ... вы, вероятно, использовали неправильную исходную кодировку. 0x92 и 0x96 - это «изогнутые одинарные кавычки» и «тире» в windows-1252. это могло быть правильным? вы пробовали уловку с браузером?

user3850 09.11.2008 04:31

Заголовок PHP исправил для меня вещи при использовании класса PDF2Text.

James P. 16.08.2013 03:00

Разве header("Content-Type: text/plain; charset=ISO-8859-1"); не должен быть header("Content-Type: text/html; charset=ISO-8859-1");?

j08691 24.11.2015 19:12

@ j08691: ну, это сейчас зависит от типа контента, не так ли?

user3850 25.11.2015 22:59

очень полезно, это действительно работает также, если у вас есть сценарий PHP, который читает файл CSV, сохраненный в формате Windows CSV. Спасибо!

Robert Sinclair 12.08.2017 20:03

Это проблема с кодировкой. Таким образом, это могло пойти не так на многих разных уровнях, но, скорее всего, строки в вашей базе данных закодированы в 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, который определяет mimetype файла (например, text/html), а также кодировку (также известную как кодировка). Хотя большинство веб-серверов отправляют заголовок Content-Type с информацией о charset, это необязательно. Если его нет, браузер вместо этого интерпретирует любые мета-теги с помощью http-equiv = "Content-Type". Важно понимать, что мета-тег интерпретируется Только, если веб-сервер не отправляет заголовок. На практике это означает, что он используется только в том случае, если страница сохраняется на диск, а затем открывается оттуда.

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

Основываясь на вашем описании проблемы, данные в вашей базе данных почти наверняка закодированы как Окна-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 и содержимом своей базы данных, и позаботиться о согласованности или правильном преобразовании там, где это невозможно.

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

troelskn 09.11.2008 15:07

Я согласен. Я немного отредактировал свой пост, чтобы отразить, что это решение не заменяет знание того, что вы делаете. Однако я пришел к выводу, что большинство разработчиков либо неспособны понять эту проблему, либо просто не заботятся. Кажется, там, где я работаю, он появляется хотя бы раз в месяц.

Daniel Cassidy 10.11.2008 06:38

Это тоже в значительной степени моё наблюдение. Что мне небезразлично, они пожинают, как сеют. Но вы, наверное, правы; Скорее всего, его данные действительно cp-1252 .. По крайней мере, некоторые из них.

troelskn 10.11.2008 21:18

Я попробовал несколько решений той же проблемы. Этот был немедленно эффективен с наименьшими усилиями

sixstring 05.10.2017 03:30

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

Чтобы убедиться, что ваше соединение 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

Это было очень полезно и решило мою проблему с кодированием котировок в данных, поступающих из удаленной базы данных MySQL, спасибо!

tribulant 01.05.2015 13:05

@ptwiggerl это очень помогло.

unixmiah 22.07.2016 21:33

Я перенес веб-сайт на другой сервер и столкнулся с этой проблемой: mysql_set_charset ('utf8', $ con); решил это!

Rafael Moni 06.12.2016 16:34

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

  1. substr ()

    Я использовал 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().

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

Это была именно та проблема, с которой я столкнулся. Не знал о строковых функциях mb.

Ren 15.11.2015 21:08

То же самое произошло и с функцией strtolower. Все функции, относящиеся к Руководство по PHP

micaball 19.01.2018 19:46

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

Я решил убрать эти символы из строки, выполнив следующие действия:

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

Это круто, у меня это сработало, попробовал utf8_encode и ut8_decode - не сработало. Но в моем случае это решение сработало. Спасибо.

sanjeev shetty 28.03.2020 07:05

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

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

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

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

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

Я только что импортировал таблицу со смешанной кодировкой (с ромбовидными вопросительными знаками в некоторых строках, и все они были в одном столбце). Вот мой код исправления. Я использовал процесс utf8_decode, который берет неопределенный заполнитель и назначает простой вопросительный знак вместо «ромбовидного вопросительного знака», затем я использовал 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>";
        }

        ?>        

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

drtechno 06.09.2016 02:04

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

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

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

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

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

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

В моем случае это сработало:

$text = utf8_decode($text)

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

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

предупреждение о разделе $text = : это изменит все вопросительные знаки в строке, а не только ромб

treyBake 13.02.2018 14:11

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

Пожалуйста, уточните этот ответ.

ppovoski 17.01.2017 14:36

это функция, которая позволяет вам удалить специальный символ и возвращает вам стандарт utf8 символа google.com/…

rk_programmer 31.01.2019 10:12

Это работало с дробями, которые отображались некорректно.

Rog 16.02.2019 21:12

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

quantme 17.02.2020 04:21

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

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

 if (ini_get('zlib.output_compression'))

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

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

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

  1. Пусть бриллианты

  2. В браузере в меню просмотра выберите "кодировка текста" и найдите ту, которая позволит вам увидеть ваш текст правильно.

  3. Отредактируйте свой php.ini и добавьте:

    default_charset = "ISO-8859-1"

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

При извлечении данных откуда угодно следует использовать функции с префиксом md_FUNC_NAME.

Была та же проблема, это помогло мне.

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

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

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

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

Просто вставьте этот код в начало страницы.

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

Пожалуйста, включите краткое объяснение того, что делает код.

CT Hall 06.05.2019 20:12

Этот код php позволяет использовать набор символов «ISO-8859-1», и в этом наборе символов этот символ � показан как символ.

Harshil Kaneria 07.05.2019 09:07

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