Показ "â € ™" на сторінці замість "" "


133

’відображається на моїй сторінці замість '.

У мене є Content-Typeнабір , щоб UTF-8як в моєму <head>тезі і мій HTTP заголовки:

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

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

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

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

Так у чому проблема, і як я можу її виправити?


Дивіться "кракозябри" в stackoverflow.com/questions/38363566 / ...
Rick James

Відповіді:


55

Переконайтесь, що браузер та редактор використовують кодування UTF-8 замість ISO-8859-1 / Windows-1252.

Або використовувати &rsquo;.


75
Ні, це не вирішено. У вашій програмі все ще існує невідповідність кодування символів. У майбутньому ви повторно зіткнетесь з тією ж проблемою для інших символів, що не належать до CP1252. І їх досить багато ...
BalusC

12
Приклади символів, з якими ви будете стикатися: i18nqa.com/debug/utf8-debug.html
Zoot

utf-8 кодування +1
Каруханга

217

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

Це ( RIGHT SINGLE QUOTATION MARK- U + 2019) символ, який декодується як CP-1252 замість UTF-8 . Якщо ви перевіряєте кодування таблиці, то ви побачите , що цей символ в кодуванні UTF-8 складається з байт 0xE2, 0x80і 0x99. Якщо ви перевіряєте код макета сторінки CP -1252 , то ви побачите , що кожен з цих байт позначають окремі символи â, і .


і як я можу це виправити?

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


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

<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 перекриваються, тому деякі "дивні комбінації символів" є спільними для обох (наприклад, "Ã ©" для "é").
Skippy le Grand Gourou

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. Ваш веб-браузер не може зняти документ, який Чарлі зберег.

Примітка : така ж проблема може статися з будь-якою іншою однобайтовою кодовою сторінкою (наприклад, латинська-1) замість Windows-1252.


14

(Кодова точка 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 кодувань (1 252, 1254, 1256, 1 258 і всі карти 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 charset:

define('DB_CHARSET', 'utf8mb4_unicode_ci');

замість:

define('DB_CHARSET', 'utf8mb4');

0

У DBeaver (або інших редакторах) файл сценарію, який ви працюєте, може запропонувати зберегти як UTF8, і це змінить char:

-

в

–

або

–

-1

У вас повинен бути копіювати / вставляти текст із Word Document. Документ Word використовує Smart Quotes. Ви можете замінити його спеціальним символом (& rsquo;) або просто ввести свій HTML-редактор (').

Я впевнений, що це вирішить вашу проблему.


-3

Те саме трапилося і зі знаком «-» (довгий знак мінусу).
Я використав цю просту заміну, щоб вирішити:

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

4
Проблема ОП - mojibake, а не схожі символи Unicode.
Коул Джонсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.