Я использую Codeigniter не так давно, но у меня есть некоторые проблемы с кодировкой. Я спрашиваю об этом на форуме CI, но я хочу пойти дальше, но пока нет глобального решения: http://codeigniter.com/forums/viewthread/204409/
Проблема была в ошибке базы данных 1064. У меня есть решение, используйте iconv! Работает нормально, но я думаю, что в этом нет необходимости. Я много искал в интернете коды и т. Д., Но сейчас я использую CI, а как насчет кодировок и CI ...
Так что у меня много вопросов по этому поводу, я надеюсь, что кто-то может прояснить для меня:
Какой лучший способ установить глобальную кодировку? А что установить?
В голове
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
В 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 (без спецификации)? Или 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 встретило сертификат ван Малеисиске перегрев
Я получаю эту ошибку:
Номер ошибки: 1064
У вас ошибка в синтаксисе SQL; проверьте руководство, которое
соответствует вашей версии сервера MySQL для правильного использования синтаксиса
вредоносная программа в Виндте встретила сертифицированного ван Малеисиша,
user_id
= ‘1’ WHERE `i’ в строке 1
ОБНОВЛЕНИЕ favorites
SET id
= ‘15’, rss_last
= F-Secure vindt
Вредоносная программа встретилась с сертификатом Ван Малеисиша, user_id
= ‘1’
ГДЕ id
= ‘15’ И user_id
= ‘1’
Имя файла:
/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
Лучшее решение? Но .. это не так просто, сделайте что-то вроде этого:
$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 против iconv?