Tipos de Caracteres en Golang

GolangBeginner
Practicar Ahora

Introducción

En la sección anterior, analizamos los tipos numéricos más utilizados. En esta unidad, aprenderemos sobre los tipos de caracteres en Go.

Puntos de Conocimiento:

  • Codificación ASCII
  • Codificación UTF-8
  • Conjunto de Caracteres Unicode
  • byte
  • rune
Este es un Laboratorio Guiado, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y obtener experiencia práctica. Los datos históricos muestran que este es un laboratorio de nivel principiante con una tasa de finalización del 93%. Ha recibido una tasa de valoraciones positivas del 97% por parte de los alumnos.

Codificación ASCII

En los inicios de la informática, se utilizaba el formato de codificación ASCII (American Standard Code for Information Interchange). Este sistema representaba caracteres utilizando 7 bits, lo que permitía un total de 128 (2^7) caracteres. Los valores del 0 al 31 y el 127 correspondían a caracteres de control no imprimibles, mientras que los valores del 32 al 126 representaban letras mayúsculas y minúsculas, números y signos de puntuación de uso cotidiano. Puedes consultar los detalles en esta tabla.

A medida que la tecnología evolucionó, surgió la necesidad de dar soporte a diferentes idiomas. La codificación ASCII resultó insuficiente para este propósito. En consecuencia, diversos idiomas desarrollaron sus propios formatos, como el GB2312 para el chino simplificado, el EUC-KR para el coreano y el KOI8-R para el ruso.

Sin embargo, ante la enorme diversidad lingüística del mundo, se hizo indispensable contar con un formato de codificación único que pudiera unificar todos los idiomas. Unicode fue creado para satisfacer esta necesidad.

Conjunto de Caracteres Unicode

En 1991, el Consorcio Unicode lanzó la primera versión del conjunto de caracteres Unicode. Su objetivo era unificar todos los idiomas en un solo formato de codificación, permitiendo que las computadoras de todo el mundo mostraran y procesaran texto de manera más sencilla, evitando problemas de compatibilidad en entornos multilingües.

No obstante, Unicode era inicialmente solo un conjunto de caracteres; definía los códigos de los caracteres pero no la forma en que debían almacenarse. Esto dificultó su adopción masiva durante mucho tiempo, hasta el auge de Internet.

Codificación UTF-8

Con el desarrollo continuo de Internet, UTF-8, una implementación de codificación de Unicode, ha ganado gran popularidad. Se trata de una codificación de longitud variable, lo que significa que diferentes símbolos pueden ocupar distintos números de bytes en UTF-8.

Por ejemplo, las letras del alfabeto inglés, que se encuentran dentro del rango ASCII, se representan con 1 byte. El carácter 'y' (valor Unicode 121) ocupa 1 byte.

Para el uso cotidiano, la mayoría de los caracteres chinos ocupan 3 bytes. Por ejemplo, el carácter '实' (valor Unicode 23454) ocupa 3 bytes.

Sin embargo, existen algunos caracteres chinos que requieren 4 bytes. Esto se debe a que hay más de 100,000 caracteres chinos, pero según el esquema técnico, 3 bytes solo pueden representar poco más de 60,000 caracteres, por lo que una pequeña cantidad de ellos necesita 4 bytes para ser representada.

Otra ventaja de la codificación UTF-8 es su compatibilidad hacia atrás con ASCII. De hecho, ASCII es un subconjunto de UTF-8. Los primeros 128 caracteres de UTF-8 coinciden uno a uno con los caracteres ASCII. Esto significa que el software que originalmente usaba ASCII puede seguir funcionando con poca o ninguna modificación. Gracias a estas ventajas, UTF-8 se ha convertido gradualmente en el formato de codificación preferido.

Los creadores del lenguaje de programación Go, Rob Pike y Ken Thompson, también inventaron UTF-8, por lo que Go tiene una afinidad especial con este formato. Go exige que los archivos de código fuente se guarden con codificación UTF-8. Al operar con caracteres de texto, UTF-8 es la opción predilecta. Además, la biblioteca estándar ofrece múltiples funciones relacionadas con la codificación y decodificación en UTF-8.

byte y rune

byte es un alias para uint8 y ocupa un byte (8 bits). Puede utilizarse para representar todos los caracteres de la tabla ASCII. Sin embargo, debido a que byte tiene un rango limitado de valores (256 o 2^8), cuando trabajamos con caracteres compuestos como los caracteres chinos, necesitamos utilizar el tipo rune.

Crea un nuevo archivo llamado byte.go e introduce el siguiente código:

cd ~/project
touch byte.go
package main

import "fmt"

func main() {
    var a byte = 76
    fmt.Printf("Value of a: %c\n", a)

    var b uint8 = 76
    fmt.Printf("Value of b: %c\n", b)

    var c byte = 'L'
    fmt.Printf("Value of c: %c\n", c)
}

Tras ejecutar el programa, se obtendrá el siguiente resultado:

go run byte.go
Value of a: L
Value of b: L
Value of c: L

El marcador de posición %c se utiliza para imprimir caracteres. Se puede observar que el tipo byte y el tipo uint8 producen la misma salida cuando sus valores coinciden. Consultando la tabla ASCII, vemos que el valor del carácter 'A' es 65. Si usamos el marcador de posición de entero %d para imprimir el valor, también obtendremos 65.

Por lo tanto, es evidente que byte en Go es equivalente a uint8 dentro de los tipos enteros. Lo mismo ocurre con rune, aunque este representa un rango diferente de valores enteros.

rune es un alias para int32 y ocupa cuatro bytes (32 bits). Se utiliza para representar caracteres compuestos, como los emojis.

Actualiza el archivo byte.go con el siguiente código:

package main

import "fmt"

func main() {
    var a rune = '😊' // Emoji de sonrisa
    fmt.Printf("Value of a: %c\n", a)

    var b int32 = 9829 // Representación decimal de un carácter Unicode (Símbolo de corazón)
    fmt.Printf("Value of b: %c\n", b)
    var c rune = 0x1F496 // Representación hexadecimal de un carácter Unicode (Emoji de corazón brillante)
    fmt.Printf("Value of c: %c\n", c)

    var d rune = '\u0041' // Carácter Unicode representado por su punto de código (Letra 'A' mayúscula)
    fmt.Printf("Value of d: %c\n", d)
    var e rune = '\U0001F609' // Carácter Unicode representado por su punto de código (Emoji de cara guiñando un ojo)
    fmt.Printf("Value of e: %c\n", e)
}

Al ejecutar el programa, se mostrará la siguiente salida:

go run byte.go

Nota: Ejecuta el programa en la Terminal del Escritorio o del WebIDE, pero evita hacerlo en la pestaña Terminal situada en la parte superior de la VM de LabEx.

Value of a: 😊
Value of b: ♥
Value of c: 💖
Value of d: A
Value of e: 😉
  • La variable a representa el emoji de sonrisa '😊'.
  • La variable b se inicializa con la representación decimal de un carácter Unicode (9829), que corresponde al símbolo de corazón '♥'.
  • La variable c se inicializa con la representación hexadecimal de un carácter Unicode (0x1F496), que corresponde al emoji de corazón brillante '💖'.
  • La variable d representa la letra mayúscula 'A' utilizando el formato Unicode \u0041.
  • La variable e representa el emoji de cara guiñando un ojo '😉' utilizando el formato \U con el punto de código 0001F609.

Nota: En Go, las comillas simples y las comillas dobles no son intercambiables. Las comillas simples se usan para representar caracteres individuales, mientras que las comillas dobles se usan para declarar cadenas de texto (strings). Por lo tanto, debes usar comillas simples al declarar tipos byte y rune, de lo contrario se producirá un error.

Desafío

Ahora, reforcemos lo aprendido. Crea un nuevo archivo llamado rune.go e introduce el siguiente código. Completa el programa para que el número hexadecimal 0x1F648 se asigne a la variable a y el programa imprima correctamente su valor.

  • Requisitos: El archivo rune.go debe ubicarse en el directorio ~/project.
  • Pista: Para números hexadecimales largos, se debe utilizar un formato específico.
package main

import "fmt"

func main() {
    var a rune = 0x1F648
    fmt.Printf("The value of a is: %c\n", a)
}
✨ Revisar Solución y Practicar

Resumen

Repasemos lo que hemos aprendido en esta sección:

  • Los caracteres ASCII ocupan un byte y pueden representar 128 caracteres distintos.
  • La codificación UTF-8 es una implementación del conjunto de caracteres Unicode. Es una codificación de longitud variable, y su tamaño en bytes depende del carácter representado.
  • El tipo de dato byte se utiliza para representar caracteres ASCII, mientras que el tipo de dato rune se utiliza para representar caracteres Unicode.
  • El tipo byte es técnicamente un alias de uint8, y rune es un alias de int32.

En esta unidad, primero explicamos los conceptos de ASCII, UTF-8 y Unicode. Luego, analizamos la relación entre los tipos de datos de caracteres byte y rune con sus respectivos tipos de datos enteros.