Длина арабских букв в луа
На языке 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. Итак, четко подумайте, какие из этих мер вам нужны и где.