Tipos de caracteres en Golang

GolangGolangBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En la sección anterior, discutimos los tipos numéricos comúnmente utilizados. En esta sección, aprenderemos sobre los tipos de caracteres en Go.

Puntos de conocimiento:

  • Codificación ASCII
  • Codificación UTF-8
  • Conjunto de caracteres Unicode
  • byte
  • rune

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL go(("Golang")) -.-> go/FunctionsandControlFlowGroup(["Functions and Control Flow"]) go(("Golang")) -.-> go/AdvancedTopicsGroup(["Advanced Topics"]) go(("Golang")) -.-> go/BasicsGroup(["Basics"]) go(("Golang")) -.-> go/DataTypesandStructuresGroup(["Data Types and Structures"]) go/BasicsGroup -.-> go/variables("Variables") go/DataTypesandStructuresGroup -.-> go/strings("Strings") go/FunctionsandControlFlowGroup -.-> go/functions("Functions") go/AdvancedTopicsGroup -.-> go/text_templates("Text Templates") go/AdvancedTopicsGroup -.-> go/base64_encoding("base64 Encoding") subgraph Lab Skills go/variables -.-> lab-149068{{"Tipos de caracteres en Golang"}} go/strings -.-> lab-149068{{"Tipos de caracteres en Golang"}} go/functions -.-> lab-149068{{"Tipos de caracteres en Golang"}} go/text_templates -.-> lab-149068{{"Tipos de caracteres en Golang"}} go/base64_encoding -.-> lab-149068{{"Tipos de caracteres en Golang"}} end

Codificación ASCII

En los primeros días de las computadoras, se utilizó el formato de codificación ASCII (Código Estándar Americano para el Intercambio de Información). Representaba caracteres utilizando 7 bits y podía representar 128 (2^7) caracteres. Los caracteres desde el bit 0 hasta el 31 y el bit 127 representaban caracteres de control que no se podían mostrar, mientras que los caracteres desde el bit 32 hasta el 126 representaban letras mayúsculas y minúsculas, números y signos de puntuación cotidianos. Consulte la tabla para obtener más detalles.

A medida que evolucionaban las computadoras, surgió la necesidad de soportar diferentes idiomas. La codificación ASCII era inadecuada para este propósito. En consecuencia, diferentes idiomas desarrollaron sus propios formatos de codificación, como GB2312 para el chino simplificado, EUC - KR para el coreano y KOI8 - R para el ruso.

Sin embargo, dado que hay muchas familias de idiomas en el mundo, se hizo necesario tener un solo formato de codificación que pudiera unificar todos los idiomas. Unicode se creó para satisfacer esta necesidad.

Conjunto de caracteres Unicode

En 1991, el Consorcio Unicode publicó la primera versión del conjunto de caracteres Unicode. Su objetivo era unificar todos los idiomas en un solo formato de codificación, lo que permitiría a las computadoras de todo el mundo mostrar y procesar texto de manera más fácil y evitaría problemas de compatibilidad en entornos multilingües.

Sin embargo, Unicode era solo un conjunto de caracteres; definía códigos de caracteres pero no cómo se almacenaban. Esto dio lugar a dificultades en su adopción generalizada durante mucho tiempo, hasta el auge de Internet.

Codificación UTF-8

Con el continuo desarrollo de Internet, la codificación UTF-8, una implementación de Unicode, se ha vuelto popular. Es una codificación de longitud variable, lo que significa que diferentes símbolos pueden tener diferentes longitudes de bytes en UTF-8.

Por ejemplo, para las letras inglesas, 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, hay algunos caracteres chinos que ocupan 4 bytes. Esto se debe a que hay más de 100,000 caracteres chinos, pero según el diagrama siguiente, 3 bytes solo pueden representar poco más de 60,000 caracteres, por lo que una pequeña cantidad de caracteres chinos requiere 4 bytes para ser representados.

Otra ventaja de la codificación UTF-8 es que es compatible con la codificación ASCII de forma retroactiva. De hecho, ASCII es un subconjunto de UTF-8. Los primeros 128 caracteres en UTF-8 corresponden uno a uno con los caracteres ASCII. Esto significa que el software que originalmente utilizaba ASCII puede seguir siendo utilizado con pocos o ningún cambio. Debido 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 por UTF-8. Go requiere que los archivos de código fuente se guarden en la codificación UTF-8. Cuando se opera con caracteres de texto, la codificación UTF-8 es la opción preferida. Además, la biblioteca estándar proporciona muchas funciones relacionadas con la codificación y decodificación UTF-8.

byte y rune

byte es un alias de uint8 y ocupa un byte (8 bits). Se puede utilizar para representar todos los caracteres de la tabla ASCII. Sin embargo, dado que byte puede representar un rango limitado de valores (256 o 2^8), cuando se trata de caracteres compuestos como los caracteres chinos, necesitamos utilizar el tipo rune.

Crea un nuevo archivo llamado byte.go y escribe 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)
}

Después de ejecutar el programa, se mostrará 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 mostrar caracteres. Se puede ver que el tipo byte y el tipo uint8 producen la misma salida cuando sus valores son iguales. Al consultar la tabla ASCII, se puede ver que el valor ASCII de la letra 'A' es 65. Cuando utilizamos el marcador de posición de entero %d para mostrar el valor, también es 65.

Por lo tanto, es evidente que byte en Go es equivalente a uint8 en los tipos enteros. Lo mismo se aplica a rune, pero representa un rango diferente de valores enteros.

rune es un alias de 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 = '😊' // Smile emoji
    fmt.Printf("Value of a: %c\n", a)

    var b int32 = 9829 // Decimal representation of a Unicode character (Heart symbol)
    fmt.Printf("Value of b: %c\n", b)
    var c rune = 0x1F496 // Hexadecimal representation of a Unicode character (Sparkling heart emoji)
    fmt.Printf("Value of c: %c\n", c)

    var d rune = '\u0041' // Unicode character represented by its code point (Capital letter 'A')
    fmt.Printf("Value of d: %c\n", d)
    var e rune = '\U0001F609' // Unicode character represented by its code point (Winking face emoji)
    fmt.Printf("Value of e: %c\n", e)
}

Después de ejecutar el programa, se mostrará la siguiente salida:

go run byte.go

Nota: Ejecuta el programa en el escritorio o en la terminal del WebIDE, pero evita ejecutarlo en la pestaña de la terminal ubicada en la parte superior de la máquina virtual 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 del corazón '♥'.
  • La variable c se inicializa con la representación hexadecimal de un carácter Unicode (0x1F496), que corresponde al emoji del 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 lo mismo. Las comillas simples se utilizan para representar caracteres, mientras que las comillas dobles se utilizan para declarar cadenas. Por lo tanto, se deben utilizar comillas simples al declarar tipos byte y rune, de lo contrario se producirá un error.

Cuestionario

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

  • Requisitos: El archivo rune.go debe colocarse en el directorio ~/project.
  • Pista: Para números hexadecimales largos, se debe utilizar un formato especificado.
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.
  • La codificación UTF-8 es una forma del conjunto de caracteres Unicode. Es una codificación de longitud variable, y su longitud de byte varía según el carácter que se esté representando.
  • El tipo de dato byte se puede utilizar para representar caracteres ASCII, mientras que el tipo de dato rune se puede utilizar para representar caracteres Unicode.
  • El tipo de dato byte puede representar caracteres ASCII, y el tipo de dato rune puede representar caracteres Unicode.

En esta sección, primero explicamos ASCII, UTF-8 y Unicode. Luego, explicamos la relación entre los tipos de datos de carácter byte y rune y los tipos de datos enteros.