2011-11-16 19 views
5

używam CodeIgniter nie tak długo, ale mam pewne problemy charset .. Pytam wokół na Forum CI, ale chcę iść dalej, jeszcze nie globalne rozwiązanie: http://codeigniter.com/forums/viewthread/204409/CodeIgniter i charsets

Problem był błąd bazy danych 1064. Mam rozwiązanie, użyj iconv! Działa dobrze, ale myślę, że to nie jest konieczne. Dużo szukam w Internecie dla zestawu znaków itp., Ale używam CI teraz, a co z zestawami znaków i CI ...

Mam wiele pytań na ten temat, mam nadzieję, że ktoś może to jasno wyjaśnić dla mnie:

Jaki jest najlepszy sposób ustawienia zestawu znaków globalnie? A co ustawić?

  • W korpusie

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

  • w konfiguracji/config.php

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

  • w konfiguracji/Database.php

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

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

  • W .htaccess, moje zasady przepisywania i

    php_value magic_quotes_gpc Off

    AddDefaultCharset UTF-8

  • trzeba także wysłać nagłówek? Gdzie umieścić? Coś jak?

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

  • W moim edytora (Notepad ++) Zapisz pliki jako UTF-8? Lub UTF-8 (bez BOM)? A może ANSI jest dobre (to jest to, czego teraz używam)?

  • Użyj utf8_unicode_ci lub utf8_general_ci dla bazy danych MySQL? I dlaczego?

  • Co powiesz na czytanie kanałów RSS, jak obsługiwać wiele zestawów znaków? Gdzie pracuję Mam dwa kanały, jeden z kodowaniem UTF-8, a drugi z ISO-8859-1. Zostanie to zapisane w bazie danych i czasami będzie porównywane, aby sprawdzić, czy są nowe pozycje. Nie działa na specjalnych znakach.

pracuję z: - CI 2.0.3 - PHP 5.2.17 - MySQL 5.1.58

Więcej informacji dodania:

Model:

function update_favorite($data) 
{ 
$this->db->where('id', $data['id']); 
$this->db->where('user_id', $data['user_id']); 
$this->db->update('favorites', $data); 
return; 
} 

Kontroler:

$this->favorites_model->update_favorite(array(
'id' => $id, 
'rss_last' => $rss_last, 
'user_id' => $this->session->userdata('user_id') 
)); 

Kiedy $ rss_last jest „normalne” wartości takich jak: „test” (bez cudzysłowów) to działa dobrze. Jeżeli jest to wartość z większą długością podobnego (w języku polskim): F-Secure vindt malware spotkał Certyfikat van Maleisische Overheid

otrzymuję ten błąd:

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

Ktoś na forum CI kazał mi użyć tego :

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

działa to dobrze, ale myślę, że nie jest to konieczne ..

wartość $ rss_last wyszedł RSS, jak powiedział BEF rudy, czasem kodowania UTF-8 i inne razy w ISO-8859-1:

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

Wygląda na to ostatnia część jest problem, gdy $ rss_last jest ustawiona na wartość to działa dobrze:

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

Gdy wartość wyszedł RSS to stwarzać problemy ...

kilka pytań ..

Wystarczy znaleźć to: Detect encoding and make everything UTF-8

Najlepsze rozwiązanie? Ale .. jest iconv nie bardziej proste, zrobić coś takiego:

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

ale co do wykorzystania dla "some_function_to_get_encoding_from_feed"? mb_detect_encoding?

I mb_convert_encoding vs iconv?

+0

Do dodania: w twojej funkcji aktualizacji SQL wszystkie paramy się w cudzysłowach za wyjątkiem _rss_last_. Tak, wiem, że generowane przez CI, ale to jest podejrzane. –

+0

_To działa dobrze, ale myślę, że to nie jest konieczne .._ Twoje prawo. –

Odpowiedz

4

1) Nie ma globalnego rozwiązania.

2)

AddDefaultCharset UTF-8 

To jest potrzebne dla odpowiedzi Apache do klienta z odpowiednim kodowaniem. Zrób to.

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

niekoniecznie, ale zalecane przez W3C.

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

to pożądane

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

Kodowanie połączenie CI do bazy danych. Jeśli kodowanie bazy danych jest UTF-8 - spraw, aby było obowiązkowe.

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

Nie rób tego, chyba że jest to konieczne. Zestaw znaków już wskazany w kodzie HTML i .htaccess.

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

Dla ich własnego języka (rosyjski) używam utf8_general_ci.

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

Absolutnie! Cały kod, który Apache poda jako UTF8, powinien znajdować się w UTF8.

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

Jeśli masz każdą RSS w każdej tabeli - można określić kodowanie znaków dla każdej tabeli i ustawić właściwą kodowanie z każdego zapytania SQL. Tak, symbole cyrylicy na przykład nie powiedzie się na non-UTF8.

+0

Dodam, że jest to obowiązkowe: kodowanie w .htaccess i wszystkich plikach html zapisanych jako UTF-8 dla HTML i $ db ['default'] ['dbcollat'] = 'utf8_general_ci'; dla MYSQL. –

+0

Dzięki za odpowiedź! Właśnie dodałem trochę więcej informacji o czytaniu kanałów RSS w moim poście początkowym. – Roy

1

UTF-8 (bez BOM) powinien dawać najlepsze wyniki w oparciu o konfigurację i nie ma potrzeby wysyłania oddzielnych nagłówków, ponieważ kodowanie jest już wybrane w części głównej. Utf8_general_ci powinien zrobić dobrze dla bazy danych MySQL. Być może wpisy w bazie danych są nieprawidłowe?

+0

Sprawdzone i zmienione, ale nie powoduje żadnych różnic. Nadal trzeba umieścić iconv 'iconv (" UTF-8 "," UTF-8 // TRANSLIT ", $ value)' przed użyciem w zapytaniu, w przeciwnym razie dostaję błąd bazy danych 1064 ... Wpisy w bazie danych są nieprawidłowe ? Wszystko ma układ utf8_general_ci .. – Roy

+0

1) Czy możesz podać tutaj pełny błąd bazy danych? 2) Miałem na myśli, że wpisy nie były utf-8 kiedy zostały wstawione. 3) Być może powinieneś zaktualizować PHP do wersji 5.3.x - kilka tygodni temu znajomy miał (nieco inne) problemy z db przy użyciu CI2 i starszej wersji PHP. Nic, co próbował, nie działało ... potem zaktualizował PHP i wszystko było w porządku nagle ... dziwny błąd. Ale to powinna być twoja ostatnia deska ratunku. – Shomz

+0

Po prostu dodałem więcej informacji, a ja poproszę mojego dostawcę hostingu o uaktualnienie. – Roy