С помощью PHP и MySQL, как правильно написать умные цитаты в базу данных? - PullRequest
2 голосов
/ 22 января 2012

У меня есть сайт PHP с элементом управления Richtext CLEditor. Когда я пытаюсь записать евро и британские фунты в базу данных, персонаж проходит очень хорошо, потому что у меня установлена ​​кодировка UTF-8 в содержащей HTML странице, в элементе управления IFRAME HTML richtext и в сопоставлении таблицы MySQL. На этом фронте все хорошо. Однако, когда я пытаюсь написать умных кавычек , я в конечном итоге вижу этот вывод в базе данных:

This is a “testâ€.

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

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

Что мне делать, чтобы это исправить?

Ответы [ 4 ]

3 голосов
/ 22 января 2012

Во-первых, убедитесь, что ваша таблица MySQL использует UTF-8 в качестве кодировки.Если это так, это будет выглядеть следующим образом:

mysql> SHOW CREATE TABLE Users (
...
) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8 |

Далее убедитесь, что на вашей HTML-странице установлено отображение UTF-8:

<html>
    <head>
        <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
    </head>
    ....
</html>

Тогда это должно работать.


РЕДАКТИРОВАТЬ: я специально не говорил о сопоставлении, потому что я думал, что это уже рассматривалось, но для блага всех, позвольте мне добавить еще несколько к этому ответу.

Вы утверждаете,

В сопоставлении таблиц MySQL у меня установлена ​​кодировка UTF-8 ...

Сравнение таблиц - это не то же самое, что и кодировка.

Сортировка - это процесс автоматической попытки преобразования одного набора символов в другой ДЛЯ ЦЕЛЕЙ ЗАПРОСА .Например, если у вас есть кодировка latin1 и сопоставление UTF-8, и вы делаете что-то вроде SELECT * FROM foo WHERE bar LIKE '% -%';(UTF-8 U + 2014) на таблице с набором символов latin1, которые соответствуют либо L + 0151 или U + 2014.

Не так уж случайно ... если вы вывели этот латинский кодированный символ на веб-страницу в кодировке UTF-8, вы получите следующее:

Это «тест»€.

Это похоже на результат вашей проблемы.Вот HTML-код для его дублирования:

<?php
$string = "This is a “test”.";
?>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html;charset=utf8"/>
    </head>
    <body>
        <p><?php echo $string; ?></p>
    </body>
</html>

Убедитесь, что вы сохранили этот файл в latin1 ...

Чтобы увидеть, какой кодировке установлена ​​ваша таблица, выполните этот запрос:

SELECT CCSA.character_set_name, TABLE_COLLATION FROM information_schema.`TABLES` T,
       information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` CCSA
WHERE CCSA.collation_name = T.table_collation
  AND T.table_schema = "database"
  AND T.table_name = "table";

только правильные результаты для вашего использования (если вы не используете несколько неанглийских языков):

+--------------------+-----------------+
| character_set_name | TABLE_COLLATION |
+--------------------+-----------------+
| utf8               | utf8_general_ci |
+--------------------+-----------------+

Спасибо за голоса; -)

0 голосов
/ 07 июня 2015

Что бы ни стоило кому-либо, кто прочитал этот пост, я обнаружил, что добавление этих строк конфигурации mysqld - если у вас есть доступ к серверу mysql и вы можете вносить изменения - решило мою проблему с кавычками.

http://dev.mysql.com/doc/refman/5.6/en/charset-server.html

# Force UTF8 Charset Encoding
skip-character-set-client-handshake
collation_server=utf8_unicode_ci
character_set_server=utf8

Я дважды проверил SQL, вызываемый из PHP (который выглядел нормально), а также вручную выполнил вставку / обновление статистики с помощью фигурных кавычек из моего GUI (который работал нормально), но от веб-сервера все еще получал мульти-управляющие символы, вставленные в базу данных.

Я проверил свои переменные сервера mysql и заметил, что latin1 был значением по умолчанию для сервера и базы данных (хотя таблица / столбцы были UTF8). После того, как я добавил строки выше и обновил страницу, которая выдавала оператор обновления, фигурные кавычки вставлены правильно. Я могу только предположить, что это как-то связано с набором символов по умолчанию для нашего сервера latin1 и согласованием рукопожатия библиотеки mysql веб-сервера.

0 голосов
/ 17 января 2014

Убедитесь, что ваш PHP-файл имеет это вверху, прежде чем какой-либо контент будет напечатан. Я могу взять latin_swedish_ci на сайт с кодировкой utf8, и он правильно кодирует.

header("Content-type: text/html;charset=UTF-8");

Я также поставил это после подключения к базе данных (не уверен, насколько это важно):

mysql_query("SET NAMES 'utf8'");<br>mysql_query("SET CHARACTER SET 'utf8'");

0 голосов
/ 23 января 2012

Я нашел ответ здесь:

https://stackoverflow.com/a/1262210/105539

Кажется, это тоже не мешает моим персонажам в евро и британском фунте.

...