Latest post of the previous page:
Воот.Был плагин. И в код его вы вероятно не заглядывали.
Ответ я уже дал выше: http://forum.farmanager.com/viewtopic.p ... 03#p125203
Latest post of the previous page:
Воот.С использованием win.Utf8ToOEM получается так:Shmuel wrote: Раз пошла такая пьянка, вот модификация, которая позволяет (у меня по крайней мере) выводить и русский текст, если на входе UTF-8. "Чисто юникодные" символы, естественно, таким путём не выведешь.Code: Select all
function printToFARConsole(...) local OemCp = win.GetOEMCP() panel.GetUserScreen() for k=1, select("#",...) do local s = select(k,...) s = win.WideCharToMultiByte(win.Utf8ToUtf16(s),OemCp) io.write(s) end io.write("\n") panel.SetUserScreen() end
Code: Select all
function printToFARConsole(...)
panel.GetUserScreen()
for k=1, select("#",...) do
io.write(win.Utf8ToOEM(select(k,...)))
end
io.write("\n")
panel.SetUserScreen()
end
Вот функция, по поведению максимально приближённая к стандартной Lua
Code: Select all
local function _tostr(arg)
return win.Utf8ToOem(tostring(arg))
end
local function printToFARConsole(...)
local n = select("#",...)
panel.GetUserScreen()
if n>0 then
io.write(_tostr(...))
for i=2,n do
io.write("\t",_tostr(select(i,...)))
end
end
--io.write("\n")
panel.SetUserScreen()
end
--io.write("\n")
закомментирован, потому что panel.SetUserScreen()
сам по себе вставляет пустую строку (что нежелательно, и будет предметом очередного тикета на мантисе: 3525)Code: Select all
local ffi = require"ffi"
local C = ffi.C
ffi.cdef[[
//https://docs.microsoft.com/en-us/windows/console/getconsoleoutputcp
UINT GetConsoleOutputCP(void); //WINAPI
]]
local OutputCP
local function _tostr(arg)
return win.WideCharToMultiByte(win.Utf8ToUtf16(tostring(arg)),OutputCP)
end
local function printToFARConsole(...)
local n = select("#",...)
panel.GetUserScreen()
if n>0 then
OutputCP = C.GetConsoleOutputCP()
io.write(_tostr(...))
for i=2,n do
io.write("\t",_tostr(select(i,...)))
end
end
--io.write("\n")
panel.SetUserScreen()
end
Code: Select all
local printToFARConsole do
local ffi = require"ffi"
local C = ffi.C
ffi.cdef[[
//https://docs.microsoft.com/en-us/windows/console/getstdhandle
HANDLE GetStdHandle( //WINAPI
DWORD nStdHandle //_In_
);
//https://docs.microsoft.com/en-us/windows/console/writeconsole
BOOL WriteConsoleW( //WINAPI
HANDLE hConsoleOutput, //_In_
const VOID *lpBuffer, //_In_
DWORD nNumberOfCharsToWrite, //_In_
LPDWORD lpNumberOfCharsWritten, //_Out_
LPVOID lpReserved //_Reserved_
);
]]
local STD_OUTPUT_HANDLE = ffi.new("DWORD",-11)
local INVALID_HANDLE_VALUE = ffi.cast("HANDLE",-1)
local hConsoleOutput
local function GetOutputHandle()
hConsoleOutput = C.GetStdHandle(STD_OUTPUT_HANDLE)
if hConsoleOutput==INVALID_HANDLE_VALUE then
far.Message("GetStdHandle failed","Error",nil,"ew")
error("GetStdHandle",2)
end
end
local lpNumberOfCharsWritten = ffi.new"DWORD[1]"
local function WriteConsole(str)
local len = str:len()
local wstr = win.Utf8ToUtf16(str.."\0")
if 0==C.WriteConsoleW(hConsoleOutput,ffi.cast("const VOID*",wstr),len,lpNumberOfCharsWritten,nil) then
far.Message("WriteConsoleW failed","Error",nil,"ew")
error("WriteConsole",2)
end
end
function printToFARConsole(...)
GetOutputHandle()
local n = select("#",...)
panel.GetUserScreen()
if n>0 then
WriteConsole(tostring(...))
for i=2,n do
WriteConsole("\t")
WriteConsole(tostring(select(i,...)))
end
end
--WriteConsole("\n") --https://bugs.farmanager.com/view.php?id=3525
panel.SetUserScreen()
end
end
Code: Select all
local ffi=require("ffi")
local C=ffi.C
ffi.cdef[[int wprintf(const wchar_t*,...);]]
panel.GetUserScreen()
C.wprintf(ffi.cast("const wchar_t*",win.Utf8ToUtf16("превед медвед\0")))
panel.SetUserScreen()