2012-01-25 6 views
3

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

local s = "あいうえお" 

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

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

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

Где границы между "словами" на японском языке? Или вам просто нужно разбить эту строку на таблицу отдельных символов, например? {"あ", "い", "う", "え", "お"} – dasblinkenlight

+0

Использование [ICU4Lua] (https://github.com/duncanc/icu4lua/) – daurnimator

+0

ICU использует UTF-16, а не UTF- 8. –

ответ

4

Для начала .. от этого SO вопрос How to write a unicode symbol in lua, точки ответа RBerteig к библиотеке slnunicode

также упоминается в этом SO вопрос Is there any lua library that converts a string to bytes using utf8 encoding

+0

Обширные библиотеки Юникода - это возможное решение, но часто - самый большой. На самом деле не совсем ясно, что автор вопроса действительно хочет расколоть здесь, поэтому немного сложно сказать, какой именно лучший метод, но для многих простых задач utf-8 вполне разумно просто писать методы, непосредственно работающие с кодировкой , – snogglethorpe

5

Как уже отмечалось, это трудно сказать что вы хотите сделать: , где вы хотите разбить для символов, отличных от 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 — запомнить, символ побегов в Лу а - десятичные числа), за которыми следуют ноль или более «конечных байтов» с верхними двумя битами, равными 10 (\128\191 в Lua).

+0

Это аккуратный трюк. – mlepage

2

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

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