2009-09-19 27 views

Trả lời

15

Để làm cho nó ngắn gọn: bạn không thực sự biết về mã hóa (bộ ký tự) được sử dụng trên các biến được chuyển đến tập lệnh PHP của bạn qua GET hoặc POST (đặc biệt là GET là một vấn đề ở đây). Theo quy ước, trình duyệt gửi biểu mẫu tới tài nguyên phía máy chủ được chỉ định trong thuộc tính action bằng cách sử dụng mã hóa trang có thể được chỉ định qua một thẻ http-equiv -meta (charset -meta-tag trong HTML5) hoặc thông qua tiêu đề HTTP. Ngoài ra, một số trình duyệt cũng tôn trọng thuộc tính accept-charset trên biểu mẫu khi chọn mã hóa chính xác.

Việc mã hóa các tham số GET và chính URL đó phụ thuộc vào các stettings trình duyệt và do đó có thể được kiểm soát bởi người dùng. Bạn không nên dựa vào một mã hóa cụ thể.

Nói chung, bạn sẽ đi vòng quanh hầu hết các sự cố liên quan đến mã hóa bằng cách sử dụng UTF-8 cho mọi thứ và chỉ định mã hóa chính xác trong tiêu đề HTTP (Content-Type: text/html; charset=UTF-8) - điều này sẽ mang lại mã hóa chính xác (UTF-8) các biến được chuyển vào chuỗi của bạn (chúng tôi không nói về các kịch bản lệnh rouge cố ý gây rối với mã hóa để cho phép một số vectơ tấn công vào tập lệnh của bạn). Bạn cũng không nên dựa vào các ký tự không phải ascii trong các tham số GET của bạn hoặc trong URL (đó cũng là lý do tại sao các liên kết thân thiện với SEO loại bỏ các ký tự đó hoặc thay thế chúng).

Nếu bạn đảm bảo rằng UTF-8 là ký tự được phép duy nhất bạn có thể sử dụng mb_strlen($string, 'UTF-8') để kiểm tra độ dài của một biến chẳng hạn.

EDIT: (thêm một số liên kết)

Một số điều để bạn có thể đọc:

+0

Mã hóa của URL cũng phụ thuộc vào tài liệu giới thiệu. Chỉ khi URL được nhập trực tiếp vào thanh địa chỉ thì cài đặt của trình duyệt là rất quan trọng. – Gumbo

5

sử dụng mb_internal_encoding để biết mã hóa nào hiện được đặt. Nếu ứng dụng của bạn sử dụng nhật ký mã hóa khác, bạn nên sử dụng mb_strlen.

Chúc mừng

1

Thông thường bạn có quyền kiểm soát mã hóa ký tự khi tạo $ _REQUEST từ HTML bạn gửi cho khách hàng.

tức là: Trang được tạo bởi trang bạn đã gửi từ PHP.

Vì vậy, bạn không cần phải phát hiện mã hóa.

Sử dụng mb_functions yêu cầu bật tiện ích mở rộng nhiều byte - vì vậy nếu bạn đang phân phối mã, bạn phải biết rằng không phải ai cũng có.

header('Content-Type: text/html; charset=UTF-8'); 

HOẶC trong HTML:

<meta charset="utf-8"> 

http://www.w3.org/International/O-charset

Edit: PHP6 có utf-8 hỗ trợ, không PHP5.

+0

“các chức năng chuỗi là UTF-8 tương thích” . là nó có nghĩa là strlen trong php5 sẽ trả về độ dài chính xác của chuỗi utf8? – lovespring

+0

"Kể từ PHP5, các hàm chuỗi tương thích với UTF-8." Đó là dứt khoát không chính xác. Các hàm chuỗi nội bộ của PHP tất cả hoạt động trên cấp độ byte có nghĩa là chúng không thể xử lý các ký tự nhiều byte (hợp lệ cho PHP <6). Tất cả các hàm bên trong mà độ dài của một ký tự (theo byte) là quan trọng đối với hoạt động của nó là dễ bị lỗi khi làm việc với các bộ ký tự đó. Phần mở rộng multibyte đã đề cập (mb_ *) có khả năng quá tải nhưng tôi khuyên bạn không nên sử dụng nó. –

+0

Tôi đã được tắt ở đó, PHP5 không có bất kỳ hỗ trợ multibyte. – bucabay

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