Канонизация строк это приведение строки к единственной стандартной форме перед сравнением или обработкой.
Одна и та же строка может быть представлена по-разному. Классический пример это Unicode. Символ
é можно записать:- как один кодпоинт
U+00E9- как два кодпоинта
e + U+0301Байтово это разные строки. Визуально — одинаковые. Без канонизации
== вернёт false.В стандартной библиотеке есть пакет
golang.org/x/text/unicode/norm, который реализует четыре формы нормализации по стандарту Unicode:import "golang.org/x/text/unicode/norm"
a := "é" // precomposed
b := "e\u0301" // decomposed
// Без канонизации
fmt.Println(a == b) // false
// С канонизацией
normA := norm.NFC.String(a)
normB := norm.NFC.String(b)
fmt.Println(normA == normB) // true
Где это важно на практике
- Сравнение имён пользователей и email
- Работа с файловой системой (macOS использует NFD, Linux — NFC)
- Поиск по тексту
- Безопасность: канонизация помогает избежать обходов валидации через визуально идентичные, но байтово разные строки
🐸 Библиотека Go для собеса