Как использовать библиотеку Lua utf8
При использовании библиотеки Lua utf8 спецификация не требуется.
Однако, если вы хотите использовать спецификацию, сначала необходимо вызвать функцию utf8.bom().
Эта функция вернёт спецификацию для UTF-8.
Получив BOM, вы можете использовать функцию utf8.char() для создания символа в кодировке UTF-8.
Эта функция принимает два аргумента: первый — кодовая точка символа, второй — количество байтов для символа. Например, чтобы создать символ «a», используйте следующий код:
local a = utf8.char(0x61, 1)
Кодовая точка для буквы «a» — 0x61, а количество байт для буквы «a» — 1.
Вы также можете использовать функцию utf8.codes() для получения кодовых точек строки в кодировке UTF-8. Эта функция принимает строку в качестве единственного аргумента и возвращает таблицу кодовых точек. Например, чтобы получить кодовые точки для «abc», используйте следующий код:
local abc = "abc"
local codePoints = utf8.codes(abc)
Кодовые точки для «abc» — {0x61, 0x62, 0x63}.
Если вам нужно узнать количество байтов для символа в кодировке UTF-8, вы можете использовать функцию utf8.len(). Эта функция принимает строку в качестве единственного аргумента и возвращает количество байтов в строке. Например, чтобы узнать количество байтов для строки «abc», используйте следующий код:
local abc = "abc"
local numBytes = utf8.len(abc)
Количество байтов в слове «abc» равно 3.
Вы также можете использовать функцию utf8.offset(), чтобы получить смещение байта для конкретной кодовой точки в строке UTF-8. Эта функция принимает два аргумента: первый — строка, второй — кодовая точка. Она возвращает смещение байта для кодовой точки. Например, чтобы получить смещение байта для кодовой точки 0x61 в строке «abc», используйте следующий код:
local abc = "abc"
local offset = utf8.offset(abc, 0x61)
Смещение байта для кодовой точки 0x61 в строке «abc» равно 1.
Одно из расширенных применений библиотеки utf8 — нормализация строк в кодировке UTF-8. Нормализация — это процесс, обеспечивающий одинаковое представление всех эквивалентных строк. Например, строка «é» может быть представлена как «é» или «\u00e9». Нормализация гарантирует, что обе строки будут представлены как «\u00e9».
Чтобы нормализовать строку в кодировке UTF-8, можно использовать функцию utf8.normalize() Эта функция принимает два аргумента: первый — строка для нормализации, второй — форма нормализации Форма нормализации может быть одной из следующих:
- NFC: нормализованная форма канонической композиции. Это форма по умолчанию.
- NFD: каноническая декомпозиция формы нормализации.
- NFKC: нормализованная форма совместимости составов.
- NFKD: разложение на составляющие совместимости форм нормализации.
Например, чтобы преобразовать строку «é» в форму NFC, нужно использовать следующий код:
local s = "é"
local normalized = utf8.normalize(s, "NFC")
Нормализованная строка — «\u00e9».
У библиотеки utf8 есть множество других применений. Дополнительную информацию можно найти в справочном руководстве по Lua
Нормализация — это процесс, обеспечивающий единообразное представление всех эквивалентных строк. Это важно, поскольку некоторые системы могут не распознавать строки в разных формах как эквивалентные. Например, строка «é» может быть представлена как «é» или «\u00e9». Нормализация гарантирует, что обе строки будут представлены как «\u00e9».
Существует четыре формы нормализации: NFC, NFD, NFKC и NFKD. NFC — это форма по умолчанию.
NFC: форма нормализации канонической композиции. В этой форме все составные символы объединяются в один символ. Например, строка «a\u0300» (что эквивалентно «à») будет нормализована до «\u0061\u0300» (что эквивалентно «à»).
NFD: нормализованная форма канонического разложения. В этой форме все символы раскладываются на составляющие. Например, строка «\u0061\u0300» (что эквивалентно «à») будет нормализована до «a\u0300» (что эквивалентно «à»).
NFKC: композиция совместимости форм нормализации. В этой форме все символы объединяются в один символ, а все совместимые символы преобразуются в их канонические эквиваленты. Например, строка «\u0061\u0300» (эквивалентная «à») будет нормализована до «\u0061\u0300» (эквивалентной «à»), а строка «\uFB01» (эквивалентная «fi» с точки зрения совместимости) будет нормализована до «\uFB01» (эквивалентной «fi» с точки зрения канонического соответствия).
NFKD: разложение на составляющие для совместимости с формой нормализации. В этой форме все символы разлагаются на составляющие, а все символы совместимости преобразуются в их канонические эквиваленты. Например, строка «\u0061\u0300» (эквивалентная «à») будет нормализована до «a\u0300» (эквивалентной «à»), а строка «\uFB01» (эквивалентная «fi» с точки зрения совместимости) будет нормализована до «\uFB01» (эквивалентной «fi» с точки зрения канонического соответствия).
Существует несколько причин, по которым может потребоваться нормализация строки. Например, перед сохранением строк в базе данных может потребоваться убедиться, что все эквивалентные строки представлены одинаково. Это обеспечит корректное извлечение строк из базы данных.
Ещё одна причина нормализовать строку — сортировка. Если строки не нормализованы, они могут сортироваться неправильно. Например, строка «é» (эквивалентная «e») будет отсортирована раньше, чем строка «ê» (эквивалентная «e»), хотя они эквивалентны.
Ещё одна причина — обеспечение корректного сравнения двух строк. Если строки не нормализованы, они могут сравниваться некорректно. Например, строка «é» (эквивалентная «e») будет считаться отличной от строки «ê» (эквивалентной «e»), хотя они являются эквивалентными строками.