2013-06-21 31 views
5

Tôi gặp phải một vấn đề mới mà tôi chưa từng thấy trước đây: Khách hàng của tôi đang thêm tệp vào dự án mà chúng tôi xây dựng và một số tên tệp có các ký tự đặc biệt trong đó vì một số từ .Các ký tự không phải ascii trong URL

Ví dụ: một tệp tôi đang thử nghiệm có chữ Á trong đó. Tôi đang gọi hình ảnh đó trong một tệp css dưới dạng hình nền nhưng trong Safari nó không hiển thị. Nhưng nó có trên FF và Chrome.

Khi kiểm tra, tôi đã dán liên kết vào trình duyệt và điều tương tự. Hoạt động trên FF và Chrome nhưng Safari ném một lỗi. Vì vậy, các ký tự ngôn ngữ đang ném nó tôi đoán?

Firefox chuyển đổi url sau và thay đổi á thành% CC% 81 và tải hình ảnh.

http://www.themediacouncil.com/test/nonascii/LA-MAR_Cebiche -Clássico_foto-Henrique-Peron-470x120-1371827671.jpg

Bạn có thể thấy nó phá vỡ ở trên ... nhưng FF và Chrome chuyển đổi đó để: http://www.themediacouncil.com/test/nonascii/LA-MAR_Cebiche-Cla%CC%81ssico_foto-Henrique-Peron-470x120-1371827671.jpg

Bạn cũng có thể thấy điều này trong hành động ở đây: http://jsfiddle.net/Md4gZ/2/

.testbox { width:340px; height:100px; background:url('http://www.themediacouncil.com/test/nonascii/LA-MAR_Cebiche-Clássico_foto-Henrique-Peron-470x120-1371827671.jpg') no-repeat top left; }

Vì vậy, whats đúng cách để xử lý việc này. Tôi đang phát triển bằng PHP và WORDPRESS. Tôi không muốn yêu cầu khách hàng quay trở lại và thay thế tất cả các tệp bằng các ký tự đặc biệt.

Mọi trợ giúp đều được đánh giá cao. Cảm ơn!

Trả lời

7

Lạ lùng là không ai trả lời. Bây giờ nó có thể là quá muộn cho bạn, nhưng anyway:

Tôi tin rằng những gì đang trở thành tiêu chuẩn là chuyển đổi các ký tự không ascii thành chuỗi byte UTF-8 và bao gồm các chuỗi đó dưới dạng% HH hex trong URL. Ký tự á là U + 00E1 (Unicode), trong UTF-8 làm cho hai byte 0xC3 0xA1. Do đó, Clássico sẽ trở thành Cl%C3%A1ssico.

Chuyển đổi bạn báo cáo từ Firefox, Cla%CC%81ssico, đã làm điều này hơi khác: nó đã thay đổi á thành một tiếp theo là U + 0301, ký tự ACUTE ACCENT COMBINING. Trong UTF-8, U + 0301 làm cho 0xCC 0x81.

Cách khác, cũ hơn, cách xử lý ký tự latin không phải ascii là sử dụng bộ ký tự latin 8 bit, biểu diễn (ISO-8859-1 hoặc thứ gì đó tương tự, chẳng hạn như Windows-1252) và mã hóa dưới dạng một byte. Điều đó sẽ làm cho Clássico thành Cl%E1ssico. Nhưng vì điều này chỉ làm việc cho các nhân vật latin, và là mơ hồ đối với một số người trong số họ, đó là hy vọng và có thể biến mất.

+0

bạn có đề xuất khai báo nó trong tiêu đề để trình duyệt tự chuyển đổi các ký tự hoặc một loại tập lệnh nào đó không? Tôi có thiết lập tương tự như OP (Wordress) –

+1

Tôi không thể nói về bất kỳ thiết lập cụ thể nào, nhưng nói chung tôi đề nghị URL: s được mã hóa trong mã nơi chúng xuất hiện (trong html hoặc bất kỳ) sử dụng cùng một quy ước máy chủ web. Nếu bạn có bất kỳ ảnh hưởng nào của quy ước mà máy chủ web sử dụng, tôi khuyên bạn nên sử dụng các chuỗi byte UTF-8 sử dụng% HH. Khai báo nó trong tiêu đề? Không chắc chắn rằng sẽ có bất kỳ hiệu ứng, và có lẽ trình duyệt phụ thuộc. – njlarsson