Codeigniter和字符集

5
我使用Codeigniter不是很久,但我遇到了一些字符集的问题。我在CI论坛上询问了一下,但我想进一步了解,仍然没有全局解决方案:http://codeigniter.com/forums/viewthread/204409/ 问题是数据库错误1064。我找到了一个解决方法,使用iconv!效果不错,但我认为这并不是必要的。我在互联网上搜索了很多有关字符集等内容,但现在我正在使用CI,那么字符集和CI怎么办……
所以我有很多问题,希望有人能为我澄清:
最好的设置全局字符集的方法是什么?应该设置什么?
- 在头部 - 在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好(这是我现在正在使用的)?
- 对于MySQL数据库,使用utf8_unicode_ci还是utf8_general_ci?为什么?
- 阅读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;
}

Controller:

$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服务器版本对应的手册以获取正确的语法,位于第1行附近'vindt malware met certificaat van Maleisische overheid,   user_id ='1' WHERE `i'

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'

文件名:    /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和iconv两者有什么区别呢?


在你的 SQL 更新函数中,除了 rss_last 之外,所有参数都应该被引号引起来。是的,我知道这是由 CI 生成的,但这很可疑。 - Nikolay Baluk
这个可以正常工作,但我认为这不是必要的。 你是对的。 - Nikolay Baluk
2个回答

5

1) 没有全局解决方案。

2)

AddDefaultCharset UTF-8

需要让Apache以正确的编码方式响应客户端请求。请进行相应处理。
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

不一定必须,但是W3C建议这样做。
$config['charset'] = 'UTF-8';

it's desirable

$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上会失败。

我想要补充一点,这是必需的:在 .htaccess 中添加编码以及将所有 HTML 文件保存为 UTF-8 格式,对于 MYSQL ,需要设置 $db['default']['dbcollat'] = 'utf8_general_ci'。 - Nikolay Baluk
谢谢回复!我在我的帖子中添加了更多关于读取RSS源的信息。 - Roy

1

根据您的配置,UTF-8(无BOM)应该能够给您最好的结果,因为编码已经在头部分中选择了,所以不需要发送单独的标头。对于MySQL数据库,Utf8_general_ci应该可以很好地处理。也许数据库中的条目无效?


已经检查并更改了,但没有任何区别。仍然需要在查询之前放置iconv iconv(“UTF-8”,“UTF-8 // TRANSLIT”,$ value),否则我会收到1064数据库错误... 数据库中的条目无效?一切都有utf8_general_ci排序规则.. - Roy
  1. 你能给我完整的数据库错误吗?
  2. 我的意思是,也许在插入时条目不是utf-8格式。
  3. 也许你应该将PHP更新到5.3.x版本 - 几周前,我的一个朋友使用CI2和较旧版本的PHP时遇到了(略有不同的)数据库问题。他尝试了很多方法都没用...然后他更新了PHP,突然一切都好了...奇怪的bug。但这应该是你的最后选择。
- Shomz
刚刚添加了更多信息,我会要求我的托管提供商进行升级。 - Roy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接