Вывод PHP, показывающий маленькие черные бриллианты со знаком вопроса - PullRequest
70 голосов
/ 09 ноября 2008

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

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

Ответы [ 21 ]

67 голосов
/ 09 ноября 2008

Если вы видите этот символ ( U + FFFD «ЗАМЕНЯЮЩИЙ ХАРАКТЕР»), это обычно означает, что сам текст кодируется в некоторой форме однобайтовой кодировки, но интерпретируется в одной из кодировок 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().

41 голосов
/ 09 ноября 2008

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

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

28 голосов
/ 28 февраля 2013

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

  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() вместо.

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

9 голосов
/ 16 августа 2015

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

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

$text = “string from database”;
$text = utf8_encode($text);
echo $text;
8 голосов
/ 05 апреля 2012

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

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

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

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

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

3 голосов
/ 29 июля 2015

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

ini_set('mbstring.substitute_character', "none"); 
$text= mb_convert_encoding($text, 'UTF-8', 'UTF-8');
3 голосов
/ 06 октября 2016

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

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

3 голосов
/ 17 января 2017

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

1 голос
/ 08 октября 2017

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

<meta charset="iso-8859-1">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...