เบราว์เซอร์ส่ง“ \ r \ n” หรือ“ \ n” หรือไม่หรือขึ้นอยู่กับเบราว์เซอร์


102

คำถามนี้รบกวนจิตใจฉันมาเป็นล้านปี ... เมื่อใดก็ตามที่ฉันสร้างเว็บไซต์ด้วยพื้นที่ข้อความที่อนุญาตให้มีหลายบรรทัด (เช่น "ไบโอ" สำหรับโปรไฟล์ของผู้ใช้) ฉันมักจะเขียนโค้ดหวาดระแวงต่อไปนี้:

// C# code sample...
bio = bio.Replace("\r\n", "\n").Replace("\r", "\n");
bio = Regex.Replace(@"\n{2,}", "\n\n");

ดังนั้นเบราว์เซอร์จะส่งอะไรมา<textarea name="Bio"></textarea>หากมีหลายบรรทัด?


ว้าวฉันคิดว่านี่เป็นคำถามแปลก ๆ ที่ไม่ได้รับความสนใจเลย ... แต่ 16 โหวตใน 1 ชั่วโมงความบ้าคลั่ง
Timothy Khouri

คิดดูแล้วฉันไม่เคยเจอปัญหาที่เกี่ยวข้องกับเรื่องนี้ หากมีคนเข้าสู่บรรทัดใหม่ระบบจะแสดงเป็นบรรทัดใหม่ในระบบปฏิบัติการทั้งหมดในไคลเอนต์ MySQL ในเบราว์เซอร์ ฯลฯ ดูเหมือนว่าซอฟต์แวร์ส่วนใหญ่จะมีความสอดคล้องกันในเรื่องนี้ แน่นอนว่าถ้าฉันจะทำอะไรที่สำคัญกับมันฉันก็มักจะทำให้เป็นปกติ
Halil Özgür

ปัญหาจะเกิดขึ้นถ้าฉันใช้ "\ r \ n" จากนั้นกำลังสร้างไบโอของผู้ใช้ในเวอร์ชัน "จัดรูปแบบ HTML" และเนื่องจากฉันไม่เคยใช้ "\ r \ n" ฉันจึงรวมข้อมูลทั้งหมดไว้ใน หนึ่ง<p>แท็ก
Timothy Khouri

คำตอบ:


50

HTTPและMIMEรายละเอียดระบุว่าสายหัวจะต้องจบลงด้วยการ \ r \ n แต่พวกเขาจะไม่ชัดเจน (บางคนจะเถียงว่ามันไม่ชัดเจนว่าพวกเขามีความชัดเจน) เกี่ยวกับสิ่งที่จะทำอย่างไรกับเนื้อหาของพื้นที่ข้อความที่ (ดูตัวอย่างเช่นชุดข้อความนี้จากคณะทำงาน HTML เกี่ยวกับปัญหานี้)

นี่คือคำพูดจากข้อกำหนด HTTP / 1.1 เกี่ยวกับส่วนหัวของข้อความ:

ตัวยุติบรรทัดสำหรับฟิลด์ส่วนหัวของข้อความคือลำดับ CRLF อย่างไรก็ตามเราขอแนะนำให้แอปพลิเคชันเมื่อแยกวิเคราะห์ส่วนหัวดังกล่าวให้จดจำ LF เดียวเป็นตัวยุติบรรทัดและละเว้น CR ที่นำหน้า

ฉันคิดว่านั่นเป็นกลยุทธ์ที่ดีโดยทั่วไป: เข้มงวดกับสิ่งที่คุณผลิต แต่มีความโอบอ้อมอารีในสิ่งที่คุณยอมรับ คุณควรสมมติว่าคุณจะได้รับตัวยุติสายทุกประเภท (โปรดทราบว่านอกจาก CRLF และ LF แล้ว Mac OS-9 ยังใช้ CR เพียงอย่างเดียวและยังมีอีกไม่กี่คนที่อยู่รอบ ๆมาตรฐาน Unicode (หัวข้อ 5.8) ระบุลำดับอักขระที่หลากหลายซึ่งควรได้รับการยอมรับว่าเป็นตัวยุติบรรทัด มีรายชื่ออยู่ที่นี่ )


6
ฉันไม่เชื่อว่าสเปคระบุสิ่งที่สร้างพื้นที่ข้อความ
Mark Thomas

2
@ จะ: อ่านคำถามเดิมอีกครั้ง โดยเฉพาะถามเกี่ยวกับวิธีที่เบราว์เซอร์เข้ารหัสเนื้อหาของ a textarea(ซึ่งเป็นสิ่งที่ข้อกำหนดหรืออย่างน้อยส่วนที่ยกมาของ Ted ก็ไม่ได้ จำกัด )
John Bartholomew

2
@ มาร์ค - คุณพูดถูก มีการถกเถียงกันไม่รู้จบเกี่ยวกับปัญหานั้นในฟอรัมต่างๆ (ดูหัวข้อนี้ตั้งแต่ปี 1995จากคณะทำงาน HTML
Ted Hopp

2
คำตอบนี้ต้องได้รับการแก้ไข เริ่มต้นด้วยการอ้างถึงข้อมูลจำเพาะ HTTP แต่ไม่เกี่ยวข้องกับ textareas
DuckMaestro

2
ฉันทำแล้ว แต่คำตอบยังคงเริ่มต้นด้วยการอ้างถึง HTTP ซึ่งเป็นข้อกำหนดที่ไม่ถูกต้องที่จะเน้นย้ำหากกล่าวถึงเลย ใบเสนอราคาที่รวมไว้ของคุณโดยเฉพาะระบุ "ช่องส่วนหัวข้อความ" แต่textareaจะไม่ถูกส่งเป็นช่องส่วนหัวของข้อความ textareas ได้รับการเข้ารหัสเป็นข้อความ - เนื้อหาซึ่งแตกต่างกัน
DuckMaestro

30

เบราว์เซอร์จะส่งอะไรมา<textarea></textarea>หากมีหลายบรรทัด

เบราว์เซอร์สมัยใหม่ทั้งหมดส่ง CRLF ( \r\n) อย่างไรก็ตามนี่ไม่ใช่สิ่งที่ได้รับมาตรฐานที่น่าพอใจดังนั้นฉันคิดว่ามันคุ้มค่าที่จะทำให้บรรทัดใหม่ของข้อความอินพุตหลายบรรทัดทั้งหมดเป็นปกติ

เมื่ออ่านค่าผ่าน JavaScript แทนที่จะส่งจากฟอร์มโดยตรงพฤติกรรมของเบราว์เซอร์จะแตกต่างกัน IE และ Opera ส่งคืนสตริงที่มี CRLF ใน; Firefox และ WebKit ส่งคืน LF ดังนั้นแบบฟอร์มใด ๆ ที่ถูกส่งด้วยความช่วยเหลือ JavaScript / XMLHttpRequest มักจะมาในรูปแบบใดรูปแบบหนึ่ง


JavaScript ทำงานอย่างสม่ำเสมอบนเบราว์เซอร์ใด ๆ ในทุกแพลตฟอร์มหรือไม่ (ตัวอย่างเช่น Firefox ส่งคืนสตริงที่มี LF บน Windows, Macs และแพลตฟอร์มมือถือหรือไม่)
Ted Hopp

1
@Ted: พฤติกรรมนี้สอดคล้องกันในทุกแพลตฟอร์มบน Firefox, Opera และ WebKit IE5 / Mac ฉันยังไม่ได้ทดสอบเนื่องจากตอนนี้มันตายไปนานแล้ว แต่เบราว์เซอร์นั้นมีความแตกต่างมากมายกับ IE5 / Win
bobince
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.