¿Por qué los caracteres especiales como "retorno de carro" se representan como "^ M"?

93

¿Por qué se ^Mutiliza para representar un retorno de carro en VIM y otros contextos?

Mi conjetura es que Mes la 13a letra del alfabeto latino y un retorno de carro es \x0Do decimal 13. ¿Es esta la razón? ¿Esta representación está documentada en alguna parte?

Noto que Tab está representado por ^I, que es la novena letra del alfabeto latino. Por el contrario, Tab es \x09o decimal 9, lo que apoya mi teoría indicada anteriormente. Sin embargo, ¿dónde podría documentarse esto como un hecho?

dotancohen
fuente
1
También tenga en cuenta que dos / windows usan "0x0d 0x0a", también conocido como "CR LF". Pero unix / linux usa solo "0x0a" o "LF". Entonces, cuando abre un documento de Windows en Linux, detecta "CR" adicional, y cuando abre un documento de Linux en Windows, no detecta nuevas líneas.
LatinSuD
3
La notación de interrelación @LatinSuD (y el uso correspondiente de la tecla Ctrl) se relaciona con el conjunto de control C0 (históricamente parte de ASCII) directamente y no si un sistema operativo o programa dado usa parte de ese conjunto para representar nuevas líneas, o cualquier otra cosa. más. Del mismo modo, si ^Helimina un carácter o permite la sobreimpresión ( n^H~como una forma obsoleta de producir ñ) o cualquier otro uso real del carácter de control está separado de la notación de intercalación.
Jon Hanna
11
viejo ... No puedo recordar el código original, ¡pero ctrl-G suena!
Brian Drummond
3
@OlivierDulac no, ^ M es exactamente un retorno de carro, al igual que ^ J es exactamente un avance de línea. Si bien diferentes sistemas operativos han tenido diferentes puntos de vista sobre si el avance de línea y / o el retorno de carro u otra cosa (como el carácter Newline utilizado por algunos caracteres de IBM pero no parte de ASCII y, por lo tanto, no es parte del patrimonio histórico de algunos otros sistemas operativos) representan una nueva línea en un archivo de texto, y aunque algunos programas han anulado eso de diferentes maneras, U + 000D en sí mismo sigue siendo un retorno de carro, independientemente de lo que los sistemas operativos posteriores como Unix o DOS decidieron hacer con él. (Por supuesto, llamándolo ...
Jon Hanna
1
@OlivierDulac ... U + 000D es proleptico, ya que ese nombre vino con Unicode en la década de 1990, pero eso definitivamente hace referencia al código tal como existía en ASCII en 1963, y a través de eso tal como existía en el código Baudot modificado de Murray en 1901 Murray estaba resolviendo problemas relacionados con el movimiento del papel, con las mismas herramientas utilizadas en el concepto de "archivo de texto" muchas décadas después. Martille un tornillo en algo como un clavo, y sigue siendo un tornillo. Use LF y / o CR para representar el final de una línea en un archivo de texto, y todavía son avances de línea y retornos de carro.
Jon Hanna

Respuestas:

115

Creo que lo que OP estaba preguntando realmente se llama notación Caret .

La notación Caret es una notación para caracteres de control no imprimibles en codificación ASCII. La notación consiste en un cursor (^) seguido de una letra mayúscula; este dígrafo representa el código ASCII que tiene el valor numérico equivalente al valor numérico de la letra. Por ejemplo, el carácter EOT con un valor de 4 se representa como ^ D porque D es la cuarta letra del alfabeto. El carácter NUL con un valor de 0 se representa como ^ @ (@ es el carácter ASCII antes de A). El carácter DEL con el valor 127 generalmente se representa como ^ ?, porque el ASCII '?' está antes de '@' y -1 es lo mismo que 127 si está enmascarado a 7 bits. Una formulación alternativa de la traducción es que el carácter impreso se encuentra invirtiendo el séptimo bit del código ASCII

La lista completa de caracteres de control ASCII junto con la notación de intercalación se puede encontrar aquí

Con respecto a vim y otros editores de texto: normalmente solo verá ^ M si abre un archivo de texto con formato de Windows (CRLF) en un editor que espera terminaciones de línea de Linux (LF). El 0x0A se representa como un salto de línea, el 0x0D justo antes de imprimirse como ^ M. La mayoría de las veces, la configuración predeterminada del editor incluye "reconocer automáticamente los finales de línea".

Art Gertner
fuente
1
Siempre me he preguntado qué es esa cosa fue llamado ...
SMCI
55
Esta convención se remonta al menos a la década de 1970; Lo vi por primera vez en el sistema operativo TOPS-10, pero puede haber existido antes. Por lo que vale, en los terminales ASCII más antiguos, el carácter que ahora se muestra como un cursor es en realidad una flecha que apunta hacia arriba, por lo que esto se originó como "notación de uparrow".
keshlam
15
Esto está explícitamente integrado en el diseño ASCII para que la tecla Ctrl solo
active el
2
No se usa solo con letras. No lo definiría como el carácter de control con "el valor numérico de la letra" sino más bien como "xor 64". En otras palabras, ^Aes 0x41 xor 0x40, o 0x01y ^?es 0x3F xor 0x40, o 0x7F.
R ..
1
Ascii DEL (^?) No tiene nada que ver con la tecla Eliminar. En realidad, es el código estándar generado por la <---clave (también, confusamente, llamado retroceso) en terminales tipo VT100.
R ..
22

Esa es exactamente la razón.

ASCII define los caracteres 0-31 como códigos de control sin impresión. Aquí hay un extracto de la ascii(7)página del manual de un sistema Linux aleatorio ( man ascii), incluido 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)    

Convencionalmente, estos caracteres se generan con Controlla letra correspondiente al carácter requerido. Los teletipos y los primeros teclados terminales tenían 'BELL' escrito encima de la Gtecla por este motivo.

El documento de estándares que definió ASCII es ASA X3.4-1963 , que fue publicado por la American Standards Association en 1963. No puedo encontrar el documento original en su sitio web, pero este extracto del documento original muestra la tabla de caracteres, que incluye Los códigos de control anteriores.

Flup
fuente
44
Gracias. Aunque informativo, esta respuesta no contiene la respuesta a la pregunta.
dotancohen
1
La respuesta está oculta en el segundo párrafo: ^Mes la abreviatura de Control-M. En el terminal, debe presionar la tecla Control junto con la tecla M para enviar el ASCII kode 0x0D, también conocido como retorno de carro.
Martin Liversage
14

La notación se remonta a los primeros teletipos ASCII (ca 1963). Había una tecla CTRL que alternaba el bit 0x40 para que CTRL-M (retorno de carro) fuera 0D en lugar de 4D, CTRL-G (campana) sería 07 en lugar de 47, CTRL-L (avance de formulario) sería 0C en su lugar de 4C.

No había un "diseño" en la asignación de letras particulares a funciones particulares, era solo casualidad que, cuando el polvo se resolvió de asignar códigos ASCII, la tecla M era un poco diferente del retorno de carro y, por lo tanto, el retorno de carro se convirtió en CTRL-M.

Aquí está la mejor toma que puedo encontrar de un teclado ASR33. Como puede ver, los nombres de los caracteres de control están impresos en minúsculas en las teclas alfa correspondientes.

Teletipo modelo 33 ASR con punzón / lector de cinta de papel

Imagen de Marcin Wichary, usuario: AlanM1 (derivado (recortado) del archivo: ASR-33 2.jpg ) [ CC BY 2.0 ], a través de Wikimedia Commons

La tecla M no tiene una notación porque hay una tecla dedicada "RETORNO", por lo que CTRL-M es redundante.

Daniel R Hicks
fuente
2
En cierto nivel, la medida en que todavía estamos obligados por las elecciones de diseño hechas para lo que ahora parecen sistemas antiguos es bastante sorprendente. ha sido sorprendente, y (b) si se toman suficientes decisiones de diseño, algunas de ellas (especialmente las que no causan suficientes problemas a las personas) se quedarán mucho tiempo después de que las razones desaparezcan en la memoria. Sin embargo, todavía es un sentimiento extraño mirar hacia atrás en la historia de algunas de estas cosas.
Stuart Golodetz
2
@StuartGolodetz - En realidad, me resulta extrañamente tranquilizador. Pero luego recuerdo cuando los teletipos eran "tecnología avanzada". (El Teletype ASR-33, por cierto, fue notable por su simplicidad elegante. Solo desearía que los sistemas informáticos "modernos" estuvieran bien diseñados).
Daniel R Hicks
1
Esto es fascinante, pero lo que no entiendo es ... ¿por qué decidieron que esta máquina de escribir necesitaba una campana?
CaptainCodeman
44
@CaptainCodeman: cuando transmitía un mensaje importante, tocaba el timbre para llamar la atención del operador al otro lado.
Daniel R Hicks
2
Es interesante notar que la tecla Ctrl sobrevive hasta el día de hoy en los teclados de PC.
Daniel R Hicks
3

El cursor (^) es solo una abreviatura para escribir, mantenga presionada la tecla Control - CTRL.

En los viejos tiempos, podía escribir estos códigos (ver arriba) directamente, la tecla Ctrl + G (^ G) haría que el terminal se "ding"

Cuando desee agregar un CR en Vim, use la tecla Ctrl + M, etc., pestaña = Ctrl + I

Don
fuente
El término que está buscando es digraph , que significa dos caracteres que representan un carácter. Específicamente, los dígrafos y los trigrafos se usan para representar caracteres no imprimibles. Históricamente, también se han utilizado para caracteres que no aparecen en un teclado, aunque con las GUI y los teclados modernos esto es un problema menor, por lo que este uso es más arcaico.
"En los viejos tiempos" todavía es hoy, con ^ C y ^ D siendo perfectamente funcionales. La única razón por la que ^ G ya no hace que el terminal suene es que la mayoría de los emuladores de terminal tienen esa respuesta desactivada.
SevenSidedDie
2

La necesidad de alguna forma visual de mostrar lo que son, por definición, caracteres no imprimibles.

Entonces, alguien a principios de la década de 1970 (o tal vez antes) (recuerdo haberlo visto en CP / M, y alguien más ya ha mencionado TOPS) decidió que "letra caret plus" sería el símbolo de los 26 caracteres de control ASCII no imprimibles con valores 1 a 26. El valor 0 se imprimió como ^ @ y el valor 127 como ^ ?.

RonJohn
fuente
1

Donde está documentado, bueno, esta página enumera cada carácter de control, con cómo ingresarlo / representarlo con la tecla de control (aunque el primero, el carácter ascii 0, no tiene representación de clave de control), y no tiene nada para el carácter 127. Y proporciona fuentes en la parte inferior

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

Uno podría preguntarse, dado que hay 33 caracteres de control (caracteres ASCII 0-31 por lo que 32 caracteres, + carácter 127. por lo tanto, = 33 caracteres) Cómo se representarían todos ya que solo hay 26 letras en el alfabeto. Bueno, usa Ctrl-A para Ascii carácter 1, Ctrl-Z para ascii carácter 26, y allí una vez que llega a Ctrl-Z, usa [ \ ] ^ _

Enumera Ctrl-Z como SUB, aunque en DOS y el indicador de cmd es EOF, y como usuario técnico lo usa cuando hace copy con a.adónde a.aestá su archivo. Ingresas el texto y lo terminas con Ctrl-Z, que curiosamente no ingresa un marcador EOF. Pero le dice a CMD que ese es el final del archivo, por lo que CMD lo escribe.

Esa página web cs.tut.fi proporciona esto como fuente
http://www.wps.com/texts/codes/X3.4-1963/index.html

pero es un enlace roto, pero disponible en archive.org está en forma de JPG

Código estándar americano para el intercambio de información
ASA estándar X3.4-1963

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

barlop
fuente
La mayoría de los caracteres de control no tienen sentido, pero incluso algunos de los que tienen un significado como Ctrl-I no estoy seguro de dónde puedes hacer Ctrl-I y obtener una pestaña.
barlop
1
Ninguno de los caracteres de control no tiene sentido. Muchos de ellos no se utilizan en muchos contextos, pero cada uno tiene al menos un significado.
Jon Hanna
@ JonHanna Por supuesto, no quiero decir que no tenían sentido (tiempo pasado). Pero R.Ha tenido sentido durante décadas, es decir, tenían sus significados originales de hace eones, la tecnología que ya no funciona, (la mayoría de los caracteres) no tiene sentido hoy Con tecnología actual e incluso un poco antigua. Si alguna se está dando a los usos modernos, no son muchas. Hay una lista aquí en.wikipedia.org/wiki/Control_character de los de uso común 0,7,8,9,10,11,12,13,127. 9/33 por lo que los otros (24 de ellos) podrían hacerlo muy raramente o no hacerlo en absoluto, ya que están tan muertos como el antic sin usar sin usar durante décadas la maquinaria en la que se usaron
barlop
Associated Press todavía usa ANPA-1312, que usa 1–4, 6 y 16 para iniciar cada conexión TCP / IP. Las impresoras modernas (entre otras aplicaciones) todavía usan 17 y 19. Junto con las que mencionas, tenemos un buen porcentaje de ellas cubiertas sin realmente intentarlo. Te concederé que no están en uso pesado , pero tampoco están muertos.
Jon Hanna
1
@barlop Puede hacerlo ^Ipara una pestaña en bash: type estándar ls ~/^I^Iy debería ver todas las carpetas en su directorio de inicio.
wchargin
0

Puede ver todas las Controlasignaciones de caracteres ASCII no rentables en esta tabla.

Ofir Luzon
fuente
55
Si bien esto puede responder teóricamente la pregunta, sería preferible incluir aquí las partes esenciales de la respuesta y proporcionar el enlace para referencia. De esa manera, si la página vinculada alguna vez cambia o se vuelve inválida por algún motivo, la respuesta seguirá siendo útil para los visitantes del Súper Usuario.
un CVn
3
Gracias. Aunque informativo, esta respuesta no contiene la respuesta a la pregunta.
dotancohen