Поддержка UTF-8

Страницы: 1
RSS
Поддержка UTF-8
 
Пожалуйста, очень прошу, сделайте полноценную поддержку скриптов в кодировке UTF-8, которые содержат строки и комментарии на русском языке.
Надоело постоянно переконвертировать скрипты в Windows-1251 из дефолтной UTF-8, которая уже давно стала мировым стандартом.
 
Сергей Че, здравствуйте!

Стандартная библиотека Lua не поддерживает UTF-8.
Из-за этого эта кодировка не поддержана и в приложении.
 
Цитата
Ivan Sizykh написал:
Сергей Че, здравствуйте!

Стандартная библиотека Lua не поддерживает UTF-8.
Из-за этого эта кодировка не поддержана и в приложении.
Явно не из-за этого. В Lua строка - это "immutable sequences of bytes". Т.е. не важно что там. Плюс, начиная с версии 5.3, есть базовая поддержка UTF8 https://www.lua.org/manual/5.4/manual.html#6.5

Если использовать Lua вне экосистемы Quik, то прекрасно работают файлы с кодировкой UTF-8. Тот же редактор ZeroBraneStudio работает в UTF-8, и не поддерживает win1251.
 
Цитата
Nikolay написал:

Явно не из-за этого. В Lua строка - это "immutable sequences of bytes". Т.е. не важно что там. Плюс, начиная с версии 5.3, есть базовая поддержка UTF8  https://www.lua.org/manual/5.4/manual.html#6.5

Если использовать Lua вне экосистемы Quik, то прекрасно работают файлы с кодировкой UTF-8. Тот же редактор ZeroBraneStudio работает в UTF-8, и не поддерживает win1251.
Ну вот! Значит нет никаких преград реализовать это в Квике!
Пожалуйста, реализуйте полноценную поддержку скриптов в колировке UTF-8 в Квике!
 
Сергей Че, здравствуйте.

Ваше пожелание зарегистрировано.  Мы постараемся рассмотреть его и
сообщить Вам результаты анализа. Впоследствии, по результатам анализа,
будет приниматься решение о реализации пожелания в будущих версиях ПО.
 
От ответа "Стандартная библиотека Lua не поддерживает UTF-8."  до "Ваше пожелание зарегистрировано" - прошло два дня. Видимо за два дня Lua стал поддерживать "UTF-8"


Давайте делать ставки, что эти криворукие никогда того не реализуют, просто потому что - судя по ответу, даже не понимают, как у них все это работает )))
 
https://github.com/starwing/luautf8
 

Этот модуль добавляет поддержку UTF-8 в Lua.

Он использует данные, извлечённые из базы данных символов Unicode, и протестирован на Lua 5.2.3, Lua 5.3.0 и LuaJIT.

parseucd.lua — это скрипт на чистом Lua, который генерирует unidata.h для поддержки преобразования символов и проверки их категории.

Он совместим с собственным модулем строк Lua и проходит все тесты на сопоставление строк и шаблонов в наборе тестов Lua2.

Он также добавляет несколько полезных функций для работы с UTF-8, таких как:

  • удобный интерфейс для экранирования последовательностей Юникода в строках.
  • вставка/удаление строк, поскольку извлечение подстроки в кодировке UTF-8 может быть затратным.
  • вычисление ширины Юникода, полезное при реализации, например, эмулятора консоли.
  • полезный интерфейс для преобразования смещений в Юникоде и байтовых смещений.
  • проверка строк в кодировке UTF-8 на корректность и удаление недопустимых последовательностей байтов.
  • преобразование строк Unicode в обычный формат.

Обратите внимание, что во избежание конфликта со встроенной библиотекой utf8 в Lua5.3 эта библиотека создает файл с расширением lua-utf8.dll или lua-utf8.so. Поэтому используйте ее следующим образом:

local utf8 = require 'lua-utf8'
 
Справочное руководство по Lua 5.3Роберто Иерусалимский, Луис Энрике де Фигейреду, Вальдемар Селеш

Авторские права © 2015–2018 Lua.org, PUC-Rio. Бесплатно распространяется на условиях лицензии Lua.

Поддержка UTF-8

Эта библиотека обеспечивает базовую поддержку кодировки UTF-8. Все её функции представлены в таблице utf8. Эта библиотека не обеспечивает никакой поддержки Unicode, кроме работы с кодировкой. Любые операции, требующие понимания значения символа, например классификация символов, выходят за рамки её возможностей.

Если не указано иное, все функции, принимающие в качестве параметра позицию байта, предполагают, что указанная позиция является либо началом последовательности байтов, либо единицей плюс длина исходной строки. Как и в библиотеке строк, отрицательные индексы отсчитываются от конца строки.

utf8.char (···)Принимает ноль или более целых чисел, преобразует каждое из них в соответствующую последовательность байтов UTF-8 и возвращает строку, состоящую из объединения всех этих последовательностей.utf8.charpatternШаблон (строка, а не функция) «[\0-\x7F\xC2-\xF4][\x80-\xBF]*» (см. Шаблон), который соответствует ровно одной последовательности байтов UTF-8 при условии, что объект является допустимой строкой UTF-8.utf8.codes (s)

Возвращает значения, необходимые для построения

for p, c in utf8.codes(s) do body end

выполнит итерацию по всем символам в строке s, где p — позиция (в байтах), а c — кодовая точка каждого символа. При обнаружении недопустимой последовательности байтов возникает ошибка.

utf8.codepoint (s [, i [, j]])Возвращает кодовые точки (в виде целых чисел) всех символов в s, которые начинаются в диапазоне от i до j (включительно). По умолчанию для i установлено значение 1, а для j — i. При обнаружении недопустимой последовательности байтов возникает ошибка.utf8.len (s [, i [, j]])Возвращает количество символов UTF-8 в строке s, которые находятся между позициями i и j (включительно). По умолчанию для i установлено значение 1, а для j — -1. Если обнаруживается недопустимая последовательность байтов, возвращается ложное значение и позиция первого недопустимого байта.utf8.offset (s, n [, i])Возвращает позицию (в байтах), с которой начинается кодировка n-го символа s (отсчет ведется от позиции i). Отрицательное значение n соответствует символам перед позицией i. По умолчанию i равно 1, если n неотрицательно, и #s + 1 в противном случае, так что utf8.offset(s, -n) соответствует смещению n-го символа от конца строки. Если указанный символ отсутствует в строке или находится сразу после ее конца, функция возвращает nil.

В особом случае, когда n равно 0, функция возвращает начало кодирования символа, содержащего i-й байт s.

Эта функция предполагает, что s является допустимой строкой в кодировке UTF-8.

Последнее обновление: Вт, 26 июня, 13:27:21 -03 2018

 
Справочное руководство по Lua 5.4
Поддержка 6.5 – UTF-8
Поддержка 6.5 – UTF-8

Эта библиотека обеспечивает базовую поддержку кодировки UTF-8. Все её функции представлены в таблице utf8. Эта библиотека не обеспечивает никакой поддержки Unicode, кроме работы с кодировкой. Любая операция, требующая понимания значения символа, например классификация символов, выходит за рамки её возможностей.

Если не указано иное, все функции, принимающие в качестве параметра позицию байта, предполагают, что указанная позиция является либо началом последовательности байтов, либо равна длине исходной строки плюс единица. Как и в библиотеке string, отрицательные индексы отсчитываются от конца строки.

Функции, создающие последовательности байтов, принимают все значения вплоть до 0x7FFFFFFF, как определено в исходной спецификации UTF-8. Это подразумевает последовательности байтов длиной до шести байтов.

Функции, которые интерпретируют последовательности байтов, принимают только допустимые последовательности (хорошо сформированные и не слишком длинные). По умолчанию они принимают только последовательности байтов, которые приводят к допустимым кодовым точкам Unicode, отвергая значения больше 10FFFF и заменяющие их. Логический аргумент lax, когда он доступен, снимает эти проверки, так что принимаются все значения до 0x7FFFFFFF. (Неправильно сформированные и слишком длинные последовательности по-прежнему отклоняются.)

utf8.char (···)

Принимает ноль или более целых чисел, преобразует каждое из них в соответствующую последовательность байтов UTF-8 и возвращает строку, представляющую собой объединение всех этих последовательностей.

utf8.символьный шаблон

Шаблон (строка, а не функция) «[\0-\x7F\xC2-\xFD][\x80-\xBF]*» , который соответствует ровно одной последовательности байтов UTF-8 при условии, что объект является допустимой строкой UTF-8.

utf8.codes (s [, lax])

Возвращает значения, необходимые для построения

  1.     for p, c in utf8.codes(s) do body end

выполнит итерацию по всем символам UTF-8 в строке s, где p — позиция (в байтах), а c — кодовая точка каждого символа. Если встретится недопустимая последовательность байтов, возникнет ошибка.

utf8.codepoint (s [, i [, j [, lax]]])

Возвращает кодовые точки (в виде целых чисел) всех символов в s, которые начинаются между байтовой позицией i и j (включительно). По умолчанию для i установлено значение 1, а для j — i. При обнаружении недопустимой последовательности байтов возникает ошибка.

utf8.len (s [, i [, j [, lax]]])

Возвращает количество символов UTF-8 в строке s, которые начинаются с позиций i и j (оба значения включительно). По умолчанию для i установлено значение 1, а для j — -1. Если обнаруживается недопустимая последовательность байтов, возвращается fail плюс позиция первого недопустимого байта.

utf8.offset (s, n [, i])

Возвращает позицию (в байтах), с которой начинается кодировка n-го символа s (отсчет ведется с позиции i). При отрицательном n возвращаются символы до позиции i. По умолчанию для i установлено значение 1, если n неотрицательно, и #s + 1 в противном случае, то есть utf8.offset(s, -n) возвращает смещение n-го символа от конца строки. Если указанный символ отсутствует в строке или находится сразу после ее конца, функция возвращает fail.

В особом случае, когда n равно 0, функция возвращает начало кодирования символа, содержащего i-й байт s.

Эта функция предполагает, что s является допустимой строкой UTF-8.

 
Как использовать библиотеку 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»), хотя они являются эквивалентными строками.

Страницы: 1
Читают тему
Наверх