Representación de caracteres
Todos los caracteres que ves en tu ordenador tienen un código numérico correspondiente. Ese código forma parte de un estándar llamado ASCII (American Standard Code for Information Interchange), donde cada letra, número y símbolo se representa mediante un valor entero (y sin signo).
El formato {c} que imprime un u8 como carácter ASCII es muy interesante. Aquí tienes un resumen de los códigos ASCII que más se usan:
Códigos de caracteres ASCII alfanuméricos
|
48–57 |
Dígitos numéricos |
0 1 2 3 4 5 6 7 8 9 |
|
65–90 |
Letras mayúsculas del alfabeto inglés |
A B C ... X Y Z |
|
97–122 |
Letras minúsculas del alfabeto inglés |
a b c ... x y z |
En el siguiente ejemplo hemos elegido el carácter ‘a’ para imprimirlo en sus distintas representaciones numéricas. Como ya sabes, los números se pueden representar en distintas bases (binaria, decimal, hexadecimal etc.)
print_char.zig |
|
const std = @import("std"); const print = std.debug.print; pub fn main() void { const c_a = 'a'; print("\nCarácter '{c}':", .{c_a}); print("\n_______________________________", .{}); print("\nCódigo decimal:\t\t{d}", .{c_a}); print("\nCódigo hexadecimal:\t{x}", .{c_a}); print("\nCódigo binario:\t\t{b}\n", .{c_a}); } |
|
$ zig run print_char.zig |
|
Carácter 'a': _______________________________ Código decimal: 97 Código hexadecimal: 61 Código binario: 1100001 |
Una cosa a tener en cuenta es que esto solo funciona correctamente con los valores ASCII entre 0 y 127 que corresponden al ASCII estándar. A partir del valor 128 los códigos representan caracteres “extendidos” o Unicode. Un ejemplo así es la letra Ñ. Si cambias el valor de c_a y ejecutas otra vez el programa lo puedes comprobar:
|
const c_a = 'Ñ'; |
|
$ zig run print_char.zig |
|
Carácter '�': _______________________________ Código decimal: 209 Código hexadecimal: d1 Código binario: 11010001 |
Por suerte, aunque {c} sea limitado a ASCII estándar, Zig trabaja internamente con UTF-8 que sí que incluye caracteres como la Ñ. Por lo tanto para imprimir correctamente ese carácter habría que usar un pequeño truco… que veremos un poco más adelante.
Alias para funciones
También hemos hecho un cambio para no tener que teclear tanto. Declaramos una constante apuntando a la función print de la librería std.
|
const print = std.debug.print; |
De esta manera, tenemos un alias para usar print. En vez de tener que escribir cada vez:
|
std.debug.print("...", .{}); |
Podemos poner simplemente:
|
print("...", .{}); |
Apúntatelo. Así evitarás repetir rutas largas. Esta técnica se puede usar para funciones, módulos y mucho más.
Secuencias de escape
En el ejemplo print_char.zig, aparte de \n (salto de línea) que ya habíamos visto antes, ahora también usamos un \t. En nuestro primer ejemplo “Hola mundo” te prometí que lo veríamos en detalle. Se denominan técnicamente “caracteres de escape” o más correctamente “secuencias de escape”. Creo que decir secuencias es más apropiado ya que no es solo un carácter lo que ponemos.
|
\n |
Salto de línea |
|
\r |
Retorno - mueve el cursor al inicio de la línea (sin salto) |
|
\t |
Tabulación |
|
\\ |
Barra invertida - permite imprimir una barra invertida |
|
\' |
Comilla simple |
|
\" |
Comilla doble |
|
\xNN |
Byte en hexadecimal de 8 bits (2 dígitos) |
|
\u{NNNNNN} |
Unicode en hexadecimal (codificado en UTF-8, 1 o más dígitos). |
Estas secuencias son útiles para insertar esos caracteres especiales que no puedes escribir con el teclado.