Codeigniter和charsets

Roy*_*Roy 5 php codeigniter character-encoding

我使用Codeigniter的时间不长,但我遇到了一些字符集问题.我在CI论坛上问过,但我想更进一步,仍然没有全球解决方案:http://codeigniter.com/forums/ viewthread/204409 /

问题是数据库错误1064.我有一个解决方案,使用iconv!工作正常,但我认为没有必要.我在互联网上搜索charset等等,但我现在正在使用CI,如何使用charsets和CI ...

所以我对此提出了很多疑问,希望有人能为我说清楚:

设置charset全局的最佳方法是什么?什么设置?

  • 在头上

    <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(没有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;
}
Run Code Online (Sandbox Code Playgroud)

控制器:

$this->favorites_model->update_favorite(array(
 'id' => $id, 
 'rss_last' => $rss_last,
 'user_id' => $this->session->userdata('user_id')
)); 
Run Code Online (Sandbox Code Playgroud)

当$ rss_last是一个"正常"值,如:"test"(没有引号),它工作正常.当它是一个更长的值(荷兰语)时:F-Secure vindt恶意软件遇到了证书van Maleisische overheid

我收到此错误:

错误号码:1064

您的SQL语法有错误; 查看与您的MySQL服务器版本对应的手册,以便在'vindt malware met certificaat van Maleisische overheid附近使用正确的语法, user_id='1'在第1行的'i'

UPDATE favoritesSET id= '15',rss_last= F-安全vindt恶意软件满足certificaat面包车Maleisische overheid,user_id= '1' WHERE 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) 
Run Code Online (Sandbox Code Playgroud)

这很好,但我认为这没有必要..

值$ 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;
Run Code Online (Sandbox Code Playgroud)

看起来这最后一部分是问题,当$ rss_last设置为它工作正常的值时:

$rss_last = 'F-Secure vindt malware met certificaat van Maleisische overheid';
Run Code Online (Sandbox Code Playgroud)

当价值出来时,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);
Run Code Online (Sandbox Code Playgroud)

但是什么用于"some_function_to_get_encoding_from_feed"?mb_detect_encoding?

和mb_convert_encoding vs iconv?

Nik*_*luk 5

1)没有全局解决方案。

2)

AddDefaultCharset UTF-8
Run Code Online (Sandbox Code Playgroud)

Apache 需要使用正确的编码来响应客户端。做了。

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Run Code Online (Sandbox Code Playgroud)

不一定,但 W3C 推荐。

$config['charset'] = 'UTF-8';
Run Code Online (Sandbox Code Playgroud)

这是可取的

$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
Run Code Online (Sandbox Code Playgroud)

CI 连接到数据库的编码。如果数据库的编码是 UTF-8 - 请将其设为强制。

header('Content-Type: text/html; charset=UTF-8');
Run Code Online (Sandbox Code Playgroud)

除非必要,否则不要这样做。字符集已在 HTML 代码和 .htaccess 中指示。

Use utf8_unicode_ci or utf8_general_ci for the MySQL database? And why?
Run Code Online (Sandbox Code Playgroud)

对于他们自己的语言(俄语),我使用 utf8_general_ci。

In my editor (Notepad++) save files as UTF-8?
Run Code Online (Sandbox Code Playgroud)

绝对地!Apache 以 UTF8 形式提供的所有代码都应该采用 UTF8。

How about reading RSS feeds, how to handle multiple charsets?
Run Code Online (Sandbox Code Playgroud)

如果每个表中都有每个 RSS - 您可以为每个表指定字符集,并为每个 sql 查询设置正确的编码。是的,例如,西里尔字母符号在非 UTF8 上将失败。