Latest post of the previous page:
В LuaFAR string оставлена как есть в lua, для utf8 используется unicode.utf8.SUSim wrote:... я спрашивал не про строки а про библиотеку string.
Latest post of the previous page:
В LuaFAR string оставлена как есть в lua, для utf8 используется unicode.utf8.SUSim wrote:... я спрашивал не про строки а про библиотеку string.
Библиотека string - не юникодная.SUSim wrote:я спрашивал не про строки а про библиотеку string.
Code: Select all
string.sub(text,5,10) -- получить подстроку от 5 до 10 байта (длина = 6 байт)
text:sub(5,10) -- получить подстроку от 5 до 10 символа (длина = 6 символов)
text = "Привет"
print(#text) --> 12
print(string.len(text)) --> 12
print(text:len()) --> 6
Code: Select all
s = "Привет, мир!"
msgbox(s, "Len=" .. s:len() .. ", index=" .. s:find("!"))
Code: Select all
╔══ Привет, мир! ══╗
║ Len=12, index=21 ║
╟──────────────────╢
║ { OK } ║
╚══════════════════╝
Функция find возвращает позицию в байтах.Max Rusov wrote:Какая то непоследовательность в работе со строками, не кажется?
Code: Select all
s = "Привет, мир!" msgbox(s, "Len=" .. s:len() .. ", index=" .. s:find("!"))
Code: Select all
╔══ Привет, мир! ══╗ ║ Len=12, index=21 ║ ╟──────────────────╢ ║ { OK } ║ ╚══════════════════╝
Code: Select all
s:cfind("!")
Code: Select all
local function FixFindFunction()
local usub, ssub = unicode.utf8.sub, string.sub
local ulen, slen = unicode.utf8.len, string.len
local ufind = unicode.utf8.find
unicode.utf8.find = function(s, patt, init, plain)
init = init and slen(usub(s, 1, init-1)) + 1
local t = { ufind(s, patt, init, plain) }
if t[1] == nil then return nil end
return ulen(ssub(s, 1, t[1]-1)) + 1, ulen(ssub(s, 1, t[2])), unpack(t, 3)
end
end
FixFindFunction()
её нет.Aidar wrote:Нужно использовать функцию cfind
Не стоит заменять функцию, т.к. эта замена будет действовать для всех макросов, скриптов и плагинов на Lua.zg wrote:стырено с lua4ed. в автостартующем макросе: ...
Поэтому нужно добавить её, пока Shmuel не добавил официально.zg wrote:её нет.Aidar wrote:Нужно использовать функцию cfind
Для получения длины строки в байтах есть string.len(s).Skirda wrote:Тогда, по аналогии, должно быть clen, а то как то нелогично получается.
Есть такое дело, так устроена функция unicode.utf8.find, которая неявно вызывается - она возвращает смещения в байтах. Вышеупомянутая cfind есть в плагине LuaFAR for Editor - наверное есть смысл её и в LuaMacro скопировать, тогда она будет сразу "из коробки", это лучше, чем автостартующий макрос, наверное.Max Rusov wrote:Какая то непоследовательность в работе со строками, не кажется?
Code: Select all
Macro
{
description="Open explorer..."; area="Shell Tree"; key="AltEnter";
action=function()
os.execute( "explorer /select," .. APanel.Path .. "\\" .. APanel.Current )
end;
}
Это не ошибка. os.execute - не юникодная функция.
Либо передавать аргумент в OEM ANSI, либо использовать win.ShellExecute, которая поддерживает юникод.
Есть уже виш на мантисе по поводу os.execute. Но надо иметь в виду, что эти преобразования всё равно не сделают функцию юникодной, в случае русских букв будет работать, а вот, к примеру, широкое тире или какой-нибудь иероглиф правильно не преобразуются.
Code: Select all
function os.myexecute(s)
s = win.Utf8ToUtf16(s)
s = win.WideCharToMultiByte(s, win.GetACP())
return os.execute(s)
end
Насколько проблематично, пока не смотрел, т.к. не было надобности в os.execute.