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.
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. –