Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Если вы видите этот символ ( U + FFFD "ЗАМЕНА ХАРАКТЕРА" ), это обычно означает, что сам текст кодируется в виде одного байтового кодирования, но интерпретируется в одном из кодировок Unicode (UTF8 или UTF16).

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

Возможно, исходная кодировка - ISO-8859-1, также известная как Latin-1. Вы можете проверить это, не меняя свой script: Браузеры дают вам возможность повторно интерпретировать страницу в другой кодировке - в 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().

Ответ 2

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

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

Ответ 3

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

  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().

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

Ответ 4

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

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

$text = "string from database";
$text = utf8_encode($text);
echo $text;

Ответ 5

Чтобы ваше подключение 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

Ответ 6

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

Ответ 7

Я решил удалить эти символы из строки, сделав это -

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

Ответ 8

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

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

Ответ 9

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

Ответ 10

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

Ответ 11

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

Ответ 12

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

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

 if(ini_get('zlib.output_compression'))

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

Ответ 13

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

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

Ответ 14

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

Ответ 15

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

Ответ 16

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

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

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

        ?>        

Ответ 17

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

$text = utf8_decode($text)

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

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

Ответ 18

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

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

  • Пусть алмазы
  • В браузере в меню просмотра выберите "текстовое кодирование" и найдите ту, которая позволяет вам видеть текст правильно.
  • Измените свой php.ini и добавьте:

    default_charset = "ISO-8859-1"

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

Ответ 19

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

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

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

Ответ 20

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

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

Ответ 21

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