2010-09-16 65 views
12

Tôi đang sử dụng json_encode trong PHP để mã hóa URLTại sao bộ mã hóa JSON thêm ký tự thoát khi mã hóa URL?

$json_string = array ('myUrl'=> 'http://example.com'); 
echo json_encode ($json_string); 

Đoạn mã trên tạo ra chuỗi JSON sau:

{"myUrl":"http:\/\/example.com"} 

Thay vì

{"myUrl":"http://example.com"} 

Tôi chỉ newbie, mà đầu ra là chính xác? Trình phân tích cú pháp JSON có thể đánh giá đầu ra thứ hai chính xác không?

Trả lời

8

Tôi đoán là các tác giả của hàm đó đã thêm rằng mã hóa không cần thiết thông qua không có gì hơn là sự thiếu hiểu biết đơn giản. Thoát dấu gạch chéo về phía trước là không phải là yêu cầu.

Một số lượng lớn các lập trình viên đáng kinh ngạc mà tôi đã biết cũng tồi tệ với việc giữ dấu gạch chéo thẳng như phần còn lại của thế giới. Và một số thậm chí còn lớn hơn thực sự kém khi thực hiện mã hóa và giải mã đúng cách.

Cập nhật:

Sau khi thực hiện một số tìm kiếm, tôi tình cờ gặp this discussion. Nó mang lại một điểm tốt mà thoát một / đôi khi là cần thiết cho các trình phân tích cú pháp HTML xấu. Tôi đã đi qua một vấn đề một lần mà khi IE 6 sai xử lý nội dung như thế này:

<script> 
    var json = { scriptString: "<script> /* JavaScript here */ </script>" }; 
</script> 

IE 6 sẽ thấy </script> bên trong chuỗi và đóng các thẻ script quá sớm. Như vậy, đây là hơn IE 6 an toàn (mặc dù thẻ mở kịch bản trong chuỗi cũng có thể phá vỡ mọi thứ ... Tôi không thể nhớ):

<script> 
    var json = { scriptString: "<script> \/* JavaScript here *\/ <\/script>" }; 
</script> 

Và họ cũng nói rằng một số phân tích cú pháp xấu sẽ thấy // trong http:// và xử lý phần còn lại của dòng như nhận xét JavaScript.

Vì vậy, có vẻ như đây là một trường hợp khác của công nghệ Internet bị tấn công bởi Lỗi trình duyệt.

+1

Tôi đồng ý. Nhưng đáng chú ý là chuỗi kết quả * là * hợp lệ. Trong chuỗi javascript, bạn được phép thoát khỏi ký tự * bất kỳ * bằng cách đặt trước dấu gạch chéo ngược. Vì vậy, "\ /" được giải thích bằng Javascript đơn giản là '/'. – Lee

+1

JSON không giống với JavaScript. Trong JSON bạn không được phép gạch chéo bất cứ thứ gì bạn thích. Nhưng tò mò, bạn được phép gạch chéo một dấu gạch chéo trong một chuỗi, vì vậy nó vẫn hợp lệ. :) – hobbs

9

Theo http://www.json.org/, ta nên thoát khỏi nhân vật, mặc dù nó không phải là thực sự cần thiết trong JavaScript:

strings

Cũng đọc related bug report này trên php.net cho một cuộc thảo luận ngắn gọn.

Xem 2.5 của RFC:

nhân vật Tất cả Unicode có thể được đặt trong dấu ngoặc kép trừ các nhân vật đó phải được thoát ra: dấu ngoặc kép, đảo ngược gạch chéo ở cuối, và các ký tự điều khiển (U + 0000 đến U + 001F).

Bất kỳ ký tự nào cũng có thể được thoát.

Vì vậy, nó không âm thanh như nó cần để được thoát, nhưng nó có thể được, và các trang web (và một sơ đồ văn bản trong RFC) minh họa nó như được thoát.

-2

Tôi thấy một vấn đề khác ở đây. Kết quả chuỗi {"myUrl":"http://example.com"} không được đặt tên thành viên myUrl được trích dẫn. Trong JavaScript và JSON, tôi nghĩ rằng tất cả các id thành viên của đối tượng theo nghĩa đen là các chuỗi không được trích dẫn. Vì vậy, tôi mong đợi kết quả là {myUrl:"http://example.com"}.

Lỗi này có vẻ quá lớn trong PHP, vì vậy tôi phải sai.

Chỉnh sửa, 2/11/11: Có, tôi sai. Cú pháp JSON yêu cầu ngay cả các tên trường được đặt trong dấu ngoặc kép.

4

Nếu bạn đang sử dụng php 5.4, bạn có thể sử dụng tùy chọn json_encode. xem manual.

Một số tùy chọn được thêm vào trong php 5.3 nhưng JSON_UNESCAPED_SLASHES trong 5.4.