PHP: Проблемы с преобразованием символа "'" из ISO-8859-1 в UTF-8 - PullRequest
5 голосов
/ 15 сентября 2010

У меня проблемы с использованием 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)", я получаю следующее:

asd

Пока все хорошо.Первый вывод содержит эту странную кавычку, и я вижу ее правильно, потому что она в ISO-8859-1 и Firefox.

После того, как я изменил настройку кодировки Firefox на «UTF-8», это выглядит так:

asd

Куда делась цитата?Разве iconv() не должен был конвертировать его в UTF-8?

Ответы [ 2 ]

14 голосов
/ 15 сентября 2010

U + 2019 ПРАВИЛЬНАЯ ОДНОКВАЖНАЯ МАРКА ЦИТАТЫ не является символом в ISO-8859-1.Это символ в windows-1252 , как 0x92.Фактический символ ISO-8859-1 0x92 является редко используемым С1 управляющим символом , который называется «Частное использование 2».

Это очень распространенная ошибка в маркировке текстовых данных Windows-1252с этикеткой кодировки ISO-8859-1.Многие веб-браузеры и почтовые клиенты обрабатывают кодировку MIME ISO-8859-1 как символы Windows-1252, чтобы приспособиться к такой неправильной маркировке, но это не стандартное поведение, и следует избегать генерации этих символов в ISO-8859-1помеченный контент.

Похоже, что это то, что здесь происходит.Измените «ISO-8859-1» на «windows-1252».

0 голосов
/ 05 декабря 2013

это решит вашу проблему, если предположить, что заголовок вашей страницы 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>";
...