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






Это может быть вызвано несоответствием кодировки 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 ('или -) какие-либо другие мысли?
да, у меня есть еще одна мысль: сделайте домашнее задание ... вы, вероятно, использовали неправильную исходную кодировку. 0x92 и 0x96 - это «изогнутые одинарные кавычки» и «тире» в windows-1252. это могло быть правильным? вы пробовали уловку с браузером?
Заголовок PHP исправил для меня вещи при использовании класса PDF2Text.
Разве header("Content-Type: text/plain; charset=ISO-8859-1"); не должен быть header("Content-Type: text/html; charset=ISO-8859-1");?
@ j08691: ну, это сейчас зависит от типа контента, не так ли?
очень полезно, это действительно работает также, если у вас есть сценарий PHP, который читает файл CSV, сохраненный в формате Windows CSV. Спасибо!
Это проблема с кодировкой. Таким образом, это могло пойти не так на многих разных уровнях, но, скорее всего, строки в вашей базе данных закодированы в utf-8, и вы представляете их как iso-8859-1. Или наоборот.
Правильный способ решить эту проблему - исправить набор символов. Самая простая стратегия, поскольку вы используете PHP, - использовать iso-8859-1 во всем приложении. Для этого необходимо убедиться, что:
charset=iso-8859-1header.accept-charset в ваших элементах <form>.Если у вас уже есть данные в вашей базе данных, вы должны знать, что они, вероятно, уже испорчены. Если вы еще не на этапе производства, просто протрите все и начните заново. В противном случае вам придется выполнить некоторую очистку данных.
Когда веб-сервер обслуживает файл (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 и содержимом своей базы данных, и позаботиться о согласованности или правильном преобразовании там, где это невозможно.
Проблема с этим предложением заключается в том, что, скорее всего, на данный момент данные представляют собой смесь разных кодировок. Если вы точно не знаете, что пошло не так, это становится еще более беспорядочным, если вы просто добавляете какие-то случайные исправления здесь и там.
Я согласен. Я немного отредактировал свой пост, чтобы отразить, что это решение не заменяет знание того, что вы делаете. Однако я пришел к выводу, что большинство разработчиков либо неспособны понять эту проблему, либо просто не заботятся. Кажется, там, где я работаю, он появляется хотя бы раз в месяц.
Это тоже в значительной степени моё наблюдение. Что мне небезразлично, они пожинают, как сеют. Но вы, наверное, правы; Скорее всего, его данные действительно cp-1252 .. По крайней мере, некоторые из них.
Я попробовал несколько решений той же проблемы. Этот был немедленно эффективен с наименьшими усилиями
Вы также можете изменить набор символов в своем браузере. Просто по причинам отладки.
Чтобы убедиться, что ваше соединение 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, спасибо!
@ptwiggerl это очень помогло.
Я перенес веб-сайт на другой сервер и столкнулся с этой проблемой: mysql_set_charset ('utf8', $ con); решил это!
Я тоже столкнулся с этой проблемой. Между тем я столкнулся с тремя случаями, когда это произошло:
substr ()
Я использовал 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().
Надеюсь, эта дополнительная информация поможет избавиться от подобных проблем.
Это была именно та проблема, с которой я столкнулся. Не знал о строковых функциях mb.
То же самое произошло и с функцией strtolower. Все функции, относящиеся к Руководство по PHP
Использование одной и той же кодировки (как предлагается здесь) как в базе данных, так и в HTML, у меня не сработало ... Итак, помня, что код генерируется как HTML, я решил использовать " (HTML-код) или " (ISO Latin -1 код) в тексте моей базы данных, где использовались кавычки. Это решило проблему, поставив мне кавычки. Странно отметить, что до этого решения только некоторые кавычки и апострофы отображались некорректно, в то время как другие отображались, однако специальный код работал во всех случаях.
Я решил убрать эти символы из строки, выполнив следующие действия:
ini_set('mbstring.substitute_character', "none");
$text= mb_convert_encoding($text, 'UTF-8', 'UTF-8');
Это круто, у меня это сработало, попробовал utf8_encode и ut8_decode - не сработало. Но в моем случае это решение сработало. Спасибо.
Как упоминалось в предыдущих ответах, это происходит потому, что ваш текст был записан в базу данных в кодировке 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>";
}
?>
приведенный выше код исправляет мою таблицу. но я бы порекомендовал прокомментировать заявления об обновлении, чтобы вы сначала увидели, решит ли оно проблему.
то, что я закончил, сделав в конце после того, как я исправил свои таблицы, было сделать резервную копию и вернуть настройки на 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 = : это изменит все вопросительные знаки в строке, а не только ромб
Добавьте эту функцию в свои переменные utf8_encode ($ ваша переменная);
Пожалуйста, уточните этот ответ.
это функция, которая позволяет вам удалить специальный символ и возвращает вам стандарт utf8 символа google.com/…
Это работало с дробями, которые отображались некорректно.
На мой взгляд, это должен быть принятый ответ; это единственный метод, который у меня сработал, я все перепробовал.
Просто добавьте эти строки перед заголовками.
Будет получен точный формат файлов .doc/docx:
if (ini_get('zlib.output_compression'))
ini_set('zlib.output_compression', 'Off');
ob_clean();
Для глобальных целей.
Вместо преобразования, кодирования, декодирования каждого текста я предпочитаю оставить их такими, какие они есть, и вместо этого изменить настройки php сервера. Так,
Пусть бриллианты
В браузере в меню просмотра выберите "кодировка текста" и найдите ту, которая позволит вам увидеть ваш текст правильно.
Отредактируйте свой 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");
?>
Пожалуйста, включите краткое объяснение того, что делает код.
Этот код php позволяет использовать набор символов «ISO-8859-1», и в этом наборе символов этот символ � показан как символ.
Не снимайте их, исправьте время. См. Также «черный бриллиант» в stackoverflow.com/questions/38363566/…