2009-04-02 37 views
11

Tôi muốn truy cập tệp PHP có tên có ký tự UTF-8 trong đó.Tên tệp PHP (hoặc thư mục trong đường dẫn đầy đủ của nó) có các ký tự UTF-8 không?

Tệp không có BOM trong đó. Nó chỉ chứa một câu lệnh echo hiển thị một vài ký tự unicode.

Truy cập vào trang PHP từ trình duyệt (FireFox 3.0.8, IE7) kết quả trong lỗi HTTP 500.

Có hai mục trong nhật ký Apache (file là/க php;. Thư க là một tổng hợp một và tương ứng với các ký tự \ xe0 \ xae \ x95 trong nhật ký bên dưới):

[Sat Apr 04 09:30:25 2009] [error] [client 127.0.0.1] PHP Cảnh báo: Không xác định: không thành công luồng mở: Không có tệp hoặc thư mục nào trong Không xác định trên dòng 0

[Sat Apr 04 09:30:25 2009] [error] [client 127.0.0.1] PHP Lỗi nghiêm trọng: Không xác định: Không mở được yêu cầu 'D:/va/ROOT/\ xe 0 \ xae \ x95.php '(include_path =' .; C: \ php5 \ pear ') trong Không xác định trên dòng 0

Cùng một trang hoạt động khi tên tệp và dir bằng tiếng Anh. Trong cùng một thiết lập, không có vấn đề gì khi sử dụng SSI cho các trang này.

EDIT

thông tin Removed trên url viết lại vì nó dường như không phải là một yếu tố.

Khi mod_rewrite bị xóa, tệp PHP vẫn không hoạt động. Hoạt động nếu tệp được đổi tên thành tên không phải UTF. Tuy nhiên, shtml hoạt động ngay cả với các ký tự UTF trong tệp và/hoặc tên đường dẫn.

Trả lời

15

Tôi đã gặp phải vấn đề tương tự và thực hiện một số nghiên cứu và kết luận những điều sau đây. Điều này là dành cho php5 trên Windows; nó có lẽ đúng trên các nền tảng khác nhưng tôi chưa kiểm tra.

  1. ALL php chức năng hệ thống tập tin (dir, is_dir, is_file, tập tin, filemtime, filesize, file_exists vv) chỉ chấp nhận và gửi lại tên tập tin trong ISO-8859-1, không phụ thuộc vào default_charset thiết lập trong chương trình hoặc tệp ini.

  2. Trường hợp tên tệp chứa ký tự unicode dir-> read sẽ trả về nó làm ký tự ISO-8859-1 tương ứng nếu có, nếu không nó sẽ thay thế dấu chấm hỏi.

  3. Khi tham chiếu tệp, ví dụ: trong is_file hoặc tệp, nếu bạn chuyển vào một tên tệp UTF-8, tệp sẽ không được tìm thấy khi tên có chứa bất kỳ hai byte hoặc nhiều ký tự. Tuy nhiên, is_file (utf8_decode ($ filename)) etc sẽ làm việc với việc cung cấp ký tự UTF-8 có thể biểu diễn trong ISO-8859-1.

Nói cách khác, PHP5 không có khả năng xử lý tệp có ký tự nhiều byte trong tên của chúng.

Nếu URL UTF-8 có ký tự nhiều byte được yêu cầu và điều này tương ứng trực tiếp với tệp, PHP sẽ không thể mở tệp vì tệp không thể xử lý tệp.

Nếu bạn chỉ muốn URL đẹp trong ngôn ngữ của mình, đề xuất sử dụng mod_rewrite có vẻ như là một URL tốt.

Nhưng nếu bạn đang lưu trữ và truy xuất các tệp do người dùng tải lên và tải xuống, sự cố này phải được giải quyết. Một cách là sử dụng tên tệp tùy ý (không phải UTF-8), chẳng hạn như số gia tăng, trên máy chủ và lập chỉ mục các tệp trong cơ sở dữ liệu hoặc tệp XML hoặc một số tệp như vậy. Một cách khác là lưu trữ các tệp trong chính cơ sở dữ liệu dưới dạng BLOB. Một cách khác (có lẽ dễ dàng hơn để xem những gì đang diễn ra và không chịu vấn đề nếu chỉ mục của bạn bị hỏng) là tự mã hóa tên tệp - một kỹ thuật tốt là urlencode (sic) tất cả tên tệp đến của bạn khi lưu trữ trên máy chủ đĩa và urldecode chúng trước khi thiết lập tên tập tin trong tiêu đề mime cho tải về. Tất cả các ký tự không bình thường (ngoại trừ%) sau đó được mã hóa dưới dạng% nn và do đó, mọi vấn đề với không gian trong tên tệp, hỗ trợ đa nền tảng và khớp mẫu đều bị tránh.

+1

bạn có thể nhận php để mở các tập tin bằng cách quét các thư mục và sử dụng tên mà nó tìm thấy ngay cả khi nó đang ở trong một mã hóa khác nhau. –

+0

toàn diện, cảm ơn! – Znarkus

+0

http://stackoverflow.com/questions/1525830/how-do-i-use-filesystem-functions-in-php-using-utf-8-strings -> Tôi sẽ kiểm tra tại đây – Revenant

2

Chỉ vì bộ ký tự là UTF-8 không có nghĩa là nó hỗ trợ tất cả các ký tự cao hơn của Unicode.

Hỗ trợ Unicode là một trong những bổ sung chính trong PHP 6 và PHP 5 là bổ sung cho việc thiếu hỗ trợ unicode.

Nếu tập lệnh PHP của bạn đang tạo liên kết, nó có thể là một vấn đề khác với nếu apache diễn giải trực tiếp url và chuyển hướng url đó.

6
  • Tôi biết một thực tế PHP tự thể làm việc với URL Unicode, bởi vì tôi đã cố gắng sử dụng tên trang Unicode trong MediaWiki (dựa trên PHP, cũng chạy WikiPedia) và nó làm việc. Ví dụ: URL như /index.php/Page_name©. Vì vậy, PHP có thể xử lý nó. Nhưng nó có thể là một vấn đề với Apache tìm một tập tin mà tập tin nguồn có một tên UTF-8.

  • Cài đặt PHP.ini để mã hóa ký tự không được ảnh hưởng đến điều này; đó là công việc của máy chủ web để tìm một tài nguyên cụ thể và sau đó gọi PHP khi nó được xác định là một tệp PHP. Điều đó có nghĩa là máy chủ web và hệ thống tệp cơ bản, phải có khả năng xử lý các tên tệp UTF-8.

  • Tính năng này có hoạt động mà không có quy tắc mod_rewrite không? Tức là, nếu bạn vô hiệu hóa công cụ viết lại với RewriteEngine tắt và sau đó yêu cầu va.in/utf_dir/utf_file.php? Nếu có, thì đó có thể là vấn đề về cấu hình mod_rewrite hoặc sự cố với quy tắc.

  • Unicode trong URL có thể không được hỗ trợ đúng trong một số trình duyệt khi bạn chỉ cần nhập địa chỉ vào, chẳng hạn như các trình duyệt cũ hơn. Các trình duyệt cũ hơn có thể bỏ qua bước mã hóa UTF-8.Điều này sẽ không ngăn nó hoạt động nếu bạn đang theo một liên kết trên một trang, mặc dù trang đó được mã hóa UTF-8.

1

Không. Tên tệp PHP phải ở dạng ASCII, việc bạn thiết lập máy chủ PHP5 của bạn không thể giải quyết được vì vậy chúng tôi chờ PHP 6. Trong một tập lệnh PHP, bạn có thể xử lý tên tệp/url bằng utf8_decode . Bạn có thể sử dụng một .htaccess và SQL để có được rất nhiều vấn đề nhưng không có cách nào để chạy một tên tập tin unicode.

Câu trả lời của David Earl là chính xác.

0

Sử dụng "wfio: //" để ghi chép, e.t.c.

https://github.com/kenjiuno/php-wfio

Đối với thư mục:

.htaccess:

php_value auto_prepend_file C:/fix.php

sửa chữa.php:

$file = $_SERVER['SCRIPT_FILENAME']; 
if (!is_readable($file)) { 
    $file="wfio://".$file; 
       include $file; 
       exit; 
     } 

Nhưng tốt hơn để sử dụng php Linux OS

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