Данные UTF8, сохраненные из подключения Latin1, как проверить, в порядке ли мои данные?

Latin1 Connection вместо UTF8

Недавно я получил сообщения от тех, кто использует мой веб-сайт, что они не могут создавать контент на китайском или арабском языке. Это заставило меня попытаться создать контент на моем сайте с использованием китайских символов, и я заметил, что данные, хранящиеся для этих символов, представляют собой знак вопроса ?,

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

Кажется, что я подключался к базе данных, используя Entity Framework, используя Latin1 соединение, так как это по умолчанию для MySQL, но столбцы в моей базе данных UTF8,

Как мои данные закодированы?

Из того, что я прочитал о процессе, я думаю, что данные в моей базе данных UTF8 данные из браузера, закодированные как Latin1 во время передачи в базу данных, которая затем снова кодируется как UTF8 непосредственно перед тем, как он будет сохранен в базе данных.

Я использовал скрипт PHP, чтобы определить, правильно ли поступают данные при настройке подключения UTF8 - и когда я выбираю данные из своей базы данных, это не похоже на разницу.

  <!DOCTYPE html>
  <html>
  <head>
   <meta charset="utf-8" />
  </head>
  <body>
    <?php 

    //
    // Make the connection to the database
    //
    $link = mysqli_connect('localhost','root', '', 'mydatabase');

    if (!$link) { 
        die('Could not connect to MySQL: ' . mysql_error()); 
    }

    // Set connection character set to UTF8
    $link->set_charset('utf8');

    echo '<p>Connection OK</p>';

    //
    // Request the string from the database
    //
    $result = $link->query("SELECT questiontext FROM question WHERE id = 101");

    $row = $result->fetch_assoc();

    // Display the data
    echo "Result: " . $row['questiontext'] . '<br/>';

    mysqli_close($link);

    ?>
  </body>
  </html>
  • Если я запрашиваю строку из символов [AZ 0-9], используя UTF8 подключение к существующим данным, используя этот скрипт PHP, он отображается на экране так же, как и над Latin1 соединение при использовании Entity Framework, я не могу сказать разницу. Похоже, что нет никаких проблем с данными.
  • Если я запрашиваю строку китайских символов, которые, по-видимому, были введены в базу данных в виде вопросительных знаков, она отображается в виде вопросительных знаков при получении через UTF8 подключение.

Я ожидал, что когда я подключился к базе данных, используя UTF8 связи, что данные будут отображаться как мусор, как я ранее использовал Latin1 связь - но это не так.

Я использовал Entity Framework для опроса переменных MySql, которые использовались для соединения до и после добавления CharSet=utf8; к моей строке подключения. Надеемся, что вы можете дать представление о том, как соединение было установлено раньше и как оно сейчас:

Подключение до:

Подключение до

Обновлена ​​связь с набором строк подключения:

Соединение после обновления строки соединения

Как я могу определить, что данные в базе данных закодированы неправильно, являются ли они данными Latin1, закодированными как UTF8, чтобы я мог решить, могу ли я просто изменить строку подключения, чтобы использовать UTF8, и все будет работать нормально?

Обновить

Я экспериментировал, переключая тип соединения между UTF8 а также Latin1 и это мои выводы...

Если я установлю тип подключения latin1 и вывод символов, я получаю что-то вроде этого:

Tu es dans un le d serte

HEX (bin2hex): 54752065732064616e7320756e6520 ee 6c652064 e9 7365727465203a

Если я установлю свое подключение к utf8:

Tu es dans une île déserte

HEX (bin2hex): 54752065732064616e7320756e6520 c3ae 6c652064 c3a9 7365727465203a

(жирным шрифтом и пробелом добавил Рик Джеймс)

При использовании соединения UTF8 никаких хитроумных символов нет вообще - только когда я устанавливаю тип соединения на latin1, Это наводит меня на мысль, что кодирование моих данных в порядке, предположительно, это просто UTF8.

Из этого я могу только расшифровать, что Entity Framework все время связывался по соединению UTF8, но я не знаю, как я могу подтвердить, что данные хранятся правильно.

3 ответа

Решение

Для китайского языка вы должны указать MySQL использовать utf8mb4, а не просто utf8.

При попытке использовать utf8/utf8mb4, если вы видите вопросительные знаки (обычные, а не черные бриллианты) (? шестнадцатеричный 3F),

  • Сохраняемые байты не кодируются как utf8. Почини это.
  • Столбец в базе данных CHARACTER SET utf8mb4, Почини это.
  • Кроме того, проверьте, что соединение во время чтения - utf8mb4.

新浪新闻 это моджибаке для 新浪新闻

При попытке использовать utf8/utf8mb4, если вы видите Mojibake, проверьте следующее. Это обсуждение также относится к двойному кодированию, которое не обязательно видно.

  • Сохраняемые байты должны быть в кодировке utf8.
  • Соединение когда INSERTing а также SELECTing текст должен указывать utf8mb4. (set_charset)
  • Столбец должен быть объявлен CHARACTER SET utf8mb4, (Проверить с SHOW CREATE TABLE.)
  • HTML должен начинаться с <meta charset=UTF-8>, (Вы сделали это.)

Чтобы проверить, сделайте SELECT col, HEX(col) FROM ..., Если шестнадцатеричный вывод для является E696B0, тогда это правильно закодировано с utf8/utf8mb4. Если вы получаете C3A6E28093C2B0, это "двойной кодировки". Обычно, если гекс начинается с E или F, он, вероятно, правильно закодирован. Кроме того, гекс для одного китайского иероглифа во всех случаях будет иметь длину 6 или 8. Ссылка

Попробуйте использовать это:

// Отображаем эхо данных "Result:". utf8_encode ($ row ['questiontext']). '
";

;)

APPLICATION-> MySQL: select HEX('中国')
mysql-> Применение: select UNHEX('E4B8ADE59BBD')Вы можете использовать функцию MySQL

Другие вопросы по тегам