"Â € ™" отображается на странице вместо "" "


133

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

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

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

введите описание изображения здесь

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

введите описание изображения здесь

Так в чем проблема и как ее исправить?


Ответы:


55

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

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


75
Нет, не решено. В вашем приложении по-прежнему существует несоответствие в кодировке символов. Вы снова столкнетесь с той же проблемой в будущем для других персонажей, отличных от CP1252. И их довольно много ...
BalusC

12
Примеры персонажей, с которыми вы будете продолжать встречаться: i18nqa.com/debug/utf8-debug.html
Zoot

кодировка utf-8 +1
Karuhanga

217

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

Это символ ( RIGHT SINGLE QUOTATION MARK- U + 2019), который декодируется как CP-1252 вместо UTF-8 . Если вы проверите таблицу кодировок , то увидите, что этот символ находится в 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-форме, которые неправильно закодированы / декодированы.


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


2
Если у вас есть сломанный контент, подобный этому, сохраненный где-то, например, в базе данных mysql, у stackoverflow.com/a/9407998/117647 есть трюк, который вам нужен для преобразования символов в utf-8
Стив

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

Обратите внимание, что таблицы iso-8859-1 и Windows-1252 перекрываются, поэтому некоторые «странные комбинации символов» являются общими для обеих (например, «Ã ©» вместо «é»).
Скиппи Ле Гран Гуру,

15

У меня есть документы, в которых указывалось как …и êкак показывалось ê. Вот как он туда попал (код на 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.


15

(Кодовая точка 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одним из Окна-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, и удалить его.


12

Это иногда происходит, когда строка дважды конвертируется из 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 ’

9

У вас несоответствие в кодировке символов; ваша строка закодирована в одной кодировке (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

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

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

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


4

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

define('DB_CHARSET', 'utf8mb4_unicode_ci');

вместо того:

define('DB_CHARSET', 'utf8mb4');

0

В DBeaver (или других редакторах) файл сценария, с которым вы работаете, может предлагать сохранить как UTF8, и это изменит символ:

â € «

в

–

или

–

-1

Вы должны скопировать / вставить текст из документа Word. В документе Word используются умные кавычки. Вы можете заменить его на специальный символ (& rsquo;) или просто ввести текст в редакторе HTML (').

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


-3

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

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

4
Проблема OP - это моджибаке, а не похожие символы Unicode.
Коул Джонсон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.