Codeigniter и кодировки - PullRequest
       1

Codeigniter и кодировки

5 голосов
/ 16 ноября 2011

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

Ответы [ 2 ]

4 голосов
/ 16 ноября 2011

1) Глобального решения не существует.

2)

AddDefaultCharset UTF-8

Это необходимо для ответа Apache клиенту с правильной кодировкой. Сделай это.

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

не обязательно, но рекомендуется W3C.

$config['charset'] = 'UTF-8';

желательно

$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';

Кодировка для подключения CI к базе данных. Если кодировка вашей базы данных - UTF-8 - сделайте ее обязательной.

header('Content-Type: text/html; charset=UTF-8');

Не делайте этого без необходимости. Кодировка уже указана в HTML-коде и .htaccess.

Use utf8_unicode_ci or utf8_general_ci for the MySQL database? And why?

Для своего языка (русского) я использую utf8_general_ci.

In my editor (Notepad++) save files as UTF-8?

Абсолютно! Весь код, который Apache выдаст как UTF8, должен быть в UTF8.

How about reading RSS feeds, how to handle multiple charsets?

Если у вас есть каждый RSS в каждой таблице - вы можете указать кодировку для каждой таблицы и установить правильную кодировку для каждого SQL-запроса. Да, например, символы кириллицы не будут работать в кодировке, отличном от UTF8.

1 голос
/ 16 ноября 2011

UTF-8 (без спецификации) должен дать вам наилучшие результаты в зависимости от вашей конфигурации, и нет необходимости отправлять отдельные заголовки, так как кодировка уже выбрана в головной части.Utf8_general_ci хорошо подойдет для базы данных MySQL.Возможно, записи в базе данных недействительны?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...