У меня возникли проблемы с использованием PHP для преобразования содержимого базы данных ISO-8859-1 в UTF-8. Я тестирую следующий код:
// Connect to a latin1 charset database // and retrieve "Georgia O'Keeffe", which contains a "'" character $connection = mysql_connect('*****', '*****', '*****'); mysql_select_db('*****', $connection); mysql_set_charset('latin1', $connection); $result = mysql_query('SELECT notes FROM categories WHERE id = 16', $connection); $latin1Str = mysql_result($result, 0); $latin1Str = substr($latin1Str, strpos($latin1Str, 'Georgia'), 16); // Try to convert it to UTF-8 $utf8Str = iconv('ISO-8859-1', 'UTF-8', $latin1Str); // Output both var_dump($latin1Str); var_dump($utf8Str);
Когда я запускаю это в исходном представлении Firefox, убедитесь, что параметр кодировки Firefox установлен на «Western (ISO-8859-1)», я получаю следующее:
Все идет нормально. Первый вывод содержит эту странную цитату, и я вижу ее правильно, потому что она в ISO-8859-1, и Firefox.
После того, как я изменил настройку Firefox на «UTF-8», он выглядит так:
Куда ушла цитата? Не iconv()
ли iconv()
преобразовать его в UTF-8?
U + 2019 RIGHT SINGLE QUOTATION MARK не является символом в ISO-8859-1. Это символ в windows-1252 , как 0x92. Фактический символ ISO-8859-1 0x92 – это редко используемый символ управления C1, называемый «Частное использование 2».
Очень часто неправильно использовать текстовые данные Windows-1252 с ярлыком кодировки ISO-8859-1. Многие веб-браузеры и почтовые клиенты обрабатывают кодировку MIME ISO-8859-1 в качестве символов Windows-1252 для того, чтобы учесть такую ошибочную маркировку, но это не стандартное поведение, и следует соблюдать осторожность, чтобы избежать генерации этих символов в ISO-8859-1 помеченный контент.
Похоже, это то, что здесь происходит. Измените «ISO-8859-1» на «windows-1252».
это решит вашу проблему, предположив, что ваша charset
заголовка страницы – utf-8:
// Opens a connection to a MySQL server $connection = mysql_connect ($server, $username, $password); $charset = mysql_client_encoding($connection); $flagChange = mysql_set_charset('utf8', $connection); echo "The character set is: $charset</br>mysql_set_charset result:$flagChange</br>";