php - экранирование - стрзаменить кавычки 1с




Как преобразовать интеллектуальные кавычки Word и em штрихи в строку? (9)

База данных mysql использует кодировку UTF-8. Аналогично, html-страницы, отображающие контент, используют UTF-8.

Содержимое HTML может быть в UTF-8, да, но явно ли вы устанавливаете тип содержимого (кодирование) ваших HTML-страниц (сгенерированных через PHP?) В UTF-8? Попробуйте вернуть заголовок Content-Type "text/html;charset=utf-8" или добавить теги <meta> в свои HTML-файлы:

<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>

Таким образом, тип содержимого данных, передаваемых в PHP, также будет таким же.

У меня была аналогичная проблема, и добавление <meta> работало для меня.

У меня есть форма с текстовым полем. Пользователи вводят блок текста, который хранится в базе данных.

Иногда пользователь вставляет текст из Word, содержащий интеллектуальные кавычки или символы emdash. Эти символы появляются в базе данных: â € »,« â € »,« â € œ,

Какую функцию я должен вызывать на входной строке для преобразования умных кавычек в обычные кавычки и emdashes в обычные тире ?

Я работаю в PHP.

Обновление: Спасибо за все замечательные ответы. Страница сайта Joel о кодировках очень информативна: http://www.joelonsoftware.com/articles/Unicode.html

Некоторые заметки о моей среде:

База данных MySQL использует кодировку UTF-8. Аналогично, страницы HTML, отображающие контент, используют UTF-8 (Update :), явно устанавливая мета-контент-тип.

На этих страницах смарт-цитаты и эмпаши появляются как бриллиант с вопросительным знаком.

Решение:

Еще раз спасибо за ответы. Решение было двояким:

  1. Убедитесь, что файлы базы данных и HTML явно настроены на использование кодировки UTF-8.
  2. Используйте htmlspecialchars() вместо htmlentities() .

Вы должны быть уверены, что ваше соединение с базой данных настроено на прием и предоставление UTF-8 от клиента и к нему (в противном случае он преобразуется в «default», который обычно является latin1).

На практике это означает выполнение запроса SET NAMES 'utf8';

http://www.phpwact.org/php/i18n/utf-8/mysql

Кроме того, интеллектуальные кавычки являются частью набора символов windows-1252, а не iso-8859-1 (латинский-1). Не очень важно для вашей проблемы, но просто FYI. Здесь также присутствует символ евро.


Вы можете попробовать mb_ convert_encoding от ISO-8859-1 до UTF-8.

$str = mb_convert_encoding($str, 'UTF-8', 'ISO-8859-1');

Это предполагает, что вы хотите UTF-8, и конвертер может найти разумные замены ... если нет, mb_str_replace или preg_replace их самостоятельно.


Для этого мы часто использовали стандартные функции замены строк. Несмотря на то, что характер ASCII / Unicode в этом контексте довольно мрачен, он работает. Просто убедитесь, что ваш php-файл сохранен в правильном формате кодирования и т. Д.


По моему опыту, проще просто принять умные кавычки и убедиться, что вы используете ту же самую кодировку повсюду. Для начала добавьте это в свой тег формы: accept-charset="utf-8"


Похоже, что реальная проблема заключается в том, что ваша база данных не использует ту же кодировку символов, что и ваша страница (что, вероятно, должно быть UTF-8). В этом случае, если какой-либо пользователь отправляет символ не ASCII, вы, вероятно, увидите странные символы в базе данных. Поиск и исправление только некоторых из них (фигурные кавычки и эмпирические символы) не решает реальной проблемы.

Вот некоторая информация о переносе вашей базы данных на другую кодировку символов , по крайней мере, для базы данных MySQL.


Это может быть не лучшее решение, но я бы попробовал тестирование, чтобы узнать, что видит PHP. Предположим, что он видит «â €» (есть еще несколько возможностей, таких как простой «» или «& # 8220;»). Затем сделайте str_replace, чтобы избавиться от всех этих и заменить их обычными кавычками, прежде чем набивать ответ в базе данных.

Лучшее решение, вероятно, потребует передачи сквозных данных всем UTF-8, поскольку люди пытаются помочь в других ответах.


Это, к сожалению, слишком распространенная проблема, не помогающая очень плохой обработке PHP набора символов.

То, что мы делаем, это заставить текст через iconv

// Convert input data to UTF8, ignore any odd (MS Word..) chars
// that don't translate
$input = iconv("ISO-8859-1","UTF-8//IGNORE",$input);

Флаг //IGNORE означает, что все, что не может быть переведено, будет выброшено.

Если вы добавляете строку // IGNORE, символы, которые не могут быть представлены в целевой кодировке, молча отбрасываются.


Если вы хотите избежать этих символов для Интернета, сохраняя их внешний вид, ваши строки будут выглядеть так: «Это приятно!», А не «Это скучно» ...

Вы можете сделать это, используя собственную пользовательскую функцию htmlEncode вместо htmlentities () PHP:

$trans_tbl = false;

function htmlEncode($text) {

  global $trans_tbl;

  // create translation table once
  if(!$trans_tbl) {
    // start with the default set of conversions and add more.

    $trans_tbl = get_html_translation_table(HTML_ENTITIES); 

    $trans_tbl[chr(130)] = '&sbquo;';    // Single Low-9 Quotation Mark
    $trans_tbl[chr(131)] = '&fnof;';    // Latin Small Letter F With Hook
    $trans_tbl[chr(132)] = '&bdquo;';    // Double Low-9 Quotation Mark
    $trans_tbl[chr(133)] = '&hellip;';    // Horizontal Ellipsis
    $trans_tbl[chr(134)] = '&dagger;';    // Dagger
    $trans_tbl[chr(135)] = '&Dagger;';    // Double Dagger
    $trans_tbl[chr(136)] = '&circ;';    // Modifier Letter Circumflex Accent
    $trans_tbl[chr(137)] = '&permil;';    // Per Mille Sign
    $trans_tbl[chr(138)] = '&Scaron;';    // Latin Capital Letter S With Caron
    $trans_tbl[chr(139)] = '&lsaquo;';    // Single Left-Pointing Angle Quotation Mark
    $trans_tbl[chr(140)] = '&OElig;';    // Latin Capital Ligature OE

    // smart single/ double quotes (from MS)
    $trans_tbl[chr(145)] = '&lsquo;'; 
    $trans_tbl[chr(146)] = '&rsquo;'; 
    $trans_tbl[chr(147)] = '&ldquo;'; 
    $trans_tbl[chr(148)] = '&rdquo;'; 

    $trans_tbl[chr(149)] = '&bull;';    // Bullet
    $trans_tbl[chr(150)] = '&ndash;';    // En Dash
    $trans_tbl[chr(151)] = '&mdash;';    // Em Dash
    $trans_tbl[chr(152)] = '&tilde;';    // Small Tilde
    $trans_tbl[chr(153)] = '&trade;';    // Trade Mark Sign
    $trans_tbl[chr(154)] = '&scaron;';    // Latin Small Letter S With Caron
    $trans_tbl[chr(155)] = '&rsaquo;';    // Single Right-Pointing Angle Quotation Mark
    $trans_tbl[chr(156)] = '&oelig;';    // Latin Small Ligature OE
    $trans_tbl[chr(159)] = '&Yuml;';    // Latin Capital Letter Y With Diaeresis

    ksort($trans_tbl);
  }

  // escape HTML      
  return strtr($text, $trans_tbl); 
}






smart-quotes