Trong Ruby on Rails 3 (hiện đang sử dụng Beta 4), tôi thấy rằng khi sử dụng form_tag
hoặc form_for
người trợ giúp, có một trường ẩn có tên _snowman
giá trị ☃ ( Unicode \ x9731) hiển thị.
Vì vậy, cái này để làm gì?
Trong Ruby on Rails 3 (hiện đang sử dụng Beta 4), tôi thấy rằng khi sử dụng form_tag
hoặc form_for
người trợ giúp, có một trường ẩn có tên _snowman
giá trị ☃ ( Unicode \ x9731) hiển thị.
Vì vậy, cái này để làm gì?
Câu trả lời:
Tham số này đã được thêm vào biểu mẫu để buộc Internet Explorer (5, 6, 7 và 8) mã hóa các tham số của nó dưới dạng unicode.
Cụ thể, lỗi này có thể được kích hoạt nếu người dùng chuyển mã hóa của trình duyệt sang Latin-1. Để hiểu lý do tại sao một người dùng sẽ quyết định làm một cái gì đó dường như rất điên rồ, hãy xem tìm kiếm google này . Khi người dùng đã đặt trang web vào chế độ Latin-1, nếu họ sử dụng các ký tự có thể hiểu là cả Latin-1 và Unicode (ví dụ: é hoặc ç, phổ biến trong tên), Internet Explorer sẽ mã hóa chúng bằng tiếng Latin -1.
Điều này có nghĩa là nếu người dùng tìm kiếm "Ché Guevara", nó sẽ xuất hiện không chính xác ở phía máy chủ. Trong Ruby 1.9, điều này sẽ dẫn đến lỗi mã hóa khi văn bản chắc chắn xuất hiện trong công cụ biểu thức chính quy. Trong Ruby 1.8, nó sẽ dẫn đến kết quả bị hỏng cho người dùng.
Bằng cách tạo một tham số chỉ có thể hiểu bởi IE là một ký tự unicode, chúng tôi buộc IE phải xem thuộc tính accept-charset, sau đó bảo nó mã hóa tất cả các ký tự dưới dạng UTF-8, ngay cả những ký tự có thể được mã hóa bằng tiếng Latin-1.
Hãy nhớ rằng trong Ruby 1.8, việc lấy dữ liệu Latin-1 vào cơ sở dữ liệu UTF-8 của bạn là vô cùng đơn giản (vì không có gì trong toàn bộ ngăn xếp kiểm tra rằng các byte mà người dùng gửi tại bất kỳ điểm nào là ký tự UTF-8 hợp lệ). Kết quả là, các ứng dụng Ruby (và ứng dụng PHP, v.v.) cực kỳ phổ biến để thể hiện lỗi đối mặt với người dùng này và do đó cực kỳ phổ biến đối với người dùng để cố gắng thay đổi mã hóa như một biện pháp giảm nhẹ.
Tất cả những gì đã nói, khi tôi viết bản vá này, tôi đã không nhận ra rằng tên của tham số sẽ xuất hiện ở nơi đối diện với người dùng (nó thực hiện với các biểu mẫu sử dụng hành động GET, chẳng hạn như biểu mẫu tìm kiếm). Vì vậy, chúng tôi sẽ đổi tên tham số này thành _e
và sử dụng một ký tự unicode trông vô hại hơn.
Đây là ở đây để hỗ trợ Internet Explorer 5 và khuyến khích nó sử dụng UTF-8 cho các hình thức của nó.
Thông điệp cam kết nhìn thấy ở đây chi tiết như sau:
Khắc phục một số sự cố mã hóa web đã biết:
- Chỉ định bộ ký tự chấp nhận trên tất cả các hình thức. Tất cả các trình duyệt gần đây, cũng như IE5 +, sẽ sử dụng mã hóa được chỉ định cho các tham số biểu mẫu
- Thật không may, IE5 + sẽ không xem xét bộ ký tự chấp nhận trừ khi ít nhất một ký tự trong các giá trị của biểu mẫu không có trong bộ ký tự của trang. Vì người dùng có thể ghi đè bộ
ký tự mặc định (mà Rails đặt thành UTF-8), chúng tôi cung cấp một đầu vào ẩn có chứa một ký tự unicode, buộc IE phải nhìn vào bộ ký tự chấp nhận.- Giờ đây, phần lớn đầu vào web là UTF-8, chúng tôi đặt các tham số gửi đến thành UTF-8. Điều này sẽ loại bỏ nhiều trường hợp mã hóa không tương thích giữa ASCII-8BIT và
UTF-8.- Bạn có thể yên tâm bỏ qua params [: _ snowman]
Nói tóm lại, bạn có thể bỏ qua thông số này một cách an toàn.
Tuy nhiên, tôi không chắc tại sao chúng tôi hỗ trợ các công nghệ cũ như Internet Explorer 5. Có vẻ như đó là một quyết định không phải của Ruby on Rails nếu bạn hỏi tôi.