Фиксация поврежденной кодировки UTF-8

Я нахожусь в процессе фиксации некоторой плохой кодировки UTF-8. Я в настоящее время использую PHP 5 и MySQL.

В моей базе данных у меня есть несколько экземпляров плохой кодировки, которая печатает как: î

  • Сопоставление базы данных является utf8_general_ci
  • PHP использует надлежащий заголовок UTF-8
  • Блокнот ++ установлен использовать UTF-8 без BOM
  • управление базой данных обрабатывается в phpMyAdmin
  • не все случаи символов с диакритикой повреждаются

Мне нужна своего рода функция, которая поможет мне отобразить экземпляры î, ¦ƒ¦-, ü и других как он к их надлежащим символам UTF-8 с диакритическим знаком.

59
задан Peter Mortensen 7 July 2019 в 22:25
поделиться

4 ответа

В прошлом мне приходилось пытаться «исправить» ряд неисправных ситуаций с UTF8, и, к сожалению, это никогда не было легко, а зачастую и невозможно.

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

Если вы хотите попытаться устранить повреждение, лучше всего будет начать писать что-нибудь пример кода, в котором вы пытаетесь вызвать множество вариантов вызовов mb_convert_encoding (), чтобы увидеть, сможете ли вы найти комбинацию «от» и «до», которая исправляет ваши данные. В конце концов, часто лучше даже не беспокоиться об исправлении старых данных из-за связанных с этим трудностей, а вместо этого просто исправить ситуацию в будущем.

Однако, прежде чем делать это, вам нужно убедиться, что вы исправили все, что вызывает эту проблему. Вы уже упоминали, что параметры сортировки и редакторы таблиц БД настроены правильно. Но есть и другие места, где вам нужно проверить, что все правильно UTF-8:

  • Убедитесь, что вы обслуживаете свой HTML как UTF-8:
    • header("Content-Type: text/html; charset=utf-8");
  • Change your PHP default charset to utf-8:
    • ini_set("default_charset", 'utf-8');
  • If your database doesn't ALWAYS talk in utf-8, then you may need to tell it on a per connection basis to ensure it's in utf-8 mode, in MySQL you do that by issuing:
    • charset utf8
  • You may need to tell your webserver to always try to talk in UTF8, in Apache this command is:
    • AddDefaultCharset UTF-8
  • Наконец, вам нужно ВСЕГДА убедиться, что вы используете функции PHP, которые соответствуют требованиям UTF-8. Это означает, что всегда следует использовать строковые функции mb _ * в стиле «многобайтовые». Это также означает, что при вызове таких функций, как htmlspecialchars (), вы включаете соответствующий параметр кодировки 'utf-8' в конце, чтобы убедиться, что он не кодирует их неправильно.

Если вы пропустите какой-либо один шаг в ходе всего процесса кодирование может быть искажено и могут возникнуть проблемы. Однако как только вы попадаете в «паз» выполнения utf-8, все это становится вашей второй натурой. И, конечно же, PHP6 должен быть полностью жалобой на Unicode от getgo, что значительно упростит эту задачу (надеюсь)

62
ответ дан 24 November 2019 в 17:58
поделиться

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

function fix_double encoding($string)
{
    $utf8_chars = explode(' ', 'À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö');
    $utf8_double_encoded = array();
    foreach($utf8_chars as $utf8_char)
    {
            $utf8_double_encoded[] = utf8_encode(utf8_encode($utf8_char));
    }
    $string = str_replace($utf8_double_encoded, $utf8_chars, $string);
    return $string;
}

Кажется, это отлично работает для удаления двойное кодирование, которое я испытываю. Вероятно, мне не хватает некоторых персонажей, которые могут быть проблемой для других. Однако для моих нужд он работает отлично.

2
ответ дан 24 November 2019 в 17:58
поделиться

It looks like your utf-8 is being interpreted as iso8859-1 or Win-1250 at some point.

When you say "In my database I have a few instances of bad encodings" - how did you check this? Through your app, phpmyadmin or the command line client? Are all utf-8 encodings showing up like this or only some? Is it possible you had the encodings wrong and it has been incorrectly converted from iso8859-1 to utf-8 when it was utf-8 already?

0
ответ дан 24 November 2019 в 17:58
поделиться

Способ состоит в том, чтобы преобразовать в двоичную форму и затем исправить кодировку

2
ответ дан 24 November 2019 в 17:58
поделиться