Извлеките первую букву строки UTF-8 С помощью Lua

есть ли способ извлечь первую букву строки в кодировке UTF-8 С Lua?

Lua неправильно поддерживает Unicode, поэтому string.sub("ÆØÅ", 2, 2) вернутся "?", а не "Ø".

есть ли относительно простой алгоритм синтаксического анализа UTF-8, который я мог бы использовать для строкового байта на байт, с единственной целью получить первую букву строки, будь то китайский символ или A?

или это слишком сложно, требуя огромной библиотеки, так далее.?

2 ответов


вы можете легко извлечь первую букву из строки в кодировке UTF-8 со следующим кодом:

function firstLetter(str)
  return str:match("[%z-74-4][8-1]*")
end

потому что кодовая точка UTF-8 начинается либо с байта от 0 до 127, либо с байта от 194 до 244, за которым следует один или несколько байтов от 128 до 191.

вы даже можете итерации над кодовыми точками UTF-8 аналогичным образом:

for code in str:gmatch("[%z-74-4][8-1]*") do
  print(code)
end

обратите внимание, что оба примера возвращают строка значение для каждой буквы, а не Числовое значение кодовой точки Unicode.


Lua 5.3 обеспечить библиотека UTF-8.

можно использовать utf8.codes чтобы получить каждую кодовую точку, а затем использовать utf8.char чтобы получить характер:

local str = "ÆØÅ"
for _, c in utf8.codes(str) do
  print(utf8.char(c))
end

это также работает:

local str = "ÆØÅ"
for w in str:gmatch(utf8.charpattern ) do
  print(w)
end

здесь utf8.charpattern это просто строка "[-\x7F\xC2-\xF4][\x80-\xBF]*" для шаблона, чтобы соответствовать одной последовательности байтов UTF-8.