Длина арабских букв в луа

На языке Lua, когда я хочу получить длину одной арабской буквы (например, "ف") ответ будет 2!

Ex.

local letter = "ف"
print( letter:len() )

Выход: 2

Та же проблема возникает при использовании (string.sub(a,b)), Если я хочу напечатать первую букву арабского слова, я не могу сказать, (string.sub(1,1),

Ex.

local word_1 = "فولت"
print( word_1:sub(1,2) )

Выход: ف
как вы видели, я поставил второй аргумент (2), а не (1), чтобы получить правильный ответ.
если я поставлю первый аргумент 1, ответ будет:

print( word_1:sub(1,1) )

Выход: Ù

Почему Луа считает длину одной арабской буквы двумя?

И есть ли способ получить правильную длину, которая равна 1?

3 ответа

Решение

Луа 8-битный чистый.

Другими словами, строка Lua - это последовательность байтов, она не поддерживает Юникод внутри. Арабское письмо "ف" имеет 2 байта, поэтому Lua рассматривает его как строку длиной 2.

Вам нужно использовать специальный трюк для манипулирования Unicode, например, предполагая, что используется UTF-8, вы можете использовать этот фрагмент для подсчета длины строки (Ссылка: Lua Unicode):

local _, count = string.gsub(unicode_string, "[^\128-\193]", "")

Lua 5.3 выпущен сейчас. Он предоставляет базовую библиотеку UTF-8.

utf8.len может использоваться для получения длины строки UTF-8:

print(utf8.len("ف"))
-- 1

Lua, будучи 8-битным чистым, достаточно, чтобы сказать, что Lua поддерживает Unicode. Хотя без дополнительной библиотеки поддержки Unicode, степень поддержки минимальна. Для любой строки Юникода есть как минимум 4 способа ее измерения: единицы кода, точки кода, кластеры графем. Четвертый способ - bytecount, который является постоянным кратным числом единиц кода, в зависимости от того, какой UTF используется. UTF-8: 1 UTF16: 2 UTF32: 4. Итак, четко подумайте, какие из этих мер вам нужны и где.

Другие вопросы по тегам