2011-11-16 35 views
5

sto usando Codeigniter non per tanto tempo, ma ho alcuni problemi charset .. Sto chiedendo attorno al Forum CI, ma voglio andare oltre, ancora una soluzione globale: http://codeigniter.com/forums/viewthread/204409/Codeigniter e set di caratteri

Il problema era un errore del database 1064. Ho una soluzione, usa iconv! Funziona bene, ma penso che non sia necessario. Sto cercando molto su internet per charset ecc, ma sto usando CI ora, che ne dici di charset e CI ...

Quindi ho un sacco di domande a riguardo, spero che qualcuno possa chiarire per me:

Qual è il modo migliore per impostare il set di caratteri globale? E cosa impostare?

  • Nella testa

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

  • In config/config.php

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

  • In config/database.php

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

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

  • In .htaccess, le mie regole di riscrittura e

    php_value magic_quotes_gpc Off

    AddDefaultCharset UTF-8

  • anche bisogno di inviare un colpo di testa? Dove collocare? Qualcosa di simile a?

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

  • nel mio editor (Notepad ++) salvare i file come UTF-8? O UTF-8 (senza BOM)? O è ANSI buono (questo è quello che sto usando ora)?

  • Utilizzare utf8_unicode_ci o utf8_general_ci per il database MySQL? E perché?

  • Che ne dici di leggere i feed RSS, come gestire più set di caratteri? Dove sto lavorando ho due feed, uno con codifica UTF-8 e l'altro con ISO-8859-1. Questo verrà memorizzato nel database e verrà confrontato a volte per vedere se ci sono nuovi elementi. Fallisce su caratteri speciali.

Sto lavorando con: - CI 2.0.3 - PHP 5.2.17 - MySQL 5.1.58

Maggiori informazioni aggiunto:

Modello:

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

Quando $ rss_last è un valore “normale” come: “test” (senza virgolette) funziona bene. Quando è un valore con più di lunghezza simile (in olandese): F-Secure vindt di malware incontrato certificaat van Maleisische overheid

ottengo questo errore:

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

Qualcuno al forum CI mi ha detto di utilizzare questo :

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

questo funziona bene, ma penso che questo non è necessario ..

Il valore $ rss_last è venuto fuori un feed RSS, come detto BEF minerale, a volte un UTF-8 e altre volte a ISO-8859-1 codifica:

$rss = file_get_contents('http://www.website.com/rss.xml'); 
$feed = new SimpleXmlElement($rss); 
$rss_last = $feed->channel->item[0]->title; 

Sembra che questa ultima parte è il problema, quando $ rss_last è impostato sul valore che funziona bene:

$rss_last = 'F-Secure vindt malware met certificaat van Maleisische overheid'; 

Quando il valore è venuto fuori l'RSS è dare problemi ...

Alcune altre domande ..

appena trovato questo: Detect encoding and make everything UTF-8

La migliore soluzione? Ma .. è iconv non di più semplice, fare qualcosa di simile:

$encoding = some_function_to_get_encoding_from_feed($feed); 
$rss_last = iconv($encoding, "UTF-8//TRANSLIT", $feed->channel->item[0]->title); 

Ma cosa usare per "some_function_to_get_encoding_from_feed"? mb_detect_encoding?

E mb_convert_encoding vs iconv?

+0

Per il vostro aggiunto: nella funzione SQL Update tutti i parametri sono tra virgolette eccetto _rss_last_. Sì, lo so che generato da CI, ma questo è sospetto. –

+0

_Questo funziona bene, ma penso che questo non sia necessario .._ Il tuo diritto. –

risposta

4

1) Non esiste una soluzione globale.

2)

AddDefaultCharset UTF-8 

E 'necessario per la risposta Apache per cliente con codifica a destra. Fallo.

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

non necessariamente, ma consigliato da W3C.

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

è desiderabile

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

codifica per il collegamento CI a base di dati. Se la codifica del database è UTF-8, renderla obbligatoria.

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

Non farlo se non necessario. Charset già indicato nel codice HTML e .htaccess.

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

Per la loro propria lingua (russo), io uso utf8_general_ci.

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

Assolutamente! Tutto il codice che Apache fornirà come UTF8 dovrebbe essere in UTF8.

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

Se si dispone di ogni RSS in ogni tabella - è possibile specificare set di caratteri per ogni tabella e impostare la codifica scorretto con ogni query SQL. Sì, i simboli cirillici, ad esempio, non funzioneranno su UTF8.

+0

Aggiungo che è obbligatorio: codifica in .htaccess e tutti i file html salvati come UTF-8 per HTML e $ db ['default'] ['dbcollat'] = 'utf8_general_ci'; per MySQL. –

+0

Grazie per la risposta! Ho appena aggiunto alcune informazioni sulla lettura dei feed RSS nel mio post iniziale. – Roy

1

UTF-8 (senza BOM) dovrebbe fornire i risultati migliori in base alla configurazione e non è necessario inviare intestazioni separate poiché la codifica è già selezionata nella parte principale. Utf8_general_ci dovrebbe andare bene per il database MySQL. Forse le voci nel database non sono valide?

+0

Controllato e modificato ma non fa differenza. Ancora bisogno di mettere iconv 'iconv (" UTF-8 "," UTF-8 // TRANSLIT ", $ valore)' prima di utilizzare in una query else ottengo l'errore del database 1064 ... Le voci nel database non sono valide ? Tutto ha la collazione utf8_general_ci .. – Roy

+0

1) Puoi darmi l'errore completo del database qui? 2) Intendevo che forse le voci non erano utf-8 quando sono state inserite. 3) Forse dovresti aggiornare PHP a 5.3.x - un paio di settimane fa un amico aveva problemi (leggermente diversi) con il db che usa CI2 e una versione precedente di PHP. Niente di quello che ha provato ha funzionato ... poi ha aggiornato PHP e tutto andava bene all'improvviso ... strano bug. Ma questa dovrebbe essere la tua ultima risorsa. – Shomz

+0

Ho appena aggiunto ulteriori informazioni e chiederò al mio provider di hosting di effettuare l'aggiornamento. – Roy

Problemi correlati