«» отображается на странице вместо «» - PullRequest
114 голосов
/ 19 марта 2010

’ отображается на моей странице вместо '.

У меня Content-Type установлено значение UTF-8 как в моем теге <head>, так и в заголовках HTTP:

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

enter image description here

Кроме того, мой браузер настроен на Unicode (UTF-8):

enter image description here

Так в чем проблема, и как я могу это исправить?

Ответы [ 10 ]

198 голосов
/ 19 марта 2010

Так в чем же проблема,

Это символ (RIGHT SINGLE QUOTATION MARK - U + 2019), который был закодирован как CP-1252 вместо UTF-8 . Если вы проверите таблицу encodings , то увидите, что этот символ в UTF-8 состоит из байтов 0xE2, 0x80 и 0x99. Если вы проверите макет кодовой страницы CP-1252 , то увидите, что каждый из этих байтов обозначает отдельные символы â, и .


и как мне это исправить?

Используйте UTF-8 вместо CP-1252 для чтения, записи, сохранения и отображения символов.


У меня для Content-Type установлено значение UTF-8 как в моем теге <head>, так и в моих заголовках HTTP:

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

Это только указывает клиенту, какую кодировку использовать для интерпретации и отображения символов. Это не указывает вашей собственной программе, какую кодировку использовать для чтения, записи, хранения и отображения символов. Точный ответ зависит от используемой серверной платформы / базы данных / языка программирования. Обратите внимание, что набор из заголовка ответа HTTP имеет приоритет над метатегом HTML. Метатег HTML будет использоваться только при открытии страницы из файловой системы локального диска, а не из HTTP.


Кроме того, мой браузер настроен на Unicode (UTF-8):

Это только заставляет клиента использовать кодировку для интерпретации и отображения символов. Но реальная проблема заключается в том, что вы уже отправляете ’ (в кодировке UTF-8) клиенту вместо . Клиент правильно отображает ’, используя кодировку UTF-8. Если бы клиенту было неверно дано указание использовать, например, ISO-8859-1, вы бы, скорее всего, увидели ââ¬â¢.


Я использую ASP.NET 2.0 с базой данных.

Скорее всего, это ваша проблема. Вы должны проверить с помощью независимого инструмента базы данных, как выглядят данные.

Если есть символ , значит, вы не подключаетесь к базе данных правильно. Вы должны указать соединителю базы данных использовать UTF-8.

Если ваша база данных содержит ’, то это ваша база данных, которая испортилась. Скорее всего, таблицы не настроены на использование UTF-8. Вместо этого они используют кодировку базы данных по умолчанию, которая варьируется в зависимости от конфигурации. Если это ваша проблема, то обычно достаточно просто изменить таблицу для использования UTF-8. Если ваша база данных не поддерживает это, вам нужно будет воссоздать таблицы. Рекомендуется устанавливать кодировку таблицы при ее создании.

Скорее всего, вы используете SQL Server, но вот код MySQL (скопирован из этой статьи ):

CREATE DATABASE db_name CHARACTER SET utf8;
CREATE TABLE tbl_name (...) CHARACTER SET utf8;

Если ваш стол уже UTF-8, вам нужно сделать шаг назад. Кто или что поместит туда данные. Это , где проблема. В качестве примера можно привести отправленные в HTML-форме значения, которые неправильно закодированы / декодированы.


Вот еще несколько ссылок, чтобы узнать больше о проблеме:

49 голосов
/ 19 марта 2010

Убедитесь, что браузер и редактор используют кодировку UTF-8 вместо ISO-8859-1 / Windows-1252.

Или используйте &rsquo;.

14 голосов
/ 24 октября 2013

У меня есть несколько документов, где показывалось как …, а ê показывалось как ê. Вот как это получилось (код Python):

# Adam edits original file using windows-1252
windows = '\x85\xea' 
# that is HORIZONTAL ELLIPSIS, LATIN SMALL LETTER E WITH CIRCUMFLEX

# Beth reads it correctly as windows-1252 and writes it as utf-8
utf8 = windows.decode("windows-1252").encode("utf-8")
print(utf8)

# Charlie reads it *incorrectly* as windows-1252 writes a twingled utf-8 version
twingled = utf8.decode("windows-1252").encode("utf-8")
print(twingled)

# detwingle by reading as utf-8 and writing as windows-1252 (it's really utf-8)
detwingled = twingled.decode("utf-8").encode("windows-1252")

assert utf8==detwingled

Чтобы решить эту проблему, я использовал такой код Python:

with open("dirty.html","rb") as f:
    dt = f.read()
ct = dt.decode("utf8").encode("windows-1252")
with open("clean.html","wb") as g:
    g.write(ct)

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

Скорее всего, у вас есть Чарли в создании контента, чем неправильная конфигурация веб-сервера. Вы также можете заставить свой веб-браузер перемешивать страницу, выбрав кодировку windows-1252 для документа utf-8. Ваш веб-браузер не может развернуть документ, сохраненный Чарли.

Примечание : та же проблема может возникнуть с любой другой однобайтовой кодовой страницей (например, latin-1) вместо windows-1252.

11 голосов
/ 19 июня 2015

(кодовая точка Unicode U+2019 RIGHT SINGLE QUOTATION MARK) кодируется в UTF-8 как байты:

0xE2 0x80 0x99.

’ (кодовые точки Unicode U+00E2 U+20AC U+2122) кодируются в UTF-8 как байты:

0xC3 0xA2 0xE2 0x82 0xAC 0xE2 0x84 0xA2.

Это байты, которые ваш браузер фактически получает, чтобы выдать ’ при обработке как UTF-8.

Это означает, что ваши исходные данные проходят два преобразования кодировки перед отправкой в ​​браузер:

  1. Исходный символ (U+2019) сначала кодируется в байтах UTF-8:

    0xE2 0x80 0x99

  2. эти отдельные байты затем неправильно интерпретируются и декодируются в кодовые точки Unicode U+00E2 U+20AC U+2122 одной из Windows-125X кодировок (1252, 1254, 1256, и 1258 все преобразуются 0xE2 0x80 0x99 в U+00E2 U+20AC U+2122), а затем эти кодовые точки кодируются как байты UTF-8:

    0xE2 -> U+00E2 -> 0xC3 0xA2
    0x80 -> U+20AC -> 0xE2 0x82 0xAC
    0x99 -> U+2122 -> 0xE2 0x84 0xA2

Вам нужно найти, где выполняется дополнительное преобразование на шаге 2, и удалить его.

8 голосов
/ 15 июля 2016

Это иногда происходит, когда строка преобразуется из Windows-1252 в UTF-8 дважды .

У нас это было в приложении Zend / PHP / MySQL, где подобные символы появлялись в базе данных, возможно, из-за того, что соединение MySQL не указывало правильный набор символов. Мы должны были:

  1. Убедитесь, что Zend и PHP связывались с базой данных в UTF-8 (по умолчанию не )

  2. Исправить неработающие символы с помощью нескольких SQL-запросов, как это ...

    UPDATE MyTable SET 
    MyField1 = CONVERT(CAST(CONVERT(MyField1 USING latin1) AS BINARY) USING utf8),
    MyField2 = CONVERT(CAST(CONVERT(MyField2 USING latin1) AS BINARY) USING utf8);
    

    Сделайте это для необходимого количества таблиц / столбцов.

Вы также можете исправить некоторые из этих строк в PHP, если это необходимо. Обратите внимание, что, поскольку символы были закодированы дважды , нам действительно нужно выполнить обратное преобразование из UTF-8 обратно в Windows-1252, что сначала смутило меня.

mb_convert_encoding('’', 'Windows-1252', 'UTF-8');    // returns ’
8 голосов
/ 19 марта 2010

У вас несоответствие в кодировке вашего персонажа; ваша строка закодирована в одной кодировке (UTF-8), и все, что интерпретирует эту страницу, использует другую (скажем, ASCII).

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

Пример http заголовка:

Content-Type    text/html; charset=utf-8

Настройка кодировки в asp.net

<configuration>
  <system.web>
    <globalization
      fileEncoding="utf-8"
      requestEncoding="utf-8"
      responseEncoding="utf-8"
      culture="en-US"
      uiCulture="de-DE"
    />
  </system.web>
</configuration>

Настройка кодировки в jsp

7 голосов
/ 19 марта 2010

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

Если это данные из файла, убедитесь, что файл правильно закодирован как UTF-8. Обычно это можно установить в диалоговом окне «Сохранить как ...» выбранного редактора.

Если данные уже повреждены при просмотре в исходном файле, есть вероятность, что это был файл UTF-8, но он был сохранен в неправильной кодировке где-то по пути.

4 голосов
/ 08 марта 2016

Если кто-то получит эту ошибку на веб-сайте WordPress, вам нужно изменить wp-config db charset:

define('DB_CHARSET', 'utf8mb4_unicode_ci');

вместо:

define('DB_CHARSET', 'utf8mb4');
0 голосов
/ 04 сентября 2015

Вы должны скопировать / вставить текст из Word Document.В документе Word используются Smart Quotes.Вы можете заменить его на Специальный символ (') или просто набрать в своем редакторе HTML (').

Я уверен, что это решит вашу проблему.

0 голосов
/ 14 октября 2013

То же самое произошло со мной с символом '-' (длинный знак минус).
Я использовал эту простую замену, поэтому разрешите ее:

htmlText = htmlText.Replace('–', '-');
...