2010-09-14 19 views
139

I'm writing code that automatically generates HTML, and I want it to encode things properly.앰퍼샌드를 <a href...>?

Say I'm generating a link to the following URL:

http://www.google.com/search?rls=en&q=stack+overflow 

I'm assuming that all attribute values should be HTML-encoded. (Please correct me if I'm wrong.) So that means if I'm putting the above URL into an anchor tag, I should encode the ampersand as &amp;, like this:

<a href="http://www.google.com/search?rls=en&amp;q=stack+overflow"> 

Is that correct?

+0

[URL을 무효로 만드는 문자는 무엇입니까?] (http://stackoverflow.com/questions/1547899/which-characters-make-a-url-invalid) –

+3

@CiroSantilli : 실제 URL 문자열에 관한 내용입니다. 이것은 HTML 속성에 나타날 때 인코딩되는 방법에 관한 것입니다. –

답변

154

Yes, it is. HTML entities are parsed inside HTML attributes, and a stray & would create an ambiguity. That's why you should always write &amp; instead of just & inside all HTML attributes.

That said, only & and quotes need to be encoded. If you have special characters like é in your attribute, you don't need to encode those to satisfy the HTML parser.

It used to be the case that URLs needed special treatment with non-ASCII characters, like é. You had to encode those using percent-escapes, and in this case it would give %C3%A9, because they were defined by RFC 1738에 인코딩합니까? 그러나 RFC 1738은 RFC 3986 (URI, Uniform Resource Identifiers) 및 RFC 3987 (IRIs, 국제화 된 리소스 식별자)으로 대체되었으며 여기에는 WhatWG based its work to define how browsers should behave when they see an URL with non-ASCII characters in it since HTML5. 따라서 비 ASCII 문자를 백분율로 인코딩 된 URL에 포함하는 것이 안전합니다.

+1

나는 이것에 관해 꽤 확신했다. 그러나 나는 드문 순간을 의심해 보았다. 확인해 주셔서 감사합니다. –

+1

또한 공백을 % 20 대신 "+"로 인코딩 할 수 있으므로 URL을 읽기 쉽게 만듭니다. – NickG

+1

+는 네이티브 iPhone 메일 클라이언트의 mailto 링크에서 현재 가치가있는 부분을 존중하지 않습니다. –

23

현재 공식적인 HTML 권고 사항에 따르면, 앰퍼샌드는 이스케이프되어야합니다. 예 : 이와 같은 문맥에서는 &amp;입니다. 그러나 브라우저에는 URL이 필요하지 않으며 HTML5 CR은이 값을 rule으로 지정하여 속성 값에 특수 규칙을 적용 할 것을 제안합니다. 현재 HTML5 검사기는 이와 관련하여 구식입니다 (의견이있는 bug report 참조).

속성 값에서 앰퍼샌드를 이스케이프하는 것은 가능하지만 현재 도구를 사용한 유효성 검사 외에는 href 값으로 이스케이프 할 필요가 없습니다 (이스케이프를 시작하면 실수 할 위험이 적음) .

+4

XHTML (* real * XHTML은'application/xhtml + xml'으로 보내집니다)은 항상 그것을 요구할 것입니다. – zneak

+3

이 변경 사항에 대한 한 가지주의 사항은 여전히 ​​논의되고 토론되고 오해되는데, "** un ** ambiguous"인 한, '&'는 이제 괜찮을 것입니다. 앰퍼샌드를 모호하게 만드는 한 가지 분명한 방법은 공백이 아닌 문자와 세미콜론을 먼저 사용하는 것입니다. 앰퍼샌드는 이제 모호하며 ** 해석 오류가 발생합니다. – matty

+0

Jukka가 말했듯이, 모든 앰퍼샌드를 인코딩 할 위험이 있으므로, href URL 중 하나에 세미콜론이 포함될 가능성이 얼마나 큰지 고려하십시오. 오히려 나는 세미콜론으로 URL을 본 적이 있는지 모르겠다. 그렇게 할 수는 없습니다. 실제적으로 말하자면, 우리가'&'를 사용하는 것이 모호 할 것이라고 생각하지 않습니다. 따라서 우리는 href 속성에서 인코딩되지 않은 것을 계속 사용합니다. – matty

2

예, &&amp;으로 변환해야합니다.

This html validator tool by W3C은 이와 같은 질문에 도움이됩니다. 특정 페이지에 대한 오류 및 경고를 알려줍니다.

+1

W3C 유효성 검사기가 오류 (href의 이스케이프 처리되지 않은 '&')를 오류로 감지하는지 확신하지 못합니다. – ChrisW

+1

현재 W3C 유효성 검사기는 이스케이프 처리되지 않은 &를 유효한 것으로 허용합니다. 표준이 변경되었고 인코딩이 더 이상 필요하지 않다는 것을 의미합니까? (대부분의 답변을 구형으로 만드는 것)? 그렇다면 href 또는 모든 속성에만 적용됩니까? – matteo

관련 문제