Мой сценарий работает нормально, но я не понимаю, почему я должен использовать utf8_decode () - PullRequest
9 голосов
/ 22 марта 2012

Я смущен поведением utf8_decode () и просто хочу немного разъяснений.Я надеюсь, что все в порядке.

Вот простая форма HTML, которую я использую, чтобы захватить некоторый текст и сохранить его в моей базе данных MySQL (которая использует сопоставление utf8_general_ci):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<form action="update.php" method="post" accept-charset="utf-8"> 
<p> 
    Title: <input type="text" name="title" id="title" accept-charset="utf-8" size="75" value="" /> 
</p> 
<p> 
    <input type="submit" name="submit" value="Submit" /> 
</p> 
</form>
</body>
</html>

КакВы можете видеть, что я кодировал это с charset = utf8 в соответствующих местах.Мы принимаем текст, который содержит диакритические знаки (например, ñ, ó и т. Д.).В конце мы запускаем небольшой скрипт для всего ввода текста, чтобы проверить наличие диакритических знаков и изменить их на HTML-сущности (например, ñ становится ñ).

Когда входные данные получены моим сценарием, мне сначала нужно выполнить utf8_decode ($ input), а затем запустить мой маленький сценарий, чтобы проверить и изменить диакритические знаки по мере необходимости.Все отлично работаетМне любопытно, почему я должен запустить декодирование на этом входе.Я понимаю, что utf8_decode преобразует строку, закодированную в UTF-8, в ISO-8859-1.Я хочу убедиться - , хотя все работает нормально (или я так думаю) - что я не делаю что-то нехорошее, что потом настигнет меня.Например, я отправляю символы в кодировке ISO-8859-1 для хранения в моей базе данных, которая настроена для хранения / обслуживания символов UTF-8.Должен ли я сделать что-то вроде запуска utf8_encode () в строке, которую возвращает мой скрипт diacritics-to-entity?Например:

$string = utf8_decode($string);
$search = explode(",","À,È,Ì,Ò,Ù,à,è,ì,ò,ù,Á,É,Í,Ó,Ú,Ý,á,é,í,ó,ú,ý,Â,Ê,Î,Ô,Û,â,ê,î,ô,û,Ã,Ñ,Õ,ã,ñ,õ,Ä,Ë,Ï,Ö,Ü,Ÿ,ä,ë,ï,ö,ü,ÿ,Å,å,Æ,æ,ß,Þ,þ,ç,Ç,Œ,œ,Ð,ð,Ø,ø,§,Š,š,µ,¢,£,¥,€,¤,ƒ,¡,¿");
$replace = explode(",","&Agrave;,&Egrave;,&Igrave;,&Ograve;,&Ugrave;,&agrave;,&egrave;,&igrave;,&ograve;,&ugrave;,&Aacute;,&Eacute;,&Iacute;,&Oacute;,&Uacute;,&Yacute;,&aacute;,&eacute;,&iacute;,&oacute;,&uacute;,&yacute;,&Acirc;,&Ecirc;,&Icirc;,&Ocirc;,&Ucirc;,&acirc;,&ecirc;,&icirc;,&ocirc;,&ucirc;,&Atilde;,Ntilde;,&Otilde;,&atilde;,&ntilde;,&otilde;,&Auml;,&Euml;,&Iuml;,&Ouml;,&Uuml;,&Yuml;,&auml;,&euml;,&iuml;,&ouml;,&uuml;,&yuml;,&Aring;,&aring;,&AElig;,&aelig;,&szlig;,&THORN;,&thorn;,&ccedil;,&Ccedil;,&OElig;,&oelig;,&ETH;,&eth;,&Oslash;,&oslash;,&sect;,&Scaron;,&scaron;,&micro;&cent;,&pound;,&yen;,&euro;,&curren;,&fnof;,&iexcl;,&iquest;");
$new_input = str_replace($search, $replace, $string);
return utf8_encode($new_input); // right now i just return $new_input.

Цените любые идеи, которые кто-либо может предложить по этому поводу.

Ответы [ 3 ]

1 голос
/ 25 марта 2012

Не используйте "accept-charset".Оно сломано.Большинство браузеров перестали отправлять его в своих http-запросах.Некоторые браузеры (IE) полностью игнорируют этот атрибут при анализе формы, а другие выполняют с ней очень ограниченную работу.На практике «accept-charset» принесет больше вреда, чем пользы.

Соглашение состоит в том, что браузер отправляет данные в той же кодировке, в которой они получили форму. уверен, что ваша страница отправлена ​​как UTF-8.Ваш метатег в голове HTML не достаточно.Для страницы PHP этот параметр можно установить в 3 местах:

  • HTML-тег <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> в «заголовке».
  • Строка AddDefautCharset UTF8 в конфигурации Apache(или что-то подобное в других веб-серверах).
  • PHP-вызов header("Content-type=text/html; charset=utf-8"); (до того, как что-либо отобразится на странице).

Каждая директива переопределяет предыдущие.Поэтому, если ваш сервер уже объявил кодировку, ваш метатег будет проигнорирован.

Так что вам следует:

  • Убедитесь, что ваш исходный файл находится в UTF-8, конечно.
  • Исправьте исходный код HTML, чтобы он проверялся на W3C.Например, ваш метатег должен быть закрыт в XHTML.
  • Удалите атрибуты "accept-charset".
  • В конце концов, принудительно объявите кодировку в Apache или с PHP header().
  • Убедитесь, что в вашем браузере HTTP-заголовки, полученные от сервера, имеют правильную объявленную кодировку (или не кодируют, если используете метатег).В Linux curl -I <URL> отображает только заголовки HTTP.
0 голосов
/ 23 марта 2012

, поэтому страница отобразит текст для отображения в utf-8, но даже если вы переключите его на utf8 с помощью accept-charset = "utf-8", сервер преобразует его в iso-8859-1, а затем, когда он отображается, затем снова преобразуется в utf-8 из iso-8859-1, но смог преобразовать только символ utf-8, так что в итоге он отображает странный символ, и каждый раз, когда вы проходите через этот процесс, становится хуже и что еще хуже, я обнаружил, что даже если вы делаете все на стороне html, на сервере нет способа переключить его на чтение utf-8, и поэтому вы не можете переключить все на utf-8 , Это на Apache, и если есть способ, я бы хотел знать.

0 голосов
/ 22 марта 2012

При отправке формы с помощью accept-charset = "utf-8" браузер отправляет данные формы на сервер в виде символов ISO-8859-1, закодированных с помощью utf-8. utf8_decode превращает кодированный пакет данных в строгий ISO-8859-1. Например, если вы отправите «ñ», кодировка utf-8 отправит «% F1» в действие формы, которое, в свою очередь, должно быть преобразовано обратно в «ñ», чтобы ваш скрипт работал.

...