Danh sách các ký tự hợp lệ cho mã định danh phân đoạn trong một URL?


86

Tôi đang sử dụng mã nhận dạng phân đoạn để tạo liên kết cố định cho các sự kiện AJAX trong ứng dụng web của mình tương tự như anh chàng này . Cái gì đó như:

http://www.myapp.com/calendar#filter:year/2010/month/5

Tôi đã thực hiện khá nhiều tìm kiếm nhưng không thể tìm thấy danh sách các ký tự hợp lệ cho Idenitifer mảnh. Thông số kỹ thuật W3C không cung cấp bất cứ điều gì.

Tôi có cần mã hóa các ký tự giống như URL nói chung không?

Dường như không có bất kỳ thông tin tốt về điều này ở bất cứ đâu.

Câu trả lời:


98

Xem RFC 3986 .

fragment    = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"    
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
                 / "*" / "+" / "," / ";" / "="

Vì vậy, bạn có thể sử dụng !, $, &, ', (, ), *, +, ,, ;, =, một cái gì đó phù hợp %[0-9a-fA-F]{2}, một cái gì đó phù hợp [a-zA-Z0-9], -, ., _, ~, :, @, /, và?


Hoàn hảo, tôi đã tìm kiếm điều đó trong RFC nhưng dường như không thể tìm thấy mệnh đề phù hợp. Cảm ơn.
sohtimsso1970

1
@Artefacto, Vậy có nghĩa là "%" không được phép ở mọi nơi, mà chỉ được phép khi có hai ký tự hợp lệ theo sau nó?
Pacerier

1
@Pacerier có, %chỉ được phép làm ký tự thoát. Sử dụng %25để mã hóa một %.
gioele

1
Nút quay lại / chuyển tiếp không hoạt động với các mã nhận dạng phân đoạn có dấu hai chấm mặc dù RFC nói rằng đó là ký tự hợp lệ.
Vince

Chà! Có lẽ sẽ dễ dàng hơn để biết những ký tự ascii nào không thể được sử dụng!
e2-e4

30

http://tools.ietf.org/html/rfc3986#section-3.5 :

fragment    = *( pchar / "/" / "?" )

pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="
pct-encoded   = "%" HEXDIG HEXDIG

Vì vậy, kết hợp, đoạn không thể chứa #, một thô %, ^, [, ], {, }, \, ", <>theo RFC.


Cảm ơn. Đã gửi câu trả lời cho Artefacto vì anh ấy nhanh hơn một sợi tóc nhưng đã cho bạn +1 cho câu trả lời.
sohtimsso1970

2
Tôi cho rằng bạn đang thiếu các ký tự ASCII không in được và các ký tự không phải ascii.
Artefacto

2
Có vẻ như bạn quên VERTICAL BAR (|)GRAVE ACCENT (`)SPACE ( )trong tương lai không-list. Vì vậy, toàn bộ danh sách in (7-bit) ký tự US-ASCII trong tương lai không-list là:"#%< >[\]^`{|}
GitaarLAB

2

Một RFC khác nói về điều đó: RFC-1738

URL schemeparts for ip based protocols:
HTTP

httpurl        = "http://" hostport [ "/" hpath [ "?" search ]]
hpath          = hsegment *[ "/" hsegment ]
hsegment       = *[ uchar | ";" | ":" | "@" | "&" | "=" ]
search         = *[ uchar | ";" | ":" | "@" | "&" | "=" ]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.