Что такое кодировка ASCII и как она соотносится с UTF-8 в Go?

Ответ

ASCII (American Standard Code for Information Interchange) — это стандарт кодирования символов, основанный на английском алфавите. Это 7-битная кодировка, которая включает в себя 128 символов:

  • Буквы латинского алфавита (A-Z, a-z)
  • Арабские цифры (0-9)
  • Знаки препинания и спецсимволы (!, @, #, $ и т.д.)
  • Управляющие символы (например, перевод строки n, возврат каретки r).

ASCII в контексте Go:

В Go строки по умолчанию представлены в кодировке UTF-8. Ключевой особенностью UTF-8 является то, что она обратно совместима с ASCII. Это означает, что любой символ из набора ASCII кодируется в UTF-8 точно так же — одним байтом.

  • Строки в Go — это, по сути, срезы байт ([]byte).
  • Символы (литералы) в Go, например 'A', имеют тип rune, который является псевдонимом для int32. Это позволяет представлять любой символ Unicode.
package main

import "fmt"

func main() {
    // Символ 'A' является частью ASCII.
    // В Go это rune (int32), но его значение (65) умещается в один байт.
    char := 'A'
    asciiCode := byte(char) // Безопасное преобразование для ASCII-символов

    fmt.Printf("Символ: %c, его код (rune): %d, его байт в ASCII/UTF-8: %dn", char, char, asciiCode)
    // Вывод: Символ: A, его код (rune): 65, его байт в ASCII/UTF-8: 65

    // Кириллический символ 'Я' не входит в ASCII.
    cyrillicChar := 'Я'
    // Его нельзя представить одним байтом.
    // В UTF-8 он занимает 2 байта (208, 175).
    fmt.Printf("Символ: %c, его код (rune): %dn", cyrillicChar, cyrillicChar)
    // Вывод: Символ: Я, его код (rune): 1071
}

Итог: ASCII — это исторически важная и базовая кодировка, которая является подмножеством современного стандарта UTF-8, используемого в Go. Для работы с текстом, содержащим только английские буквы, цифры и спецсимволы, можно думать в терминах ASCII, но для поддержки интернационализации всегда следует полагаться на UTF-8.