2010-03-29 28 views
5

Tôi vừa tạo hàm ajax đầu tiên với jQuery thực sự hoạt động, nhưng tiếc là mã hóa ký tự (đối với các ký tự như ä, ö, ü, ß, č, ć, å , ø) là một cơn ác mộng.jQuery: AJAX umlauts & ký tự đặc biệt là một mớ hỗn độn

Tệp của tôi và cơ sở dữ liệu của tôi đều là UTF-8. Tôi đã thử vô số các tùy chọn trong hàm ajax và hàm PHP, không cái nào trong số đó là thỏa đáng.

Đây là ajax tôi

var dataString = { 
'name': name, 
'mail': mail 
// other stuff 
} 


    $.ajax({ 
type: "POST", 
url: "/post.php", 
data: dataString, 
contentType: "application/x-www-form-urlencoded;charset=UTF-8", 
cache: false, 
success: function(html){ 
// do stuff 
} 

Tôi đã thử nó mà không contentType: "application/x-www-form-urlencoded; charset = UTF-8" và tôi đã cố gắng để quấn dữ liệu bị ảnh hưởng trong encodeURIComponent(), không cái nào trong số đó hoạt động.

Khi tôi sử dụng AJAX với htmlentities() trong php của tôi, âm sắc của tôi trông như thế này trong văn bản đơn giản: UE Ã, AE Ã, OE Ã, ue ¼, ae ä, oe o

và như thế này trong cơ sở dữ liệu: UE & Atilde; œ, AE & Atilde; “, OE & Atilde ;, ue & Atilde; & frac14 ;, ae & Atilde; & Curren ;, oe o

Nếu tôi không sử dụng htmlentities() nhưng mysql_real_escape_string() thay vào đó (hoặc không), chúng trông đẹp trong văn bản thuần túy, nhưng chúng trông giống như thế này trong cơ sở dữ liệu: AE à „, OE Ö, UE Ãœ, ae ä oe ö ue ü

Tôi đã thử hàng tấn tùy chọn trong nhiều giờ, nhưng tôi không thể tìm được giải pháp hoạt động. Cho đến nay, lựa chọn duy nhất tôi dường như có là chúng trông giống như một mớ hỗn độn trong cơ sở dữ liệu, nhưng điều đó sẽ rất có hiệu quả nếu các tập dữ liệu đó cần được chỉnh sửa.

+1

Quan sát cuối cùng của bạn có cho thấy vấn đề có thể xảy ra với cơ sở dữ liệu (và có lẽ là PHP) hơn là với jQuery và AJAX không? –

+0

Tôi đã thử thay đổi mã hóa cơ sở dữ liệu thành latin1, nhưng không có sự khác biệt – rayne

Trả lời

6

Tôi đã cố gắng để quấn dữ liệu bị ảnh hưởng trong encodeURIComponent()

Nah, nếu bạn đang đi trong một đối tượng {}, jQuery sẽ chăm sóc UTF-8 và URL mã hóa nó cho bạn.

Khi tôi sử dụng AJAX với htmlentities() trong php của tôi, âm sắc của tôi trông như thế này trong văn bản đơn giản: UE Ã, AE Ã, OE Ã, ue ¼, ae ä, oe o

Nếu bạn phải sử dụng htmlentities(), bạn phải nói cho nó mã hóa của bạn là UTF-8 trong tùy chọn $charset lập luận, nếu không nó sẽ (ngớ ngẩn) mặc định để điều trị tất cả các byte của bạn như ISO-8859-1, và mã hóa chúng để phù hợp tham chiếu thực thể, một cho mỗi byte.

Tốt hơn là sử dụng htmlspecialchars() thay vào đó, vì nó không cố gắng áp dụng mã hóa không cần thiết cho các ký tự khác với vài ký tự ASCII thực sự cần.

Và như thế này trong cơ sở dữ liệu: UE AoE, AE à “, OE A-, ue ¼, ae ä, oe o

Làm thế nào để bạn xác định đó? Công cụ bạn đang sử dụng để lấy dữ liệu ra khỏi cơ sở dữ liệu có biết về Unicode không? (Nếu đó là giao diện quản trị web PHP tinh vi, có thể không. PHP không phải là tuyệt vời tại Unicode.)

Có thể bạn đang lưu trữ các byte UTF-8 thích hợp trong cơ sở dữ liệu, nhưng trong các bảng được đánh dấu là có Xoay vòng Latin-1.Điều này sẽ làm việc, trong nhiều như bạn sẽ nhận được cùng một byte ra như bạn đưa vào, nhưng nếu MySQL không biết họ là UTF-8 byte sau đó so sánh chuỗi phân biệt chữ hoa chữ thường ngoài phạm vi ASCII sẽ không hoạt động đúng , do đó, tìm kiếm Ä sẽ không khớp với ä. Điều đó có thể hoặc có thể không quan trọng với bạn.

Nếu tôi không sử dụng htmlentities() nhưng mysql_real_escape_string() thay vì

Whoah, cẩn thận. HTML-thoát là cho giai đoạn đầu ra cho trang. SQL-string-literal-escape xảy ra khi tạo một truy vấn SQL. Bạn cần cả hai, nhưng không trộn chúng lên hoặc cố gắng thực hiện chúng ở cùng một giai đoạn, hoặc bạn sẽ có tất cả các loại lỗ hổng thoát hiểm và sai sót tiềm ẩn.

+0

Khi tôi sử dụng htmlspecialchars(), các ký tự trông đẹp trên trang web nhưng như thế này trong cơ sở dữ liệu: ü (bất kể db là UTF-8 hay latin1). Tôi sử dụng SQLyog để truy cập cơ sở dữ liệu, tôi không có một webinterface như phpmyadmin. Họ cũng trông lộn xộn khi tôi sử dụng giao diện quản trị được xây dựng tùy chỉnh của tôi để chỉnh sửa chúng. – rayne

+0

OK, SQLyog * yêu cầu * để hỗ trợ Unicode để hy vọng nó sẽ được nhận nó đúng. Nếu bạn quan tâm đến dữ liệu ngay trong giao diện quản trị, bạn cần sử dụng 'TẠO TẠO ... TẬP ĐOẠN SET utf8' để tạo các bảng của bạn và gọi' mysql_set_charset ('utf8') 'từ PHP trước khi sử dụng cơ sở dữ liệu kết nối. – bobince

3

Có vẻ như sự cố xảy ra khi chèn dữ liệu vào cơ sở dữ liệu. Bạn đang sử dụng MySQL? Sau khi kết nối đến vấn đề máy chủ cơ sở dữ liệu của bạn truy vấn:

SET NAMES utf8; 

này sẽ cho các máy chủ cơ sở dữ liệu kết nối khách hàng có nhu cầu gửi dữ liệu dưới dạng UTF-8 và để giải thích nó như vậy.

Ngoài ra, khi gửi dữ liệu này cho trình duyệt hãy chắc chắn để đặt tiêu đề ContentType

header('Content-type: text/html; charset=utf-8'); 

này sẽ cho trình duyệt để giải thích các dữ liệu như UTF-8.

1

Hãy thử sử dụng chức năng này thay vì htmlentities

htmlspecialchars()

0

tôi cuối cùng đã tìm thấy một giải pháp mà làm việc cho tôi; Tôi đã xóacontentType: "application/x-www-form-urlencoded;charset=UTF-8" từ ajax jQuery của mình, tôi chỉ sử dụng htmlentities($value, ENT_NOQUOTES, 'UTF-8'); để xử lý dữ liệu với SQL và cơ sở dữ liệu của tôi được đặt thành utf8 unicode.

Các ký tự được hiển thị chính xác và được lưu trữ dưới dạng ä cho ä và vv trong cơ sở dữ liệu.

+0

Vui lòng không lưu trữ dữ liệu được mã hóa HTML trong cơ sở dữ liệu! HTML-thoát là một mối quan tâm đầu ra sẽ xảy ra luôn luôn và chỉ ở giai đoạn đầu ra trang. Nó không thuộc lớp truy cập dữ liệu. Nếu bạn đặt dữ liệu được mã hóa HTML trong cơ sở dữ liệu, bạn sẽ không thể thực hiện các tìm kiếm như 'LIKE '% uml%'' (nó sẽ không thể cho biết sự khác biệt giữa một âm sắc được mã hóa và văn bản "uml") , mọi hoạt động 'SUBSTRING' (bao gồm cắt tỉa ngầm do giới hạn độ dài trường) rủi ro phá vỡ tham chiếu thực thể và tạo HTML bị hỏng, và nó sẽ làm hỏng mọi việc sử dụng dữ liệu bảng không phải HTML như gửi thư. – bobince

+0

Oh thực sự?Tôi không biết điều đó, nhưng tôi là một lập trình viên xấu nói chung;) Khi tôi xóa htmlentities() khỏi tập lệnh của mình, các ký tự đặc biệt của tôi trông giống như thế này trong cơ sở dữ liệu lần nữa: ¼ Thật lạ lùng, khi tôi gửi dữ liệu chỉ thông qua PHP (khi tắt javascript), chúng trông đẹp trong cơ sở dữ liệu (ä). Vì vậy, vấn đề là rất có thể gây ra bởi ajax jQuery. – rayne

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