อักขระใดแสดงถึงบรรทัดใหม่ในพื้นที่ข้อความ


88

เพียงอย่างรวดเร็ว แต่ต้องการให้แน่ใจว่าฉันจับรูปแบบข้ามแพลตฟอร์มได้

ฉันต้องการแปลงบรรทัดใหม่ที่ป้อนลงในพื้นที่ข้อความเป็น [ลูกน้ำ] เพื่อให้สามารถแสดงผลลัพธ์ได้ในบรรทัดเดียวคำถามของฉัน ...

ขณะนี้การส่งจาก google chrome เมื่อฉันดูค่าฉันพบว่ามันใช้\r\nสำหรับบรรทัดใหม่ ถ้าฉันแทนที่\r\nฉันรู้ว่ามันจะใช้งานได้กับ chrome บน windows 7 แต่สิ่งที่เกี่ยวกับแพลตฟอร์มอื่น ๆ มีรูปแบบใดบ้างที่เบราว์เซอร์อื่นจะแทรกเป็นบรรทัดใหม่ภายในพื้นที่ข้อความ


3
เพื่อให้ง่ายขึ้น: ทำเฉพาะเบราว์เซอร์ทั้งหมดที่ส่ง '\ r \ n' เพื่อแสดงบรรทัดใหม่ที่ป้อนลงในพื้นที่ข้อความ (ฉันไม่ได้สร้างค่าโดยใช้โปรแกรม แต่จะสร้างโดยผู้ใช้ในเบราว์เซอร์เท่านั้น)
Ninjanoel

คำตอบ:


106

ตามข้อกำหนดของ HTML เบราว์เซอร์จะต้องกำหนดตัวแบ่งบรรทัดในการป้อนข้อมูลของผู้ใช้ไปที่ CR LF ( \r\n) และฉันไม่คิดว่าเบราว์เซอร์ใดจะทำผิด การอ้างอิง: ข้อ 17.13.4 ชนิดเนื้อหาฟอร์มในข้อกำหนด HTML 4.01

ในแบบร่าง HTML5 สถานการณ์มีความซับซ้อนมากขึ้นเนื่องจากพวกเขาจัดการกับกระบวนการภายในเบราว์เซอร์ด้วยไม่ใช่แค่ข้อมูลที่ส่งไปยังตัวจัดการฟอร์มฝั่งเซิร์ฟเวอร์เมื่อส่งแบบฟอร์ม ตามที่พวกเขา (และการปฏิบัติเบราว์เซอร์) textareaค่าองค์ประกอบมีอยู่ในสามรูปแบบ:

  1. ค่าดิบตามที่ผู้ใช้ป้อนผิดปกติ อาจมีคู่ CR, LF หรือ CR LF
  2. ค่าภายในเรียกว่า“ ค่า API” โดยที่ตัวแบ่งบรรทัดจะถูกปรับให้เป็น LF (เท่านั้น)
  3. ค่าการส่งซึ่งการแบ่งบรรทัดจะถูกทำให้เป็นมาตรฐานสำหรับคู่ CR LF ตามข้อตกลงทางอินเทอร์เน็ต

5
HTML 5 ข้อมูลจำเพาะ: w3.org/html/wg/drafts/html/CR/forms.html#the-textarea-elementthe user agent should allow the user to edit, insert, and remove text, and to insert and remove line breaks in the form of "LF" (U+000A) characters :
ComFreek

ขอบคุณคุณทำให้วันของฉัน! ฉันแค่สับสนเพราะเมื่อฉันส่งเนื้อหาจาก textarea บน osx / chrome เบราว์เซอร์จะส่งด้วย CR LF ..
starikovs

3
อีกคำถามคือทำไมเมื่อคุณได้รับ textarea ".length" มันจะนับ CR LF เป็นเพียงอักขระเดียว แต่เมื่อคุณตรวจสอบที่ฝั่งเซิร์ฟเวอร์ (เช่นด้วย PHP strlen) จะเป็นสองตัวอักษร ...
starikovs

2
ลิงก์ของ @ ComFreek ด้านบนเสียในวันนี้ให้ใช้: w3.org/TR/html5/forms.html#the-textarea-element
Glen Mazza

@starikovs ฉันคิดว่าสิ่งนี้ได้รับคำตอบด้วยค่าภายในที่เรียกว่า "ค่า API" ซึ่งการแบ่งบรรทัดจะถูกทำให้เป็นมาตรฐานของ LF (เท่านั้น) ส่วน. สิ่งที่คุณเห็นเป็นอักขระเดียว (กล่าวคือ\n) อาจเป็นสิ่งที่ "API ภายใน" มีให้ ไม่มีการอ้างอิงนี่เป็นเพียงข้อสันนิษฐานของฉันตามสามัญสำนึก
Dmitry Koroliov

12

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

หากคุณใช้สิ่งอื่นคุณจะทำให้เกิดปัญหาในการตัดและวางบนแพลตฟอร์ม Windows

การแบ่งบรรทัดจะถูกกำหนดโดยเบราว์เซอร์ windows เมื่อส่งแบบฟอร์ม แต่ถ้าคุณส่งแบบฟอร์มลงไปที่เบราว์เซอร์ด้วยการแบ่ง\nบรรทัดคุณจะพบว่าข้อความจะไม่คัดลอกและวางอย่างถูกต้องระหว่างเช่น notepad และ textarea

ที่น่าสนใจแม้ว่าจะมีรูปแบบการสิ้นสุดบรรทัด Unix \nแต่มาตรฐานในโปรโตคอลเครือข่ายแบบข้อความส่วนใหญ่รวมถึง HTTP, SMTP, POP3, IMAP และอื่น ๆ ยังคง\r\nอยู่ ใช่มันอาจไม่สมเหตุสมผล แต่นั่นคือประวัติศาสตร์และมาตรฐานที่กำลังพัฒนาสำหรับคุณ!


7

- Line Feed and 
 Carriage Return

เอนทิตี HTMLเหล่านี้ จะแทรกบรรทัดใหม่หรือการขึ้นบรรทัดใหม่ภายในพื้นที่ข้อความ


11
ไม่ตอบคำถามจริงๆ
cherouvim

2
@cherouvim ฉันไม่เข้าใจว่าทำไมคุณถึงให้คะแนนคำตอบนี้? คุณอ่านคำถามด้านบนแล้วหรือยัง? กรุณาอย่าให้คำตอบที่ผิดพลาดโดยไม่เข้าใจอะไรเลย!
Mahbub

3
@Mahbub: ขณะนี้คำตอบนี้มีผู้โหวตโหวต 3 ครั้งเนื่องจากยังไม่ตอบคำถาม
cherouvim

ไม่ตอบคำถาม
Mike Devenney

1
ฉันกำลังมองหาสิ่งที่ & # 13; หมายถึงและคำตอบนี้ช่วยฉันได้ดังนั้นอย่ารู้สึกแย่ข้อมูลทั้งหมดเป็นข้อมูลที่ดีและช่วยให้ผู้คนออกมาแบบสุ่ม :)
jackrabbithanna

6

ดูเหมือนว่าตามข้อกำหนดHTML5คุณสมบัติค่าขององค์ประกอบ textarea ควรคืนค่า '\ r \ n' สำหรับการขึ้นบรรทัดใหม่:

ค่าขององค์ประกอบถูกกำหนดให้เป็นค่าดิบขององค์ประกอบโดยใช้การแปลงต่อไปนี้:

แทนที่ทุกอักขระ "CR" (U + 000D) ที่ไม่ได้ตามด้วยอักขระ "LF" (U + 000A) และทุกอักขระ "LF" (U + 000A) ที่ไม่ได้นำหน้าด้วย "CR" ( U + 000D) โดยสตริงสองอักขระประกอบด้วยคู่อักขระ U + 000D CARRIAGE RETURN "CRLF" (U + 000A)

ตามลิงค์ไปที่ 'value' ทำให้ชัดเจนว่าหมายถึงคุณสมบัติค่าที่เข้าถึงในจาวาสคริปต์:

การควบคุมฟอร์มมีค่าและการตรวจสอบ (ส่วนหลังใช้โดยองค์ประกอบอินพุตเท่านั้น) ใช้เพื่ออธิบายวิธีที่ผู้ใช้โต้ตอบกับตัวควบคุม

อย่างไรก็ตามในเบราว์เซอร์หลักทั้งห้า (ที่ใช้ Windows 27/11/2015) ถ้า '\ r \ n' ถูกเขียนลงใน textarea '\ r' จะถูกตัดออก (เพื่อทดสอบ: var e = document.createElement ('textarea'); e.value = '\ r \ n'; alert (e.value == '\ n');) นี่เป็นความจริงของ IE ตั้งแต่ v9 ก่อนหน้านั้น IE กำลังส่งคืน '\ r \ n' และแปลงทั้ง '\ r' และ '\ n' เป็น '\ r \ n' (ซึ่งเป็นข้อมูลจำเพาะ HTML5) งั้น ... ฉันสับสน

เพื่อความปลอดภัยโดยปกติแล้วการใช้ '\ r? \ n' ในนิพจน์ทั่วไปก็เพียงพอแล้วแทนที่จะใช้แค่ '\ n' แต่ถ้าต้องทราบลำดับการขึ้นบรรทัดใหม่ก็สามารถทำการทดสอบเช่นข้างต้นได้ในแอป


จากหน้าเดียวกันค่าที่ได้รับผ่าน JS เรียกว่าค่า API ไม่ใช่หรือ
Anshul

@ Anshul - ฉันเข้าใจว่าคุณหมายถึงอะไร คำถามเดิมคือ "ขณะนี้ส่งจาก google chrome เมื่อฉันดูค่าฉันพบว่ามันใช้ \ r \ n สำหรับบรรทัดใหม่ ... " ดังนั้นเนื่องจากมีการ "ส่ง" ฉันจึงเดาว่ากำลังอ่านค่าอยู่ เซิฟเวอร์. ฉันคิดว่ามันเป็นของ JS อย่างไรก็ตามหวังว่าข้อเท็จจริงที่ฉันโพสต์จะมีประโยชน์บ้าง ขอบคุณสำหรับความคิดเห็นของคุณ
barncat

@brancat ฉันคิดว่าภาษาเซิร์ฟเวอร์ไม่น่าจะสำคัญที่นี่ ข้อกำหนดของ HTML5 นั้นชัดเจนมากใน 2 สิ่งสำหรับไฟล์textarea. 1. เนื้อหาคำขอจะมีเฉพาะ \ r \ n 2. ค่า JS จะมีเฉพาะ \ n ไม่ว่าคุณจะใช้ \ r, \ r \ n หรือ \ n ขณะพิมพ์ นอกจากนี้ยังตรงกับการค้นหาของคุณด้วย IE9 +
ชูล
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.