이 질문은 수백만 년 동안 저를 괴롭 혔습니다. 여러 줄을 허용하는 텍스트 영역 (예 : 사용자 프로필의 “Bio”)이있는 웹 사이트를 만들 때마다 항상 다음과 같은 편집증 코드를 작성합니다.
// C# code sample...
bio = bio.Replace("\r\n", "\n").Replace("\r", "\n");
bio = Regex.Replace(@"\n{2,}", "\n\n");
그렇다면 브라우저 <textarea name="Bio"></textarea>
는 여러 줄이 있는 경우 무엇을 보낼 까요?
답변
HTTP 와 MIME 사양은 헤더 행은 \ 연구 \ n로 끝나야합니다 지정,하지만 그들은 TEXTAREA의 내용으로 수행 할 작업에 대한 (일부는 그들이 명확한 경우는 취소되지 않는다는 주장) 명확하지 않다. (예를 들어 문제에 대한 HTML 작업 그룹 의이 스레드 를 참조하십시오 .)
다음은 메시지 헤더에 대한 HTTP / 1.1 사양의 인용문입니다.
메시지 헤더 필드의 행 종결자는 시퀀스 CRLF입니다. 그러나 애플리케이션은 이러한 헤더를 구문 분석 할 때 단일 LF를 줄 종결 자로 인식하고 선행 CR을 무시하는 것이 좋습니다.
나는 그것이 일반적으로 좋은 전략이라고 생각합니다. 당신이 생산하는 것에 대해서는 엄격하지만 받아들이는 것에 대해서는 자유로 워야합니다. 모든 종류의 줄 종결자를받을 것이라고 가정해야합니다. (CRLF 및 LF 외에도 Mac OS-9는 CR 만 사용했으며 여전히 일부가 있습니다. 유니 코드 표준 (섹션 5.8)은 줄 종결 자로 인식되어야하는 광범위한 문자 시퀀스를 지정합니다. 여기 에 그 목록이 있습니다 .)
답변
<textarea></textarea>
여러 줄이 있는 경우 브라우저는 무엇을 전송 합니까?
모든 최신 브라우저는 CRLF ( \r\n
)를 보냅니다 . 그러나 이것은 만족스럽게 표준화 된 것이 아니므로 모든 여러 줄 입력 텍스트의 줄 바꿈을 정규화하는 것이 가치가 있다고 생각합니다.
값을 양식에서 직접 제출하지 않고 JavaScript를 통해 읽을 때 브라우저 동작이 다릅니다. IE와 Opera는 CRLF가있는 문자열을 반환합니다. Firefox 및 WebKit은 LF를 반환합니다. 따라서 JavaScript / XMLHttpRequest 도움말과 함께 제출되는 모든 양식은 두 가지 양식으로 제공 될 수 있습니다.