2008-11-08 45 views
34

website của tôi là XHTML chuyển tiếp phù hợp ngoại trừ một điều: các & (và) trong URL được viết như nó có, thay vì &XHTML và & (và) mã hóa

Đó là, tất cả các url trong trang của tôi thường như thế này:

<a href="http://www.foo.com/page.aspx?x=1&y=2">Foo</a> 

Nhưng XHTML validator tạo ra lỗi này:

cannot generate system identifier for general entity "y"

... và nó muốn url được viết như thế này:

<a href="http://www.foo.com/page.aspx?x=1&amp;y=2">Foo</a> 

Vấn đề là IE và Firefox không xử lý đúng URL và bỏ qua các tham số y. Làm cách nào để liên kết này hoạt động và xác thực chính xác?

Dường như với tôi rằng không thể viết trang XHTML nếu trình duyệt không hoạt động với các URL XHTML được mã hóa nghiêm ngặt.

Bạn có muốn xem trong thực tế không? Thấy sự khác biệt giữa hai liên kết này (sao chép và dán chúng như họ đang có):

http://stackoverflow.com/search?q=ff&sort=newest 

http://stackoverflow.com/search?q=ff&amp;sort=newest 
+0

Sử dụng & trong URL của tài liệu XHTML của bạn sẽ hoạt động tốt, do đó, vấn đề có khả năng ở nơi khác, như những người khác đã chỉ ra. Nếu bạn tạo URL bằng cách sử dụng một số ngôn ngữ kịch bản phía máy chủ, có lẽ bạn có thể đăng một số mã đó, để những người khác có thể xem sự cố có thể xảy ra ở đó không? – Daan

Trả lời

54

Tôi vừa thử điều này. Những gì bạn đã cố gắng làm là chính xác. Trong HTML nếu bạn đang viết liên kết, các ký tự & phải được mã hóa là &amp; Bạn chỉ mã hóa & làm %26 nếu bạn muốn giá trị tham số chứa ký hiệu &. Tôi vừa viết một trang HTML đơn giản có chứa liên kết: <a href="Default2.aspx?param1=63&amp;param2=hel">Click me</a> và hoạt động tốt: default2.aspx đã nhận được các thông số dự định và nguồn đã qua xác thực.

Mã hóa &&amp; là bắt buộc trong HTML, không phải trong liên kết. Khi trình duyệt nhìn thấy &amp; trong nguồn HTML cho một liên kết, nó sẽ diễn giải nó dưới dạng ký hiệu và mục tiêu liên kết sẽ như dự định.Nếu bạn dán một URL vào thanh địa chỉ trình duyệt của bạn, nó không mong đợi nó là HTML và không cố gắng giải thích bất kỳ mã hóa HTML nào mà nó có thể chứa. Đây là lý do tại sao ví dụ của bạn liên kết mà bạn đề nghị chúng ta nên sao chép/dán vào một trình duyệt không hoạt động và lý do tại sao chúng tôi sẽ không mong đợi họ làm việc.

Nếu bạn đăng thêm một chút mã thực của mình, chúng tôi có thể xem bạn đã làm gì sai, nhưng dường như bạn đang đi đúng hướng bằng cách sử dụng &amp; trong thẻ neo của mình.

+0

cảm ơn nó hoạt động tuyệt vời –

5

bạn có thể sử dụng &amp; thay vì & trong url trong trang của mình.

Điều đó sẽ cho phép nó để được xác nhận một xhtml nghiêm ngặt ...

<a href="http://www.foo.com/page.aspx?x=1&amp;y=2">Foo</a> 

Lưu ý, nếu được sử dụng bởi một chức năng ASP.NET Request.QueryString, chuỗi truy vấn không sử dụng mã hóa XML, nó sử dụng URL encoding:

/mypath/mypage?b=%26stuff 

Vì vậy, bạn cần phải cung cấp một chức năng dịch '&' thành% 26

Lưu ý: trong trường hợp đó, Server.URLEncod e (”neetu & geetu”), sẽ tạo ra neetu +% 26 + geetu, không phải là thứ bạn muốn, vì bạn cần dịch & thành% 26, không chỉ '&'. Bạn phải thêm một cuộc gọi replace() được áp dụng cho kết quả URLEncode, để thay thế '% 26amp;' bởi '% 26'.

+0

Xin lỗi, tôi đã trả lời bạn bằng câu trả lời mới thay vì nhận xét ... xem câu trả lời của tôi nếu bạn muốn theo dõi chủ đề –

+0

Nhận bình luận của bạn ngay bây giờ;) Kiểm tra vấn đề này – VonC

6

Đó là lỗi của tôi: sự kiểm soát Hyperlink đã được mã hóa &, vì vậy url của tôi http://foo?x=1&amp;y=2 được mã hóa để http://foo?x=1&amp;amp;y=2

Thông thường & amp bên trong url được xử lý một cách chính xác bởi các trình duyệt, như bạn đã nêu. Cảm ơn

-4

Sự cố tồi tệ hơn bạn nghĩ - hãy thử nó trong Safari. & amp; được chuyển đổi thành & # 38; và băm kết thúc URL. Câu trả lời đúng là không xuất XHTML - không có lý do nào biện minh cho việc dành nhiều thời gian hơn cho phát triển và người dùng mac xa lánh.

+0

Nó sẽ là cũng như không hợp lệ trong HTML. – TRiG

-1

Để kỹ lưỡng hơn: sử dụng &#38;, một tham chiếu ký tự số số.

&amp; là một nhân vật thực thể tham khảo:

Character entity references are defined in the markup language definition. This means, for example, that for HTML only a specific range of characters (defined by the HTML specification) can be represented as character entity references (and that includes only a small subset of the Unicode range).

Đó là xuất phát từ những người khôn ngoan tại W3C (đọc this để biết thêm). Tất nhiên, đây không phải là một vấn đề rất lớn, nhưng gợi ý của W3C là số một sẽ hợp lệ và có thể sử dụng ở khắp mọi nơi và luôn luôn, trong khi tên được đặt là 'tốt' cho HTML nhưng không có gì hơn.

+0

Tài liệu đó cũng nói rằng ['&' hoạt động ở mọi nơi] (http://www.w3.org/International/questions/qa-escapes#use). – Quentin

+0

Các tên được đặt tên được ánh xạ tới các tham chiếu số cho mỗi DTD được áp dụng. Vì '&' được hỗ trợ bởi tất cả các XML và HTML DTD, điều đó khá nhiều luôn. Tuy nhiên, nếu không có phân tích cú pháp SGML "DTD" hoặc "đơn giản" sẽ không hoạt động và phần tử số sẽ làm việc. Ngoài ra, XML 1.0 chỉ có năm tham chiếu được xác định trước, vì vậy bạn có thể trộn tên và số thay vì chỉ sử dụng các số. – kasimir