2009-11-25 13 views
8

Tôi đang cố gắng để thoát khỏi ký tự không phải ascii URL (mã hóa phần trăm) trong một số URL mà tôi đang xử lý. Tôi đang làm việc với một ứng dụng flash tải các tài nguyên như hình ảnh và clip âm thanh từ các URL này. Kể từ khi tên tập tin có thể chứa các ký tự khác ASCII không, như vậy: 日本語.jpg tôi thoát khỏi chúng bằng cách utf-8 mã hóa các ký tự, và sau đó phần trăm-thoát các byte unicode, để có được những điều sau đây:URL Thoát các ký tự Unicode Trung Quốc/Nhật Bản cho Internet Explorer

%E6%97%A5%E6%9C%AC%E8%AA%9E.jpg

Những tên tệp này hoạt động tốt khi tôi chạy ứng dụng trong bất kỳ trình duyệt nào khác ngoài Internet Explorer - tôi đã thử Firefox, Safari và Chrome. Nhưng khi tôi khởi động ứng dụng trong IE (thử cả 6 và 8) và nó sẽ cố gắng để tải các clip âm thanh, tôi nhận được: Error #2044: Unhandled ioError, và URL đã bị hỏng một cái gì đó như:

æ¥æ¬èª.jpg

Bất kỳ suy nghĩ về cách sửa lỗi này? Đây chỉ là kiểm tra lái xe ứng dụng flash với URL hệ thống tệp cục bộ. Tôi cũng nhận thấy rằng Internet Explorer không có khả năng xác định vị trí một file như: file:///C:/%E6%97%A5%E6%9C%AC%E8%AA%9E.jpg, mặc dù Chrome/Firefox sẽ giải mã nó và tải tốt cho một tập tin với đường dẫn

C:\日本語.jpg

sửa

tôi nghĩ rằng vấn đề của tôi là giống như một gặp phải trong đoạn mã ActionScript sau:

import flash.display.Loader; 
import flash.net.URLRequest; 
... 
var ldr:Loader; 
var req:URLRequest = new URLRequest("日本語.jpg"); 
ldr = new Loader(); 
ldr.load(req); 

Sử dụng chuỗi 日本語.jpg sẽ hoạt động trong IE, trong khi sử dụng chuỗi %E6%97%A5%E6%9C%AC%E8%AA%9E.jpg hoạt động trong các trình duyệt khác. Những gì tôi cần là một biểu mẫu duy nhất sẽ hoạt động trong tất cả các trình duyệt. Tôi đã thử mã hóa %u và đặt tiêu đề yêu cầu http thành Content-Type: text/html; charset=utf-8 không có may mắn ở dạng phần trăm thoát hoặc không thoát.

+0

Windows sử dụng UTF-16 cho tên tệp. Vì vậy, hãy thử '% 65% E5% 67% 2C% 8A% 9E'. – Gumbo

+0

Không có xúc xắc với tên UTF-16, IE vẫn không thể định vị nó. – Bear

+0

liên quan: http://stackoverflow.com/questions/75980/best-practice-escape-or-encodeuri-encodeuricomponent – cregox

Trả lời

1

Xin lỗi, không có giải pháp, nhưng có thể ít nhất một số thông tin thêm về những gì có thể xảy ra ở đây. (Có lẽ bạn đã tìm ra điều này nhiều, nhưng có lẽ nó sẽ giúp người đọc khác tìm ra giải pháp.) Đặc tả mã hóa url "chính thức" dường như mở rộng cửa như cách giải mã các url đã thoát như những thứ bạn đang tạo --are các thực thể thoát được dự định đại diện cho các ký tự UTF-8 (như Firefox, vv đang diễn giải chúng) hoặc các ký tự ASCII (khi IE đang diễn giải chúng)? Tôi không biết cách nào để ép buộc chiến lược giải mã dự định.

Chỉ cần một câu hỏi: điều gì đang xảy ra nếu bạn không thoát khỏi chúng ở tất cả, nhưng để unicode trong url? Mặc dù tôi không có nhiều kinh nghiệm với nó, tôi nghĩ rằng tôi nhớ đọc ở đâu đó rằng những ngày cần phải thoát khỏi unicode trong url được đằng sau chúng tôi. Có thể sai về điều đó ...

+0

Hầu hết các trình duyệt có vẻ ổn với các url chứa ký tự unicode. Tôi đang xây dựng một ứng dụng Flex, và các url của tôi là các liên kết đến các tài sản bên ngoài như clip âm thanh, hình ảnh, phim, v.v. Khi tôi chạy tệp .swf đã biên dịch trong trình cắm thêm flash, các tài sản này chỉ tải nếu các ký tự unicode là url/phần trăm đã thoát UTF-8. Nếu không, họ chỉ không tải được. Những tên tệp được thoát ra phần trăm này hoạt động tốt trong mọi trình duyệt ngoại trừ Internet Explorer. – Bear

+0

URI/URL (RFC 3986) yêu cầu mã hóa các ký tự không phải ASCII. IRI (RFC 3987), mặt khác, cho phép hầu hết các ký tự Unicode không được mã hóa. IRI là tiêu chuẩn mới thay thế tiêu chuẩn URI/URL cũ, nhưng nhiều hệ thống vẫn chưa triển khai IRI. Đặc tả IRI cung cấp các quy tắc để chuyển đổi IRI thành URI/URL và ngược lại. –

1

IE sử dụng UTF-8 cho Url HTTP, nhưng tôi không chắc về URL tệp (mặc dù tôi đã thử nghiệm hành vi này như một phần của nhóm IE khoảng 10 năm trước). Nếu bạn đang sử dụng URL trong HTML, tôi thực sự khuyên bạn nên thử các chuỗi ký tự chuỗi (nếu mã hóa trang của bạn là UTF-8) hoặc Tham chiếu Ký tự Số (& #dddd;). IE nói chung sẽ chuyển đổi các ký tự thành một mã hóa thích hợp, sẽ là UTF-8 cho các công cụ HTTP và UTF-16 cho các tương tác hệ thống tệp cục bộ.

Thực sự HTTP cần URL thoát, không phải trình phân tích cú pháp HTML.

1

Chỉ thử mã hóa các phần của URI có thể khiến nó bị phân tích cú pháp không chính xác. Ví dụ: mã hóa &,? Và không gian. Để mọi thứ khác như vậy, và nó sẽ hoạt động như một sự quyến rũ.

Nếu bạn vẫn gặp sự cố, bạn có thể cần phải đặt loại nội dung thành utf trong tiêu đề http của mình. Một cái gì đó như Content-type: text/html; charset = UTF-8.

+0

Thật không may, khuôn khổ tôi đang làm việc với - Flex - không xử lý các ký tự không được thoát, không phải ascii đặc biệt tốt. Tôi cần phải tìm ra nếu có một cách thích hợp xung quanh điều này. Tôi sẽ đào sâu trong khuôn khổ Flex để xem liệu có thể truy cập vào các tiêu đề HTTP, nhưng tôi đã hy vọng cho một giải pháp mức cao hơn. – Bear

1

Tại sao không chỉ sử dụng trình tự thoát Unicode? Dán nội dung này vào phần nội dung của trang web HTML để xem ý tôi là:

<script type="text/javascript"> 
     var fileName = "日本語.jpg"; 
     document.write(escape(fileName)); 
    </script> 

Tôi nhận% u65E5% u672C% u8A9E.jpg.

+0

Rất tiếc, chúng không hoạt động đối với tôi. Đây có phải là cách tiêu chuẩn để thoát URL không? Firefox không thể tải URL có dạng: 'tệp: ///.../% u3400.jpg', cho tệp có tên' 㐀 .jpg' trên đường dẫn đã cho. – Bear

+0

Xin lỗi, tôi đoán chỉ hoạt động với JavaScript/unescape. Tôi đã thử mã hóa của bạn, và nó hoạt động cho localhost của tôi. Như được đề cập ở elswhere, bạn có thể cần phải nói với máy chủ bạn đang gửi UTF-8 trong một tiêu đề. – Ishmael

+0

Nếu trang chủ của bạn có thẻ meta mã hóa, điều đó sẽ làm cho việc thuyết phục máy chủ bạn đang nói UTF-8. Tôi sẽ nghĩ. Có lẽ. – Ishmael

1

Từ những gì tôi đã thử nghiệm, tôi nhận thấy IE không xử lý các URL tệp được mã hóa nhưng nó xử lý các URL http bình thường, do đó có thể là vấn đề. Tôi không chắc chắn làm thế nào bạn đang tải chúng, nhưng bạn nên kiểm tra vấn đề đó.

+0

Điều này hóa ra là vấn đề. Điều khiển flash active-x (IE) chỉ tải các URL tệp không được mã hóa, trong khi plugin flash (Chrome, Firefox, Safari, v.v.) sẽ chỉ tải các URL tệp được mã hóa. Cách giải quyết duy nhất mà tôi đã có thể nghĩ ra cho đến nay là: nếu Flash player đang hoạt động-x sử dụng unencoded url khác sử dụng url-mã hóa url kinda hacky nếu bạn hỏi tôi. – Bear

1

tệp: // giao thức phụ thuộc vào cài đặt vùng OS của bạn, nếu cài đặt hệ thống của bạn không được đặt thành tiếng Trung nhưng tiếng Anh, bạn không thể cho phép IE thực hiện việc này.