2011-11-16 20 views
5

Tôi đang sử dụng CodeIgniter không quá lâu nhưng tôi đã một số vấn đề charset .. Tôi đang hỏi xung quanh tại CI diễn đàn, nhưng tôi muốn đi xa hơn, vẫn không có giải pháp toàn cầu: http://codeigniter.com/forums/viewthread/204409/CodeIgniter và bảng mã

Vấn đề là một lỗi cơ sở dữ liệu 1064. Tôi đã có một giải pháp, sử dụng iconv! Hoạt động tốt, nhưng tôi nghĩ rằng nó không cần thiết. Tôi đang tìm kiếm rất nhiều trên internet cho bộ ký tự của vv nhưng tôi đang sử dụng CI bây giờ, làm thế nào về charsets và CI ...

Vì vậy, tôi đã có rất nhiều câu hỏi về nó, tôi hy vọng ai đó có thể làm cho nó rõ ràng cho tôi:

Cách tốt nhất để đặt bộ ký tự toàn cầu là gì? Và những gì để thiết lập?

  • Trong đầu

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

  • Trong config/config.php

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

  • Trong config/database.php

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

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

  • Trong .htaccess, viết lại quy tắc của tôi và

    php_value magic_quotes_gpc Off

    AddDefaultCharset UTF-8

  • Cũng cần gửi một tiêu đề? Nơi để đặt? Cái gì đó như?

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

  • Trong biên tập viên của tôi (Notepad ++) lưu các tập tin như UTF-8? Hoặc UTF-8 (không có BOM)? Hoặc là ANSI tốt (đây là những gì tôi đang sử dụng bây giờ)?

  • Sử dụng utf8_unicode_ci hoặc utf8_general_ci cho cơ sở dữ liệu MySQL? Và tại sao?

  • Cách đọc nguồn cấp dữ liệu RSS, cách xử lý nhiều bộ ký tự? Tôi đang làm việc trên hai nguồn cấp dữ liệu của tôi, một với mã hóa UTF-8 và một với ISO-8859-1. Điều này sẽ được lưu trữ trong cơ sở dữ liệu và sẽ được so sánh đôi khi để xem có các mục mới hay không. Nó không thành công trên các ký tự đặc biệt.

Tôi đang làm việc với: - CI 2.0.3 - PHP 5.2.17 - MySQL 5.1.58

Xem thêm thông tin thêm:

mẫu:

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

Bộ điều khiển:

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

Khi $ rss_last là một giá trị “bình thường” như: “test” (không có dấu ngoặc kép) nó hoạt động tốt. Khi đó là một giá trị với chiều dài hơn như (tiếng Hà Lan): F-Secure vindt malware gặp certificaat van Maleisische overheid

tôi nhận được lỗi này:

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

người qua diễn đàn của CI nói với tôi để sử dụng này :

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

này hoạt động tốt, nhưng tôi nghĩ rằng đây là không cần thiết ..

giá trị $ rss_last ra một RSS feed, như đã nói BEF quặng, đôi khi một mã hóa UTF-8 và thời điểm khác một tiêu chuẩn ISO-8859-1:

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

Dường như phần cuối cùng này là vấn đề, khi $ rss_last được thiết lập với giá trị nó hoạt động tốt:

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

Khi giá trị ra RSS nó cung cấp cho vấn đề ...

Một số câu hỏi nhiều hơn nữa ..

Chỉ cần thấy câu này: Detect encoding and make everything UTF-8

Giải pháp tốt nhất? Nhưng .. là iconv không đơn giản hơn, làm một cái gì đó như thế này:

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

Nhưng những gì để sử dụng cho "some_function_to_get_encoding_from_feed"? mb_detect_encoding?

Và mb_convert_encoding vs biểu tượngv?

+0

Để bạn thêm: trong hàm SQL Update của bạn, tất cả các tham số đều có trong dấu ngoặc kép ngoại trừ _rss_last_. Có, tôi biết rằng nó được tạo ra bởi CI, nhưng điều này là đáng ngờ. –

+0

_Điều này hoạt động tốt, nhưng tôi nghĩ điều này là không cần thiết .._ Quyền của bạn. –

Trả lời

4

1) Không có giải pháp toàn cầu.

2)

AddDefaultCharset UTF-8 

Nó cần thiết cho Apache để đáp ứng khách hàng với mã hóa ngay. Làm đi.

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

không nhất thiết, nhưng được đề xuất bởi W3C.

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

đó là mong muốn

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

Encoding cho kết nối CI đến cơ sở dữ liệu. Nếu mã hóa cơ sở dữ liệu của bạn là UTF-8 - hãy bắt buộc nó.

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

Không làm điều này trừ khi cần thiết. Bộ ký tự đã được chỉ định trong mã HTML và .htaccess.

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

Vì ngôn ngữ riêng của họ (tiếng Nga), tôi sử dụng utf8_general_ci.

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

Tuyệt đối! Tất cả mã mà Apache sẽ cung cấp dưới dạng UTF8 phải ở dạng UTF8.

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

Nếu bạn có mỗi RSS trong mỗi bảng - bạn có thể chỉ định bảng mã cho mỗi bảng và đặt mã hóa đúng với mỗi truy vấn sql. Có, các ký hiệu cyrillic, ví dụ, sẽ thất bại trên non-UTF8.

+0

Tôi sẽ thêm rằng nó là bắt buộc: mã hóa trong .htaccess và tất cả các tệp html được lưu dưới dạng UTF-8 cho HTML và $ db ['default'] ['dbcollat'] = 'utf8_general_ci'; cho MYSQL. –

+0

Cảm ơn bạn đã trả lời! Chỉ cần thêm một số thông tin thêm về đọc các nguồn cấp dữ liệu RSS trong bài viết bắt đầu của tôi. – Roy

1

UTF-8 (không có BOM) sẽ cung cấp cho bạn kết quả tốt nhất dựa trên cấu hình của bạn và không cần gửi tiêu đề riêng vì mã hóa đã được chọn ở phần đầu. Utf8_general_ci nên làm tốt cho cơ sở dữ liệu MySQL. Có lẽ các mục trong cơ sở dữ liệu không hợp lệ?

+0

Đã kiểm tra và thay đổi nhưng không có sự khác biệt nào. Vẫn cần phải đặt iconv 'iconv (" UTF-8 "," UTF-8 // TRANSLIT ", $ value)' trước khi sử dụng trong truy vấn khác tôi nhận được lỗi cơ sở dữ liệu 1064 ... Mục nhập trong cơ sở dữ liệu không hợp lệ ? Mọi thứ đều có collation utf8_general_ci .. – Roy

+0

1) Bạn có thể cho tôi toàn bộ lỗi cơ sở dữ liệu ở đây không? 2) Tôi có nghĩa là các mục nhập có thể không phải là utf-8 khi chúng được chèn vào. 3) Có lẽ bạn nên cập nhật PHP lên 5.3.x - một vài tuần trước một người bạn có vấn đề (hơi khác) với db sử dụng CI2 và phiên bản cũ hơn của PHP. Không có gì anh ta cố gắng làm việc ... sau đó anh ta cập nhật PHP và mọi thứ đều ổn bất ngờ ... lỗi lạ. Nhưng đây sẽ là phương sách cuối cùng của bạn. – Shomz

+0

Chỉ cần thêm thông tin và tôi sẽ yêu cầu nhà cung cấp dịch vụ lưu trữ nâng cấp. – Roy

Các vấn đề liên quan