Codeigniter и charsets

Я использую 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 1

UPDATE favorites SET id = '15', rss_last = F-Secure vindt malware met certificaat van Maleisische overheid, user_id = '1' WHERE id = '15' AND user_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?

5
задан Community 23 May 2017 в 11:54
поделиться