2011-11-16 82 views
5

我用笨不是這麼長時間,但我有一些字符集問題..我問周圍的CI論壇,但我想走得更遠,還沒有全球性解決方案:http://codeigniter.com/forums/viewthread/204409/笨和charsets

問題是數據庫錯誤1064.我有一個解決方案,使用iconv!工作正常,但我認爲沒有必要。我正在尋找很多在互聯網上的字符集等,但我現在使用CI,如何字符集和CI ...

所以我有很多關於它的問題,我希望有人可以說清楚對我來說:

什麼是設置全球字符集的最佳方式?以及要設置什麼?

  • 在頭

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

  • 在配置/ config.php中

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

  • 在配置/ 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');

  • 在我的編輯器(記事本++)文件保存爲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就像是一個「正常」的值:「測試」(沒有引號)它工作正常。 當它與更象(荷蘭語)長度的值:F-Secure的vindt惡意軟件滿足certificaat麪包車Maleisische overheid

我得到這個錯誤:

Error Number: 1064

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use 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

Line Number: 35

有人在CI論壇上告訴我使用這個:

'rss_last' => iconv("UTF-8", "UTF-8//TRANSLIT", $rss_last) 

這工作得很好,但我認爲這是沒有必要的..

價值$ rss_last出來一個RSS源,如告訴BEF礦石,有時一個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它產生問題......

一些更多的問題..

剛剛發現這一點:Detect encoding and make everything UTF-8

最佳解決方案?但..是的iconv不是更簡單,做這樣的事情:

​​

但需要使用什麼「some_function_to_get_encoding_from_feed」? mb_detect_encoding?

而且mb_convert_encoding vs iconv?

+0

添加到您的:在您的SQL更新函數中,除_rss_last_之外的所有參數都在引號中。是的,我知道它是由CI產生的,但這是可疑的。 –

+0

_這工作正常,但我認爲這不是必要的.._你的權利。 –

回答

4

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'); 

除非必要,否則不要這樣做。 Charset已經在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 - 您可以爲每個表指定charset併爲每個sql查詢設置正確的編碼。 是的,例如,西里爾文符號在非UTF8上將失敗。

+0

我會補充說,它是必須的:編碼在.htaccess和所有HTML文件保存爲UTF-8的HTML和$ db ['default'] ['dbcollat​​'] ='utf8_general_ci';爲MYSQL。 –

+0

感謝您的回覆!只是在我的開始文章中添加了更多關於閱讀RSS源的信息。 – Roy

1

UTF-8(無BOM)應根據您的配置給出最佳結果,並且無需發送單獨的標題,因爲編碼已在頭部選擇。 Utf8_general_ci對MySQL數據庫應該沒問題。 也許數據庫中的條目無效?

+0

檢查並更改,但沒有區別。在查詢中使用之前,仍然需要放置iconv'iconv(「UTF-8」,「UTF-8 // TRANSLIT」,$ value)'否則我得到1064數據庫錯誤...數據庫中的條目無效?一切都有整理utf8_general_ci .. – Roy

+0

1)你能給我這裏的完整數據庫錯誤? 2)我的意思是,當插入它們時,條目可能不是utf-8。 3)也許你應該更新PHP到5.3.x--幾個星期前,一個朋友與使用CI2和舊版本的PHP的db存在(稍微不同)的問題。沒有他嘗試過的工作......然後他更新了PHP,一切都好起來了......怪異的bug。但這應該是你的最後手段。 – Shomz

+0

剛剛添加更多信息,我會要求我的託管服務提供商進行升級。 – Roy