Неправильная кодировка русского, португальского и т.д. текста

У меня есть таблица, в которой я храню текстовые метки. Первоначально он был построен с использованием параметров сортировки latin_swedish_ci (по умолчанию).

Теперь мне нужно поддерживать дополнительные языки, например русский. У меня есть две страницы, которые потребляют эти ярлыки. Один показывает их нормально, несмотря на то, что таблица все еще с латинской сортировкой, а НЕ utf8_generic_ci, однако другая страница все еще показывает мусор. Когда я просматриваю источник, это выглядит так:

\u00d0\u00a4\u00d0\u00b8\u00d0\u00bb\u00d1\u0152\u00d1\u201a\u00d1\u20ac\

На обеих страницах есть:

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

Что мне не хватает?


ОБНОВИТЬ:

Я не знаю, почему и как это работает, но в итоге я добавил следующее перед вставкой/обновлением моего запроса и перед рендерингом на странице, и это устранило все мои проблемы:

mysql_query("SET NAMES utf8"); 

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


person santa    schedule 02.02.2016    source источник
comment
Вам нужно установить кодировку PHP, HTML, базы данных/таблиц и объекта подключения к одному и тому же, в вашем случае UTF-8. Чтобы избежать неверных символов, все должно иметь одинаковую кодировку.   -  person Qirel    schedule 02.02.2016
comment
Уфф, ваша демонстрационная ссылка (usabilitest.com/uxXQAzq) на мой взгляд (я действительно не знаю русский) показывает правильно. И, если я правильно помню, у вас возникла ситуация, когда должны поддерживаться и португальский, и русский языки. В этом случае лучше всего использовать все в UTF-8.   -  person hherger    schedule 02.02.2016
comment
Кстати, эта ссылка может быть полезной: stackoverflow.com/questions/12756877/   -  person hherger    schedule 02.02.2016
comment
Инструкции показаны правильно, потому что я их тяну с другой таблицы. После того, как вы закроете модальное окно, оно появится в контейнерах на EN, PT и RU. Я преобразовал таблицу в utf8_general_ci, но по-прежнему вижу, что все значения перепутались, выглядя так: Я даже добавил следующий заголовок в свой файл PHP, где я вставляю/обновляю db: header(Content-Type: text/html; charset=UTF-8); но безрезультатно... Тьфу.   -  person santa    schedule 02.02.2016


Ответы (1)


не используйте интерфейс mysql_*; переключиться на mysqli_*.

Вы, наверное, хотели что-то вроде Фил...?

Есть, вероятно, две ошибки, чтобы получить этот беспорядок.

Тег meta хорош; SET NAMES utf8 нужен.

Но, вероятно, вы накопили мусор в таблице. Итак, давайте посмотрим на таблицу: SELECT col, hex(col) FROM tbl...

Для Фил вы должны увидеть шестнадцатеричное число D0A4D0B8D0BB. Если вы видите C390C2A4C390C2B8C390C2BB, у вас "двойное кодирование". Вместо этого кажется, что вы каким-то образом получили «unicode» вместо «utf8» и, возможно, из «latin1», с которого вы начали. Обратите внимание, как D0 A4 D0 B8 D0 BB отображается в моем гексе и в вашем \u00d0...?

Если вы можете начать сначала, сделайте так:

  • кодировка utf8 в клиенте
  • SET NAMES utf8
  • CHARACTER SET utf8 в столбце/таблице
  • <meta charset=UTF-8>

Если вы не можете начать сначала, давайте посмотрим, что я просил SELECT; возможно Я смогу найти способ спасти ваши данные.

person Rick James    schedule 03.02.2016