Mengapa karakter khusus seperti "carriage return" diwakili sebagai "^ M"?

93

Mengapa ^Mdigunakan untuk merepresentasikan carriage return dalam VIM dan konteks lainnya?

Dugaan saya adalah bahwa Madalah huruf ke-13 abjad Latin dan carriage return adalah \x0Datau desimal 13. Apakah ini alasannya? Apakah representasi ini didokumentasikan di mana saja?

Saya perhatikan bahwa Tab diwakili oleh ^I, yang merupakan huruf kesembilan dari alfabet Latin. Sebaliknya, Tab adalah \x09atau desimal 9, yang mendukung teori saya yang dinyatakan di atas. Namun, di mana ini bisa didokumentasikan sebagai fakta?

dotancohen
sumber
1
Juga perlu diingat bahwa dos / windows menggunakan "0x0d 0x0a", juga dicatat sebagai "CR LF". Tetapi unix / linux hanya menggunakan "0x0a" atau "LF". Jadi ketika Anda membuka dokumen windows di linux ia mendeteksi "CR" tambahan, dan ketika Anda membuka dokumen linux di windows itu tidak mendeteksi baris baru.
LatinSuD
3
Notasi caret @LatinSuD (dan penggunaan Ctrl-key yang terkait) berhubungan dengan set kontrol C0 (secara historis bagian dari ASCII) secara langsung dan tidak apakah dan bagaimana sistem atau program operasi tertentu menggunakan bagian dari set yang mewakili baris baru, atau apa pun lain. Demikian pula, apakah ^Hmenghapus karakter atau memungkinkan pencetakan berlebih (seperti n^H~cara usang untuk menghasilkan ñ) atau penggunaan aktual lain dari karakter kontrol terpisah dari notasi tanda sisipan.
Jon Hanna
11
yang lama ... Saya tidak dapat mengingat kode aslinya, tetapi ctrl-G membunyikan bel!
Brian Drummond
3
@OlivierDulac tidak, ^ M adalah persis carriage return, seperti ^ J adalah persis garis-feed. Sementara OS yang berbeda memiliki pandangan yang berbeda mengenai apakah line-feed dan / atau carriage return atau yang lainnya (seperti karakter Newline yang digunakan oleh beberapa karakter IBM tetapi bukan bagian dari ASCII dan karenanya bukan bagian dari warisan sejarah dari beberapa OS lain) harus mewakili baris baru dalam file teks, dan sementara beberapa program kemudian menimpa bahwa dengan cara yang berbeda, U + 000D sendiri masih merupakan carriage return, apa pun sistem operasi seperti Unix atau DOS memutuskan untuk melakukannya. (Tentu saja, menyebutnya ...
Jon Hanna
1
@OlivierDulac ... U + 000D adalah proleptik, karena nama itu datang dengan Unicode pada 1990-an, tetapi itu cukup jelas merujuk kode seperti yang ada di ASCII pada tahun 1963, dan melalui itu seperti yang ada dalam kode Baudot Murray yang dimodifikasi pada tahun 1901 Murray memecahkan masalah yang berkaitan dengan memindahkan kertas, dengan alat yang sama digunakan dalam konsep "file teks" beberapa dekade kemudian. Palu sekrup menjadi sesuatu seperti paku, dan itu masih sekrup. Gunakan LF dan / atau CR untuk mewakili akhir baris dalam file teks, dan mereka masih feed baris dan carriage return.
Jon Hanna

Jawaban:

115

Saya percaya bahwa apa yang sebenarnya ditanyakan oleh OP disebut Caret Notation .

Notasi caret adalah notasi untuk karakter kontrol yang tidak diinginkan dalam pengkodean ASCII. Notasi terdiri dari tanda sisipan (^) diikuti dengan huruf kapital; digraf ini adalah kode ASCII yang memiliki nilai numerik yang setara dengan nilai numerik surat itu. Misalnya karakter EOT dengan nilai 4 direpresentasikan sebagai ^ D karena D adalah huruf ke-4 dalam alfabet. Karakter NUL dengan nilai 0 direpresentasikan sebagai ^ @ (@ adalah karakter ASCII sebelum A). Karakter DEL dengan nilai 127 biasanya direpresentasikan sebagai ^ ?, karena ASCII '?' sebelum '@' dan -1 sama dengan 127 jika disamarkan menjadi 7 bit. Formulasi terjemahan alternatif adalah bahwa karakter yang dicetak ditemukan dengan membalik bit ke-7 dari kode ASCII

Daftar lengkap karakter kontrol ASCII bersama dengan notasi caret dapat ditemukan di sini

Mengenai vim dan editor teks lainnya: Anda biasanya hanya akan melihat ^ M jika Anda membuka file teks berformat Windows (CRLF) dalam editor yang mengharapkan Linux line endings (LF). 0x0A diterjemahkan sebagai pemisah baris, 0x0D tepat sebelum dicetak sebagai ^ M. Sebagian besar waktu, pengaturan default editor termasuk 'secara otomatis mengenali akhir baris'.

Seni Gertner
sumber
1
Saya selalu bertanya-tanya apa nama benda itu ...
smci
5
Konvensi ini kembali setidaknya ke tahun 1970-an; Saya pertama kali melihatnya di sistem operasi TOPS-10 tetapi mungkin sudah ada sebelumnya. Untuk apa nilainya, pada terminal ASCII yang lebih tua, karakter yang sekarang ditampilkan sebagai tanda sisipan sebenarnya adalah panah yang mengarah ke atas, jadi ini berasal sebagai "notasi uparrow".
keshlam
15
Ini jelas dibangun ke dalam desain ASCII sehingga tombol Ctrl hanya matikan bit 7.
OrangeDog
2
Ini tidak hanya digunakan dengan huruf. Saya tidak akan mendefinisikannya sebagai karakter kontrol dengan "nilai angka huruf" melainkan sebagai "xor 64". Dengan kata lain, ^Aadalah 0x41 xor 0x40, atau 0x01dan ^?merupakan 0x3F xor 0x40, atau 0x7F.
R ..
1
Ascii DEL (^?) Tidak ada hubungannya dengan tombol hapus. Ini sebenarnya kode standar yang dihasilkan oleh <---kunci (juga, membingungkan, disebut backspace) pada terminal mirip VT100.
R ..
22

Itulah alasannya.

ASCII mendefinisikan karakter 0-31 sebagai kode kontrol non-cetak. Berikut ini kutipan dari ascii(7)halaman manual dari sistem Linux acak ( man ascii), hingga dan termasuk 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)    

Secara konvensional karakter-karakter ini dihasilkan dengan Controldan surat yang berkaitan dengan karakter yang diperlukan. Teletype dan keyboard terminal awal memiliki 'BELL' tertulis di atas Gkunci untuk alasan ini.

Dokumen standar yang mendefinisikan ASCII adalah ASA X3.4-1963 , yang diterbitkan oleh American Standards Association pada tahun 1963. Saya tidak dapat menemukan dokumen asli di situs web mereka, tetapi kutipan dari dokumen asli ini menunjukkan tabel karakter, termasuk kode kontrol di atas.

Flup
sumber
4
Terima kasih. Meskipun informatif, jawaban ini tidak mengandung jawaban atas pertanyaan.
dotancohen
1
Jawabannya tersembunyi di paragraf kedua: ^Madalah singkatan untuk Control-M. Di terminal Anda akan menekan tombol Control bersama-sama dengan tombol M untuk mengirim kode 0x0D ASCII juga dikenal sebagai carriage return.
Martin Liversage
14

Notasi kembali ke ASCII Teletypes yang paling awal (ca 1963). Ada kunci CTRL yang mengubah bit 0x40 sehingga CTRL-M (carriage return) akan menjadi 0D bukannya 4D, CTRL-G (bell) akan menjadi 07 bukannya 47, CTRL-L (form feed) akan menjadi 0C sebagai gantinya dari 4C.

Tidak ada "desain" dalam menetapkan huruf-huruf tertentu untuk fungsi-fungsi tertentu, itu hanya kebetulan bahwa, ketika debu menetap dari menetapkan kode ASCII, kunci M sedikit berbeda dari carriage return dan karenanya carriage return menjadi CTRL-M.

Ini adalah foto terbaik yang bisa saya temukan dari keyboard ASR33. Seperti yang Anda lihat, nama karakter kontrol dicetak dalam huruf kecil pada tombol alpha yang sesuai.

Teletype Model 33 ASR dengan kertas tape punch / reader

Gambar oleh Marcin Wichary, Pengguna: AlanM1 (Turun (dipotong) dari File: ASR-33 2.jpg ) [ CC BY 2.0 ], melalui Wikimedia Commons

Kunci M tidak memiliki notasi di atasnya karena ada tombol "KEMBALI" khusus, jadi CTRL-M berlebihan.

Daniel R Hicks
sumber
2
Pada tingkat tertentu, sejauh mana kita masih terikat oleh pilihan desain yang dibuat untuk apa yang sekarang tampak seperti sistem kuno cukup mengejutkan - saya kira pada refleksi bahwa (a) itu belum lama, hanya saja laju perubahan sementara telah mencengangkan, dan (b) jika keputusan desain yang cukup dibuat, beberapa dari mereka (terutama yang tidak menyebabkan cukup banyak masalah) terikat untuk bertahan lama setelah alasan mereka menghilang ke dalam memori. Namun masih terasa aneh untuk melihat kembali sejarah beberapa hal ini.
Stuart Golodetz
2
@StuartGolodetz - Sebenarnya, saya merasa aneh meyakinkan. Tapi kemudian saya ingat ketika Teletype adalah "teknologi canggih". (Ngomong-ngomong, Teletype ASR-33 luar biasa untuk kesederhanaannya yang elegan. Saya hanya berharap bahwa sistem komputer "modern" dirancang dengan baik.)
Daniel R Hicks
1
Ini menarik tetapi yang saya tidak mengerti adalah .. mengapa mereka memutuskan mesin tik ini membutuhkan lonceng?
CaptainCodeman
4
@CaptainCodeman - Ketika Anda mengirim pesan penting, Anda akan membunyikan bel untuk mendapatkan perhatian operator di ujung lainnya.
Daniel R Hicks
2
Sangat menarik untuk dicatat bahwa tombol Ctrl bertahan sampai hari ini di keyboard PC.
Daniel R Hicks
3

Tanda sisipan (^) hanya singkatan untuk tulisan tahan tombol Kontrol - CTRL bawah.

Di masa lalu yang baik Anda dapat mengetik kode ini (lihat di atas) secara langsung, tombol Ctrl + G (^ G) akan membuat terminal menjadi "ding"

Ketika Anda ingin menambahkan CR di Vim Anda menggunakan tombol Ctrl + M dll tab = Ctrl + I

Mengenakan
sumber
Istilah yang Anda cari adalah digraf , yang berarti dua karakter yang mewakili satu karakter. Secara khusus, digraf dan trigraph digunakan untuk mewakili karakter yang tidak dapat dicetak. Secara historis mereka juga telah digunakan untuk karakter yang tidak muncul pada keyboard, meskipun dengan GUI dan keyboard modern ini kurang menjadi masalah sehingga penggunaan ini lebih kuno.
"Di masa lalu yang baik" masih hari ini, dengan ^ C dan ^ D berfungsi dengan sempurna. Satu-satunya alasan bahwa ^ G tidak membuat terminal ding lagi adalah karena kebanyakan emulator terminal dimatikan responsnya.
SevenSidedDie
2

Perlunya beberapa cara visual untuk menampilkan apa yang menurut karakter tidak dapat dicetak.

Jadi, seseorang di awal 1970-an (atau mungkin lebih awal) (Saya ingat melihatnya di CP / M, dan orang lain telah menyebutkan TOPS) memutuskan bahwa "caret plus letter" akan menjadi simbol untuk 26 karakter kontrol ASCII yang tidak dapat dicetak dengan nilai 1 hingga 26. Nilai 0 adalah / dicetak sebagai ^ @, dan nilai 127 sebagai ^ ?.

RonJohn
sumber
1

Di mana ia didokumentasikan, baik halaman ini mencantumkan setiap karakter kontrol, dengan cara memasukkan / mewakili dengan kunci kontrol (meskipun yang pertama, karakter ascii 0, tidak memiliki representasi kunci kontrol), dan tidak memiliki apa pun untuk karakter 127. Dan ini menyediakan sumber di bagian bawah

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

Orang mungkin bertanya-tanya, mengingat bahwa ada 33 karakter kontrol (karakter ASCII 0-31 jadi 32 karakter, + karakter 127. jadi, = 33 karakter) Bagaimana mereka semua diwakili karena hanya ada 26 huruf dalam alfabet. Yah, itu menggunakan Ctrl-A untuk Ascii karakter 1, Ctrl-Z untuk karakter ascii 26, dan di sana setelah mencapai Ctrl-Z, ia menggunakan [ \ ] ^ _

Ini daftar Ctrl-Z sebagai SUB, meskipun dalam DOS dan cmd prompt itu adalah EOF, dan sebagai pengguna techie Anda menggunakannya ketika melakukan di copy con a.amana a.afile Anda. Anda memasukkan teks dan menghentikannya dengan Ctrl-Z yang cukup lucu tidak memasukkan penanda EOF. Tapi apakah memberitahu CMD itu akhir dari file sehingga CMD menulisnya.

Halaman web cs.tut.fi memberikan ini sebagai sumber
http://www.wps.com/texts/codes/X3.4-1963/index.html

tetapi itu adalah tautan yang rusak, tetapi tersedia di archive.org itu dalam bentuk JPG

Kode Standar Amerika untuk Pertukaran Informasi
standar ASA X3.4-1963

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

barlop
sumber
Sebagian besar karakter kontrol tidak ada artinya, tetapi bahkan beberapa dari mereka dengan makna seperti Ctrl-I saya tidak yakin di mana Anda bisa melakukan Ctrl-I dan mendapatkan tab.
barlop
1
tidak ada karakter kontrol yang tidak berarti. Banyak dari mereka tidak digunakan dalam banyak konteks, tetapi setiap orang memiliki setidaknya satu makna.
Jon Hanna
@JonHanna Tentu saja saya tidak bermaksud bahwa mereka tidak ada artinya (past tense). Tetapi R. telah menjadi tidak berarti selama beberapa dekade yaitu mereka memiliki makna asli mereka dari ribuan tahun yang lalu, teknologi yang tidak lagi berjalan, adalah (sebagian besar karakter) tidak ada artinya hari ini w / saat ini dan bahkan sedikit tech.n lama jika ada yang menggunakan modern itu tidak banyak. Ada daftar di sini en.wikipedia.org/wiki/Control_character yang umum digunakan 0,7,8,9,10,11,12,12,13,127. 9/33 jadi yang lain (24 dari mereka) akan c sangat jarang atau tidak sama sekali karena mereka mati sebagai antic yang tidak terpakai digunakan selama beberapa dekade mesin mereka digunakan
barlop
Associated Press masih menggunakan ANPA-1312 yang menggunakan 1-4, 6 & 16 digunakan untuk memulai setiap koneksi TCP / IP. Printer modern (di antara yang lain) masih menggunakan 17 & 19. Bersama-sama dengan yang Anda sebutkan, kami memiliki persentase yang cukup banyak tanpa benar-benar mencoba. Saya akan memberi Anda mereka tidak digunakan berat , tetapi mereka tidak mati juga.
Jon Hanna
1
@barlop Anda dapat melakukannya ^Iuntuk tab dalam tipe standar bash: ls ~/^I^Idan Anda akan melihat semua folder di direktori home Anda.
wchargin
0

Anda dapat melihat semua Controlpemetaan karakter ASCII yang tidak menguntungkan dalam tabel ini .

Ofir Luzon
sumber
5
Sementara ini secara teoritis dapat menjawab pertanyaan, akan lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini, dan menyediakan tautan untuk referensi. Dengan begitu, jika halaman yang ditautkan berubah atau menjadi tidak valid karena alasan apa pun, jawabannya tetap akan bermanfaat bagi pengunjung Super User.
CVn
3
Terima kasih. Meskipun informatif, jawaban ini tidak mengandung jawaban atas pertanyaan.
dotancohen