Выход PHP, показывающий маленькие черные алмазы с вопросительным знаком
Я пишу программу php, которая извлекает из источника базы данных. Некоторые из varchars имеют кавычки, которые отображаются как черные алмазы с вопросительным знаком в них (, REPLACEMENT CHARACTER, я предполагаю из текста Microsoft Word).
Как я могу использовать php для удаления этих символов?
Ответы
Ответ 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
Я также столкнулся с этой проблемой. Между тем я столкнулся с тремя случаями, когда это произошло:
-
зиЬзЬг()
Я использовал substr()
для строки UTF8, которая вырезала символы UTF8, поэтому символы разреза не могли отображаться правильно. Используйте mb_substr($utfstring, 0, 10, 'utf-8');
вместо. кредиты
-
htmlspecialchars()
Другая проблема заключалась в использовании htmlspecialchars()
в строке UTF8. Исправление заключается в использовании: htmlspecialchars($utfstring, ENT_QUOTES, 'UTF-8');
-
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, я решил использовать "
(HTML-код) или код "
(код 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 сервера.
Таким образом,
или вместо ISO-8859, который соответствует вашему текстовому кодированию.
Ответ 19
При извлечении данных из любого места вы должны использовать функции с префиксом md_FUNC_NAME
.
Если бы та же проблема помогла мне.
Или вы можете найти код этого символа и использовать regexp для удаления этих символов.
Ответ 20
Просто вставьте этот код в начало страницы.
<?php
header("Content-Type: text/html; charset=ISO-8859-1");
?>
Ответ 21
Перейдите на ваш phpmyadmin и выберите свою базу данных и просто увеличьте длину/значение этого поля таблицы до 500 или 1000, это решит вашу проблему.