2012-04-05 24 views
10

Dưới đây là một số ví dụ về tên tập tin:Làm thế nào để mã hóa tên tập tin đa byte trong PHP và giải mã chúng trong javascript?

漢語.jpg (Chinese) 
Федерация.jpg (Russian) 
AbÇöişÜĞ.jpg (Turkish, ISO-8859-9) 
... 

Tôi đã thử rawurlencode(mb_convert_encoding($file, "UTF-8", mb_detect_encoding($file))) nhưng điều này không làm việc, tất cả các ký tự Trung Quốc và Nga đã in dưới dạng% 3F (dấu hỏi thường xuyên) và tất cả các nhân vật Thổ Nhĩ Kỳ được loại bỏ.

Tôi đang thử nghiệm trên Windows, PHP 5.3.

Chỉ giải pháp mà tôi tìm thấy là nhập mã hóa một cách rõ ràng: rawurlencode(mb_convert_encoding($file, "UTF-8", "ISO-8859-9")) Chỉ hoạt động với các ký tự Thổ Nhĩ Kỳ.

Nhân tiện, mb_detect_encoding($file) luôn trả về "UTF-8" cho các tệp ở trên.

EDIT:
Sau khi tôi chạy đoạn mã sau tôi nghĩ rằng mb_convert_encoding() không thể giải quyết vấn đề của tôi:

$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator("mp", FilesystemIterator::UNIX_PATHS)); 
$iterator = new RegexIterator($iterator, '/^.+\.(gif|jpg|jpeg|png)$/i', RegexIterator::GET_MATCH); 

foreach ($iterator as $file) 
{ 
    foreach (mb_list_encodings() as $encoding) 
     var_dump(rawurlencode(mb_convert_encoding($file[0], "UTF-8", $encoding)) . " : " . $encoding); 
} 

Tôi đoán đây là một cái gì đó về mã hóa nhưng tôi không biết làm thế nào để làm.

+0

mb_detect_encoding() không phải là toàn bộ và sẽ không thành công thường xuyên, chỉ vì gần như không thể biết chắc mã hóa văn bản nào sử dụng. –

Trả lời

1

Vì vậy, điều chính là hầu hết các phương tiện (mạng, tệp, rpc) sẽ muốn các ký tự có nhiều byte nhất. Mã hóa URL (% FF) dự kiến ​​dữ liệu đầu vào là một byte cho mỗi ký tự.

Vì vậy, những gì bạn cần làm là sử dụng UTF8. Nó sẽ lấy các ký tự nhiều byte và tạo chuỗi ký tự 1 byte. Từ chuỗi này, bạn có thể làm những việc bình thường ascii có thể làm.

Những gì bạn muốn làm là thiết lập một cách rõ ràng mã hóa cho php:

mb_internal_encoding("UTF-8"); 

Bây giờ tất cả các chuỗi và tên tập tin, vv nội bộ của bạn sẽ là UTF-8 (byte đơn) được mã hóa. Từ đây bạn có thể lặp lại tên tập tin AS-IS và nó sẽ tấn công dữ liệu được mã hóa. Từ javascript, tất cả những gì bạn phải làm là gửi yêu cầu bằng AJAX và tất cả sẽ được giải mã một cách gọn gàng cho bạn một cách tự động, sẵn sàng sử dụng trong trình duyệt :) Chỉ cần đảm bảo bạn đặt loại nội dung trong tệp html của mình, vì điều này sẽ được sử dụng làm mã hóa JS mặc định của bạn.

<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ /> 
+0

Nếu tôi sử dụng 'mb_internal_encoding (" UTF-8 ");' trên đầu mã vẫn nhận được mã hóa sai 'rawurlencode (mb_convert_encoding ($ file [0]," UTF-8 "));' (ví dụ: các ký tự Nga được mã hóa thành % 3F (?)) – ahk

+0

bạn không cần phải sử dụng mb_convert_encoding ($ file [0], "UTF-8"), hoặc thậm chí rawurlencoding nếu bạn chỉ lặp lại dữ liệu (php sẽ tạo tất cả các chuỗi UTF-8 theo mặc định –

+0

I Tôi không sử dụng chúng lúc đầu, nhưng tôi có các ký tự lạ khi tôi chỉ lặp lại tên tập tin Html mã hóa tập tin là UTF-8 mà không có bom và kiểu nội dung là utf-8 quá.Giải pháp tôi tìm thấy là ở trên: 'rawurlencode (mb_convert_encoding ($ , "UTF-8", "ISO-8859-9")) 'nhưng điều này chỉ hoạt động đối với các ký tự Thổ Nhĩ Kỳ, vì" ISO-8859-9 "dành cho tiếng Thổ Nhĩ Kỳ: http://en.wikipedia.org/wiki/ ISO/IEC_8859-9 – ahk

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