Разбиение многобайтовой строки в Lua - PullRequest
3 голосов
/ 25 января 2012

У меня есть многобайтовая строка в Lua.

local s = "あいうえお"

Как взять строку и разбить ее на таблицу строк?

В английских текстах я могу использовать этот код. Но это не работает с многобайтовым.

local s = "foo bar 123"
local words = {}
for word in s:gmatch("%w+") do
    table.insert( words, word )
end

Ответы [ 3 ]

5 голосов
/ 27 января 2012

Как уже отмечали другие, трудно сказать, что вы хотите сделать: , где вы хотите разделить для символов, не относящихся к ASCII, если разделение по пробелам недостаточно?

Если вы просто хотите разделить отдельные символы для символов, не относящихся к ASCII, может быть достаточно что-то вроде следующего:

s = "oink barf 頑張っています"
for word in s:gmatch("[\33-\127\192-\255]+[\128-\191]*") do
   print (word)
end

производит:

oink
barf
頑
張
っ
て
い
ま
す

Хитрость в том, что в UTF-8, каждый многобайтовый символ состоит из «ведущего байта» с двумя старшими битами, равными 11 (поэтому \192 - \255 в Lua - помните, экранирование символов в Lua является десятичным), за которым следует нольили более "завершающих байтов" с двумя старшими битами, равными 10 (\128 - \191 в Lua).

4 голосов
/ 25 января 2012

Для начала .. из этого SO вопроса Как написать символ юникода в lua , ответ RBerteig указывает на библиотеку slnunicode

Также упоминается вэтот вопрос SO Существует ли библиотека lua, которая преобразует строку в байты, используя кодировку utf8

2 голосов
/ 14 января 2015

Если это UTF-8, в Lua 5.3 вы можете использовать utf8 библиотеку , например:

local s = "あいうえお"
local words = {}
for _, c in utf8.codes(s) do
  table.insert(words, utf8.char(c))
end
...