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

Все о переменном обзоре. Переменные, объявленные в сам выполняющий функцию, по умолчанию, только доступны для кодирования в сам выполняющий функцию. Это позволяет коду быть записанным без беспокойства того, как переменные называют в других блоках кода JavaScript.

, Например:

(function(){ 
    var foo = 3; 
    alert(foo); 
})(); 

alert(foo); 

Это сначала предупредит "3" и затем бросит ошибку на следующее предупреждение, потому что нечто не определяется.

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

6 ответов

В прошлом мне приходилось пытаться «исправить» ряд неисправных ситуаций с 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
поделиться

Как указал Дэн: вам нужно преобразовать их в двоичный формат, а затем преобразовать/исправить кодировку.

Например, для utf8, сохраненного как latin1, следующий SQL исправит это:

UPDATE table
   SET field = CONVERT( CAST(field AS BINARY) USING utf8)
 WHERE $broken_field_condition
10
ответ дан 24 November 2019 в 17:58
поделиться

Если вы utf8_encode() для строки, которая уже является UTF-8, то при многократном кодировании она выглядит искаженной.

Я сделал функцию toUTF8(), которая преобразует строки в UTF-8.

Вам не нужно указывать кодировку ваших строк. Это может быть Latin1 (iso 8859-1), Windows-1252 или UTF8, или смесь этих трех кодировок.

Я сам использовал это на фиде со смешанными кодировками в одной строке.

Использование:

$utf8_string = Encoding::toUTF8($mixed_string);

$latin1_string = Encoding::toLatin1($mixed_string);

Другая моя функция fixUTF8() исправляет искаженные строки UTF8, если они были закодированы в UTF8 несколько раз.

Usage:

$utf8_string = Encoding::fixUTF8($garbled_utf8_string);

Examples:

echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("FÃÂédÃÂération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");

will output:

Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football

Download:

https://github.com/neitanod/forceutf8

80
ответ дан 24 November 2019 в 17:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: