Làm cách nào để biết ký tự được đặt trong $ _REQUEST? và cách đặt bộ ký tự $ _REQUEST?strlen, mb_strlen, để sử dụng?
Trả lời
Để 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:
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
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.
“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
"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ó. –
Tôi đã được tắt ở đó, PHP5 không có bất kỳ hỗ trợ multibyte. – bucabay
- 1. mb_strlen() là đủ?
- 2. libunistring u8_strlen() bằng strlen()?
- 3. strlen nhanh hơn?
- 4. sizeof vs strlen
- 5. hiểu hàm strlen trong C
- 6. Độ dài chuỗi Javascript khác với PHP mb_strlen
- 7. cách tìm chiều dài chuỗi sử dụng strlen trong mục tiêu c
- 8. 'không được khai báo trong phạm vi này' khi sử dụng strlen()
- 9. Biên dịch "strlen()" có hiệu quả không?
- 10. strlen: nó hoạt động như thế nào?
- 11. Có sử dụng strlen() trong điều kiện vòng lặp chậm hơn là chỉ kiểm tra ký tự null không?
- 12. bao nhiêu lần strlen() được gọi trong vòng lặp này?
- 13. strlen không được khai báo trong phạm vi này - C++
- 14. chênh lệch giữa sizeof và strlen trong c
- 15. strlen() trả về số chuỗi với null terminator
- 16. Tại sao strlen không hoạt động đối với tôi?
- 17. Tại sao PHP strlen() trả về độ dài âm?
- 18. strlen() trên chuỗi char không null kết thúc?
- 19. Độ dài chuỗi Javascript Khác với PHP mb_strlen (trên dòng văn bản, ngắt dòng)
- 20. PHP: Gọi để mb_strlen chức năng không xác định() - trên tùy chỉnh biên soạn PHP với mbstring kích hoạt
- 21. Cách sử dụng PKCS5_PBKDF2_HMAC_SHA1()
- 22. Có sự khác biệt nào giữa strlen() == 0 và rỗng() không?
- 23. Viết dòng nhị phân để trình duyệt sử dụng PHP
- 24. Sử dụng regex để lọc chuỗi theo chiều dài
- 25. Mã C gọi mã lắp ráp (ví dụ: strlen được tối ưu hóa) như thế nào?
- 26. strlen() chức năng php cho chiều dài sai ký tự unicode
- 27. Cảnh báo: strlen() dự kiến tham số 1 là chuỗi, mảng cho
- 28. PHP - tại sao không đếm() làm việc như strlen() trên một chuỗi?
- 29. Cách sử dụng iconv để chuyển đổi utf8?
- 30. Để sử dụng OpenID hay không sử dụng?
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