ทำไมอักขระพิเศษเช่น“ carriage return” แสดงเป็น“ ^ M”


93

เหตุใดจึง^Mใช้เป็นตัวแทนของการคืนสินค้าใน VIM และบริบทอื่น ๆ

ฉันเดาว่าMเป็นตัวอักษร 13 ตัวอักษรละตินและกลับรถเป็นหรือทศนิยม\x0D 13นี่คือเหตุผลหรือไม่ การเป็นตัวแทนนี้มีการบันทึกไว้ทุกที่หรือไม่?

ฉันสังเกตเห็นว่าแท็บแสดงโดย^Iซึ่งเป็นตัวอักษรที่เก้าของตัวอักษรละติน ในทางกลับกันแท็บคือ\x09หรือทศนิยม9ซึ่งสนับสนุนทฤษฎีของฉันที่ระบุไว้ข้างต้น อย่างไรก็ตามเอกสารนี้อาจมีการบันทึกไว้ที่ใด


1
โปรดทราบว่า dos / windows ใช้ "0x0d 0x0a" ซึ่งระบุไว้ว่า "CR LF" แต่ unix / linux ใช้เฉพาะ "0x0a" หรือ "LF" ดังนั้นเมื่อคุณเปิดเอกสาร windows ใน linux มันจะตรวจจับ "CR" พิเศษและเมื่อคุณเปิดเอกสาร linux ใน windows มันจะไม่ตรวจจับบรรทัดใหม่
LatinSuD

3
สัญกรณ์เครื่องหมาย @LatinSuD (และการใช้ Ctrl-key ที่เกี่ยวข้อง) เกี่ยวข้องกับชุดควบคุม C0 (ส่วนประวัติศาสตร์ของ ASCII) โดยตรงและไม่ว่าระบบปฏิบัติการหรือโปรแกรมที่กำหนดจะใช้ส่วนหนึ่งของชุดนั้นในการแสดงบรรทัดใหม่หรืออะไรก็ตาม อื่น. ในทำนองเดียวกันไม่ว่า^Hจะเป็นการลบอักขระหรืออนุญาตให้ใช้การพิมพ์ทับมากเกินไป (เช่นn^H~วิธีล้าสมัยในการสร้างñ) หรือการใช้งานจริงอื่น ๆของอักขระควบคุมจะแยกจากสัญรูปคาเร็ต
Jon Hanna

11
เก่า ... ฉันจำรหัสเดิมไม่ได้ แต่ ctrl-G ส่งเสียงระฆัง!
Brian Drummond

3
@OlivierDulac no ^ M เป็นเหมือน carriage return เหมือนกับ ^ J เป็นตัวป้อนบรรทัด ในขณะที่ระบบปฏิบัติการที่แตกต่างกันมีมุมมองที่แตกต่างกันไปว่า line-feed และ / หรือ carriage return หรืออย่างอื่น (เช่นอักขระ Newline ที่ใช้โดยอักขระ IBM บางตัว แต่ไม่ได้เป็นส่วนหนึ่งของ ASCII และไม่ได้เป็นส่วนหนึ่งของมรดกทางประวัติศาสตร์ของระบบปฏิบัติการอื่น ๆ ) เป็นตัวแทนของบรรทัดใหม่ในไฟล์ข้อความและในขณะที่บางโปรแกรมมีการแทนที่ว่าด้วยวิธีที่แตกต่างกัน U + 000D เองก็ยังคงเป็นสายการบินกลับสิ่งที่ระบบปฏิบัติการในภายหลังเช่น Unix หรือ DOS ตัดสินใจที่จะทำกับมัน (แน่นอนเรียกมันว่า ...
Jon Hanna

1
@OlivierDulac ... U + 000D เป็น proleptic เนื่องจากชื่อนั้นมาพร้อมกับ Unicode ในปี 1990 แต่มันค่อนข้างจะอ้างอิงถึงรหัสอย่างแน่นอนเนื่องจากมันมีอยู่ใน ASCII ในปี 1963 และผ่านเช่นที่มีอยู่ในรหัส Baudot ของ Murray ในปี 1901 เมอเรย์กำลังแก้ปัญหาที่เกี่ยวข้องกับการเคลื่อนย้ายกระดาษด้วยเครื่องมือเดียวกับที่ใช้ในแนวคิดของ "ไฟล์ข้อความ" หลายทศวรรษต่อมา ตอกตะปูลงไปในสิ่งที่เหมือนเล็บและมันก็ยังเป็นสกรู ใช้ LF และ / หรือ CR เพื่อแสดงจุดสิ้นสุดของบรรทัดในไฟล์ข้อความและยังคงเป็นตัวดึงบรรทัดและการขึ้นบรรทัดใหม่
จอนฮันนา

คำตอบ:


115

ผมเชื่อว่าสิ่งที่ OP เป็นจริงถามเกี่ยวกับการที่เรียกว่าแป้นพิมพ์โน้ต

เครื่องหมายคาเร็ตเป็นสัญกรณ์สำหรับอักขระควบคุมที่ไม่สามารถพิมพ์ได้ในการเข้ารหัส ASCII สัญกรณ์ประกอบด้วยคาเร็ต (^) ตามด้วยตัวพิมพ์ใหญ่; digraph นี้ย่อมาจากรหัส ASCII ที่มีค่าตัวเลขเทียบเท่ากับค่าตัวเลขของตัวอักษร ตัวอย่างเช่นอักขระ EOT ที่มีค่า 4 ถูกแทนด้วย ^ D เนื่องจาก D เป็นตัวอักษรตัวที่ 4 ในตัวอักษร อักขระ NUL ที่มีค่า 0 แสดงเป็น ^ @ (@ เป็นอักขระ ASCII หน้า A) อักขระ DEL ที่มีค่า 127 มักแสดงเป็น ^ ?, เพราะ ASCII '?' อยู่ก่อนหน้า '@' และ -1 จะเท่ากับ 127 ถ้ามาสก์เป็น 7 บิต อีกทางเลือกหนึ่งของการแปลคือพบว่าตัวอักษรที่พิมพ์ออกมาโดยการย้อนกลับรหัส ASCII ที่ 7

รายการทั้งหมดของอักขระควบคุม ASCII พร้อมกับเครื่องหมายรูปหมวกสามารถดูได้ที่นี่

เกี่ยวกับเสียงเรียกเข้าและเครื่องมือแก้ไขข้อความอื่น ๆ : โดยทั่วไปคุณจะเห็น ^ M เฉพาะเมื่อคุณเปิดไฟล์ข้อความที่จัดรูปแบบ Windows (CRLF) ในโปรแกรมแก้ไขที่คาดว่า Linux Line endings (LF) 0x0A ถูกเรนเดอร์เป็นตัวแบ่งบรรทัด 0x0D ก่อนที่จะถูกพิมพ์เป็น ^ M ส่วนใหญ่แล้วการตั้งค่าเริ่มต้นของเครื่องมือแก้ไขจะรวมถึง 'จดจำการสิ้นสุดของบรรทัดโดยอัตโนมัติ'


1
ฉันมักจะสงสัยว่าสิ่งที่ถูกเรียกว่า ...
smci

5
อนุสัญญานี้กลับไปสู่ยุค 1970 เป็นอย่างน้อย ฉันเห็นมันครั้งแรกในระบบปฏิบัติการ TOPS-10 แต่มันอาจมีอยู่ก่อนหน้านี้ สำหรับสิ่งที่คุ้มค่ากับเทอร์มินัล ASCII รุ่นเก่าตอนนี้ตัวละครที่แสดงเป็นคาเร็ตเป็นลูกศรชี้ขึ้นจริงดังนั้นสิ่งนี้มีต้นกำเนิดมาจาก
keshlam

15
สิ่งนี้ถูกสร้างขึ้นอย่างชัดเจนในการออกแบบ ASCII เพื่อให้ปุ่ม Ctrl เพิ่งสลับบิต 7
OrangeDog

2
มันไม่ได้ใช้เฉพาะกับตัวอักษร ฉันจะไม่ให้มันเป็นอักขระควบคุมด้วย "ค่าตัวเลขของจดหมาย" แต่เป็น "xor 64" ในคำอื่น ๆ^Aเป็น0x41 xor 0x40หรือ0x01และ^?เป็นหรือ0x3F xor 0x40 0x7F
...

1
Ascii DEL (^?) ไม่มีส่วนเกี่ยวข้องกับปุ่มลบ จริงๆแล้วมันเป็นรหัสมาตรฐานที่สร้างขึ้นโดย<---กุญแจ (หรือที่เรียกว่า backspace) บนเทอร์มินัลเหมือน VT100
. ..

22

นั่นคือเหตุผลที่แน่นอน

ASCII กำหนดอักขระ 0-31 เป็นรหัสควบคุมที่ไม่พิมพ์ นี่คือสารสกัดจากascii(7)หน้าคู่มือจากระบบ Linux แบบสุ่ม ( man ascii) จนถึงและรวมถึง CR (13):

   Oct   Dec   Hex   Char                       
   ─────────────────────────────────────────────
   000   0     00    NUL '\0'                    
   001   1     01    SOH (start of heading)     
   002   2     02    STX (start of text)         
   003   3     03    ETX (end of text)           
   004   4     04    EOT (end of transmission)   
   005   5     05    ENQ (enquiry)               
   006   6     06    ACK (acknowledge)           
   007   7     07    BEL '\a' (bell)             
   010   8     08    BS  '\b' (backspace)       
   011   9     09    HT  '\t' (horizontal tab)  
   012   10    0A    LF  '\n' (new line)        
   013   11    0B    VT  '\v' (vertical tab)    
   014   12    0C    FF  '\f' (form feed)       
   015   13    0D    CR  '\r' (carriage ret)    

อัตภาพตัวละครเหล่านี้จะถูกสร้างขึ้นด้วยControlและตัวอักษรที่เกี่ยวข้องกับตัวละครที่ต้องการ คีย์บอร์ดและเทอร์มินัลรุ่นแรก ๆ เขียน 'BELL' ไว้เหนือGปุ่มด้วยเหตุนี้

เอกสารมาตรฐานที่กำหนด ASCII คือASA X3.4-1963ซึ่งเผยแพร่โดย American Standards Association ในปี 1963 ฉันไม่สามารถหาเอกสารต้นฉบับบนเว็บไซต์ของพวกเขาได้ แต่สารสกัดจากเอกสารต้นฉบับนี้จะแสดงตารางตัวละครรวมถึง รหัสควบคุมด้านบน


4
ขอขอบคุณ. แม้ว่าจะมีข้อมูล แต่คำตอบนี้ไม่มีคำตอบสำหรับคำถาม
dotancohen

1
คำตอบนั้นถูกซ่อนอยู่ในย่อหน้าที่สอง: ^Mย่อมาจาก Control-M บนเทอร์มินัลคุณจะต้องกดปุ่มควบคุมพร้อมกับปุ่ม M เพื่อส่งรหัส ASCII kode 0x0D หรือที่รู้จักในชื่อ carriage return
Martin Liversage

14

สัญกรณ์ย้อนกลับไปยัง ASCII Teletypes ที่เร็วที่สุด (ca 1963) มีปุ่ม CTRL ที่สลับบิต 0x40 เพื่อให้ CTRL-M (carriage return) เป็น 0D แทนที่จะเป็น 4D, CTRL-G (ระฆัง) จะเป็น 07 แทน 47, CTRL-L (ฟีดฟอร์ม) จะเป็น 0C แทน ของ 4C

ไม่มี "การออกแบบ" ในการกำหนดตัวอักษรเฉพาะให้กับฟังก์ชั่นเฉพาะมันเป็นเพียงโอกาสที่เมื่อฝุ่นตกลงจากการกำหนดรหัส ASCII คีย์ M นั้นแตกต่างจากการรับคืนของการขนส่งเพียงเล็กน้อยและด้วยเหตุนี้การคืนรถจึงกลายเป็น CTRL-M

นี่คือช็อตที่ดีที่สุดที่ฉันสามารถหาได้จากคีย์บอร์ด ASR33 ในขณะที่คุณสามารถเห็นชื่อตัวละครที่ควบคุมจะถูกพิมพ์ด้วยตัวอักษรขนาดเล็กบนปุ่มอัลฟาที่เกี่ยวข้อง

Teletype รุ่น 33 ASR พร้อมแท่นเจาะกระดาษ / เครื่องอ่าน

ภาพโดย Marcin Wichary ผู้ใช้: AlanM1 (มาจาก (ครอบตัด) จากไฟล์: ASR-33 2.jpg ) [ CC BY 2.0 ], ผ่าน Wikimedia Commons

คีย์ M ไม่มีเครื่องหมายบนเนื่องจากมีคีย์ "RETURN" โดยเฉพาะดังนั้น CTRL-M จึงซ้ำซ้อน


2
ในบางระดับขอบเขตที่เรายังคงถูกผูกมัดโดยตัวเลือกการออกแบบที่ทำสำหรับสิ่งที่ดูเหมือนว่าระบบโบราณในปัจจุบันค่อนข้างน่าแปลกใจ - ฉันเดาว่าการไตร่ตรองว่า (a) เมื่อไม่นานมานี้ก็เป็นเพียงก้าวของการเปลี่ยนแปลง น่าประหลาดใจและ (b) หากมีการตัดสินใจในการออกแบบมากพอบางคน (โดยเฉพาะอย่างยิ่งคนที่ไม่ทำให้เกิดปัญหามากพอ) ถูกผูกติดอยู่นานหลังจากเหตุผลที่ทำให้พวกเขาหายเข้าไปในความทรงจำ ยังคงเป็นความรู้สึกแปลกที่จะมองย้อนกลับไปที่ประวัติศาสตร์ของบางสิ่งเหล่านี้แม้ว่า
Stuart Golodetz

2
@ StuartGolodetz - อันที่จริงฉันพบว่ามันน่าประหลาดใจ แต่ฉันจำได้เมื่อ Teletypes เป็น "เทคโนโลยีขั้นสูง" (Teletype ASR-33 ยังน่าทึ่งสำหรับความเรียบง่ายสง่างามฉันหวังว่าระบบคอมพิวเตอร์ "ทันสมัย" นั้นได้รับการออกแบบมาอย่างดี)
Daniel R Hicks

1
นี่เป็นสิ่งที่น่าสนใจ แต่สิ่งที่ฉันไม่เข้าใจคือทำไมพวกเขาตัดสินใจว่าเครื่องพิมพ์ดีดนี้ต้องการระฆัง
CaptainCodeman

4
@CaptainCodeman - เมื่อคุณส่งข้อความสำคัญคุณจะกดกริ่งเพื่อรับความสนใจจากผู้ดำเนินการในส่วนอื่น ๆ
Daniel R Hicks

2
เป็นที่น่าสนใจที่จะทราบว่าปุ่ม Ctrl ยังคงมีอยู่จนถึงทุกวันนี้บนคีย์บอร์ด PC
Daniel R Hicks

3

เครื่องหมายรูปหมวก (^) เป็นเพียงชวเลขสำหรับการเขียนกดปุ่มควบคุมค้างไว้ - CTRL ลง

ในวันเก่า ๆ ที่ดีคุณสามารถพิมพ์รหัสเหล่านี้ (ดูด้านบน) ในโดยตรงปุ่ม Ctrl + G (^ G) จะทำให้เครื่องไปที่ "ding"

เมื่อคุณต้องการเพิ่ม CR ในกลุ่มคุณใช้ปุ่ม Ctrl + M etc tab = Ctrl + I


คำที่คุณกำลังค้นหาคือdigraphซึ่งหมายถึงอักขระสองตัวที่แสดงถึงอักขระหนึ่งตัว โดยเฉพาะอย่างยิ่ง digraphs และ trigraphs ถูกใช้เพื่อแสดงถึงอักขระที่ไม่สามารถพิมพ์ได้ ในอดีตมีการใช้อักขระที่ไม่ปรากฏบนแป้นพิมพ์ด้วยแม้ว่าจะมี GUI และแป้นพิมพ์ที่ทันสมัยซึ่งเป็นปัญหาน้อยกว่าดังนั้นการใช้นี้จึงล้าสมัยมากกว่า

"ในวันเก่า ๆ ที่ดี" ยังคงเป็นวันนี้โดยที่ ^ C และ ^ D ทำงานได้อย่างสมบูรณ์แบบ เหตุผลเดียวที่ ^ G ไม่ได้ทำให้การปรับขั้วอีกต่อไปคือเทอร์มินัลอีมูเลเตอร์ส่วนใหญ่ปิดการตอบสนองนั้น
SevenSidedDie

2

ความจำเป็นในการแสดงภาพที่เป็นตัวอักษรที่ไม่สามารถสั่งพิมพ์ได้

ดังนั้นใครบางคนในต้นปี 1970 (หรืออาจจะเร็วกว่านี้) (ฉันจำได้ว่าเห็นมันใน CP / M และคนอื่น ๆ ได้กล่าวถึง TOPS แล้ว) ตัดสินใจว่า "caret plus letter" จะเป็นสัญลักษณ์สำหรับอักขระควบคุม ASCII ที่ไม่สามารถพิมพ์ได้ 26 ตัว 1 ถึง 26 ค่า 0 คือ / ถูกพิมพ์เป็น ^ @ และค่า 127 เป็น ^?


1

หน้านี้แสดงรายการอักขระควบคุมทุกตัวด้วยวิธีป้อน / แทนด้วยคีย์ควบคุม (แม้ว่าตัวแรกตัวอักษร ascii 0 ไม่มีการควบคุมการแสดงคีย์) และไม่มีสิ่งใดสำหรับอักขระ 127 และ มันให้แหล่งข้อมูลที่ด้านล่าง

https://www.cs.tut.fi/~jkorpela/chars/c0.html

บางคนอาจสงสัยว่าเนื่องจากมีตัวควบคุม 33 ตัว (อักขระ ASCII 0-31 ดังนั้น 32 ตัวอักษร + ตัวละคร 127. ดังนั้น = 33 ตัวอักษร) วิธีที่พวกเขาจะถูกนำเสนอทั้งหมดเนื่องจากมีเพียง 26 ตัวอักษรในตัวอักษร มันใช้ Ctrl-A สำหรับตัวอักษร Ascii 1, Ctrl-Z สำหรับตัวอักษร ASCII 26 และเมื่อมันมาถึง Ctrl-Z มันจะใช้ [ \ ] ^ _

จะแสดง Ctrl-Z เป็น SUB แม้ว่าจะอยู่ใน DOS และ cmd พรอมต์มันเป็น EOF และเป็นผู้ใช้เทคนิคที่คุณใช้มันเมื่อทำcopy con a.aที่a.aเป็นไฟล์ของคุณ คุณป้อนข้อความและยุติด้วย Ctrl-Z ซึ่งสนุกพอไม่ได้ใส่เครื่องหมาย EOF แต่บอก CMD ว่าเป็นจุดสิ้นสุดของไฟล์เพื่อให้ CMD เขียนมัน

หน้าเว็บ cs.tut.fi นั้นให้สิ่งนี้เป็นแหล่ง
http://www.wps.com/texts/codes/X3.4-1963/index.html

แต่มันเป็นลิงค์เสีย แต่มีอยู่ใน archive.org ซึ่งอยู่ในรูปของ JPG

รหัสมาตรฐานอเมริกันสำหรับการแลกเปลี่ยนข้อมูล
มาตรฐาน ASA X3.4-1963

https://web.archive.org/web/20010430085116/http://www.wps.com/texts/codes/X3.4-1963/index.html


อักขระควบคุมส่วนใหญ่ไม่มีความหมาย แต่แม้กระทั่งบางตัวที่มีความหมายเช่น Ctrl-I ฉันไม่แน่ใจว่าคุณสามารถทำ Ctrl-I และรับแท็บได้ที่ไหน
barlop

1
ไม่มีอักขระควบคุมใดที่ไม่มีความหมาย หลายคนไม่ได้ใช้ในหลายบริบท แต่ทุกคนมีความหมายอย่างน้อยหนึ่งข้อ
จอนฮันนา

@ JonHanna แน่นอนฉันไม่ได้หมายความว่าพวกเขาไร้ความหมาย (อดีตกาล) แต่ R.Have นั้นไร้ความหมายมานานหลายทศวรรษนั่นคือพวกเขามีความหมายดั้งเดิมของพวกเขามาจากมหายุคที่ผ่านมาเทคโนโลยีที่ไม่ทำงานอีกต่อไป w / ปัจจุบันและแม้กระทั่งเทคโนโลยีเก่า ๆ เล็กน้อยหากมีสิ่งใดที่ถูกนำไปใช้ในปัจจุบันก็ไม่มากนัก มีรายการอยู่ที่นี่en.wikipedia.org/wiki/Control_character ของคนทั่วไป 0,7,8,9,10,11,12,13,127 9/33 ดังนั้นคนอื่น ๆ (24 คน) คุณอาจจะไม่ค่อยได้เลยหรือแทบไม่ได้เลยว่าพวกเขาตายไปแล้วเหมือนกับแอนติคที่ไม่ได้ใช้งานมานานหลายสิบปีสำหรับเครื่องจักรที่พวกเขาใช้
barlop

แอสโซซิเอตเต็ทเพรสยังคงใช้ ANPA-1312 ซึ่งใช้ 1–4, 6 & 16 เพื่อเริ่มการเชื่อมต่อ TCP / IP ทุกครั้ง เครื่องพิมพ์ที่ทันสมัย ​​(ในกลุ่มอื่น ๆ ) ยังคงใช้ 17 และ 19 ร่วมกับเครื่องพิมพ์ที่คุณพูดถึงเรามีเปอร์เซ็นต์ที่ครอบคลุมโดยไม่ต้องลอง ฉันจะให้คุณพวกเขาไม่ได้ใช้งานหนักแต่พวกเขาไม่ได้ตายเช่นกัน
จอนฮันนา

1
@barlop คุณสามารถทำ^Iกับแท็บใน bash มาตรฐาน: พิมพ์ls ~/^I^Iและคุณควรเห็นโฟลเดอร์ทั้งหมดในโฮมไดเร็กตอรี่ของคุณ
wchargin

0

คุณสามารถดูทั้งหมดที่ไม่ใช่ pritable อักขระ ASCII Controlทำแผนที่ในนี้ตาราง


5
ในขณะที่สิ่งนี้อาจตอบคำถามในทางทฤษฎีมันก็ควรที่จะรวมส่วนที่สำคัญของคำตอบที่นี่และให้ลิงค์สำหรับการอ้างอิง ด้วยวิธีนี้หากหน้าที่ลิงก์เชื่อมโยงเปลี่ยนแปลงหรือไม่ถูกต้องด้วยเหตุผลใดก็ตามคำตอบจะยังคงเป็นประโยชน์ต่อผู้เยี่ยมชมผู้ใช้งานระดับสูง
CVn

3
ขอขอบคุณ. แม้ว่าจะมีข้อมูล แต่คำตอบนี้ไม่มีคำตอบสำหรับคำถาม
dotancohen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.