Я пишу 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 во всем приложении. Для этого вы должны убедиться, что:
charset=iso-8859-1
header
. accept-charset
для своих элементов <form>
. Если у вас уже есть данные в вашей базе данных, вы должны знать, что они, вероятно, уже запутались. Если вы еще не на стадии производства, просто протрите все и начните. В противном случае вам придется выполнять некоторую очистку данных.
Когда веб-сервер обслуживает файл (HTML-документ), он отправляет некоторую информацию, которая не отображается непосредственно в браузере. Это называется HTTP-заголовками. Одним из таких заголовков является заголовок Content-Type
, который задает Content-Type
файла (Eg. text/html
), а также кодировку (aka charset). Хотя большинство веб-серверов отправляют заголовок Content-Type
с информацией о charset
, это необязательно. Если его нет, браузер будет интерпретировать любые метатеги с помощью http-equiv="Content-Type"
. Важно понимать, что метатег интерпретируется только в том случае, если веб-сервер не отправляет заголовок. На практике это означает, что он используется только в том случае, если страница сохраняется на диске и затем открывается оттуда.
На этой странице есть очень хорошее объяснение этих вещей.
Я также столкнулся с этой проблемой. Между тем я столкнулся с тремя случаями, когда это произошло:
зиЬзЬг ()
Я использовал 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()
.
Надеюсь, эта дополнительная информация поможет избавиться от таких проблем.
Основываясь на вашем описании проблемы, данные в вашей базе данных почти наверняка закодированы как 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 сервера. Так,
Измените свой php.ini и добавьте:
default_charset = "ISO-8859-1"
или вместо ISO-8859, который соответствует вашему текстовому кодированию.
Вы также можете изменить набор символов в своем браузере. Только для причин отладки.
Использование той же кодировки (как предложено здесь) как в базе данных, так и в HTML не работает для меня … Поэтому, помня, что код генерируется как HTML, я решил использовать "
(HTML-код) или "
(Код 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">