Я использую Codeigniter не так давно, но у меня есть некоторые проблемы с кодировками... Я спрашиваю на форуме CI, но я хочу пойти дальше, все еще нет глобального решения: http://codeigniter.com/forums/viewthread/204409/
Проблема была в ошибке базы данных 1064. У меня есть решение, используйте iconv! Работает отлично, но я думаю, что это не обязательно. Я много искал в интернете по поводу charset'ов и т.д., но сейчас я использую CI, как насчет charset'ов и CI...
Так что у меня много вопросов по этому поводу, надеюсь, кто-нибудь сможет мне прояснить:
Как лучше всего установить глобальный charset? И что установить?
В head
В config/config.php
$config['charset'] = 'UTF-8';
В config/database. php
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
В .htaccess мои правила перезаписи и
php_value magic_quotes_gpc Off
AddDefaultCharset UTF-8
Также нужно отправить заголовок? Где разместить? Что-то вроде?
header('Content-Type: text/html; charset=UTF-8');
В моем редакторе (Notepad++) сохранять файлы как UTF-8? Или UTF-8 (без BOM)? Или ANSI (это то, что я использую сейчас)?
Использовать utf8_unicode_ci или utf8_general_ci для базы данных MySQL? И почему?
Как насчет чтения RSS-лент, как работать с несколькими наборами символов? Там, где я работаю, у меня есть два фида, один с кодировкой UTF-8, а другой с ISO-8859-1. Они будут храниться в базе данных и иногда сравниваться, чтобы увидеть, есть ли новые элементы. При использовании специальных символов происходит сбой.
Я работаю с: - CI 2.0.3 - PHP 5.2.17 - MySQL 5.1.58
Добавлена дополнительная информация:
Модель:
function update_favorite($data)
{
$this->db->where('id', $data['id']);
$this->db->where('user_id', $data['user_id']);
$this->db->update('favorites', $data);
return;
}
Контроллер:
$this->favorites_model->update_favorite(array(
'id' => $id,
'rss_last' => $rss_last,
'user_id' => $this->session->userdata('user_id')
));
Когда $rss_last является "нормальным" значением, таким как: "test" (без кавычек), то все работает нормально. Когда это значение имеет большую длину, например (на голландском языке): F-Secure vindt malware met certificaat van Maleisische overheid
Я получаю эту ошибку:
Номер ошибки: 1064
У вас ошибка в синтаксисе SQL; проверьте руководство, которое соответствует версии вашего сервера MySQL для правильного использования синтаксиса. near 'vindt malware met certificaat van Maleisische overheid,
user_id
= '1' WHERE `i' at line 1UPDATE
favorites
SETid
= '15',rss_last
= F-Secure vindt malware met certificaat van Maleisische overheid,user_id
= '1' WHEREid
= '15' ANDuser_id
= '1'Filename: /home/.../domains/....nl/public_html/new/models/favorites_model.php
Номер строки: 35
Кто-то на форуме CI сказал мне использовать вот это:
'rss_last' => iconv("UTF-8", "UTF-8//TRANSLIT", $rss_last)
Это работает нормально, но я думаю, что это не нужно...
Значение $rss_last приходит из RSS ленты, как уже говорилось, иногда в кодировке UTF-8, а иногда в ISO-8859-1:
$rss = file_get_contents('http://www.website.com/rss.xml');
$feed = new SimpleXmlElement($rss);
$rss_last = $feed->channel->item[0]->title;
Похоже, что проблема в последней части, когда $rss_last установлено в значение, оно работает нормально:
$rss_last = 'F-Secure vindt malware met certificaat van Maleisische overheid';
Когда значение приходит из RSS, это дает проблемы...
Еще несколько вопросов...
Только что нашел вот это: Определить кодировку и сделать все UTF-8
Лучшее решение? Но... не проще ли iconv, сделать что-то вроде этого:
$encoding = some_function_to_get_encoding_from_feed($feed);
$rss_last = iconv($encoding, "UTF-8//TRANSLIT", $feed->channel->item[0]->title);
Но что использовать для "some_function_to_get_encoding_from_feed"? mb_detect_encoding?
И mb_convert_encoding vs iconv?