Проблема с кодированием на u8 | mimgui

ManstikosUA

Участник
Автор темы
66
15
Привет, вообщем, проблема в том, что когда я пишу в имгуи менюшке в InputText текст по русски, потом перезапускаю скрипт (CTRL+R) то текст меняется в каракули, ставил u8 в начале - не помагает, пробовал чёт химичить, тоже не помагает, помогите мне пожалуйста, вот код с отрезками которые нужны:

Должно быть:
1703699893591.png


происходит:
1703699938851.png
Lua:
require 'moonloader'
local ffi = require 'ffi'
require "lib.sampfuncs"

local imgui = require 'imgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local new, str = imgui.new, ffi.string



local keys = require 'vkeys'
local bNotf, notf = pcall(import, "imgui_notf.lua")


local main_window_state = imgui.ImBool(false)
local text_buffer = imgui.ImBuffer(256)
local inputField = imgui.ImBuffer(256)

local inicfg = require 'inicfg'

local directIni = "moonloader\\pdhelperManstikosUA.ini"

local mainIni = inicfg.load(nil, directIni)
--local stateIni = inicfg.save(main.Ini, directIni)
local tab = 1 -- в этой переменной будет хранится номер открытой вкладки

local data =
{                                                                                                                         -- задаем значения для data.** на случай, если потребуется создать файл конфига
    config =
        {
        rusname = u8"Имя Фамилия",
                rang = u8"Ранг"
    }
}


local mainIni = inicfg.load(data, 'moonloader\\pdhelperManstikosUA.ini') -- загружаем конфиг
if mainIni == nil then -- проверяем, все ли в порядке. Если нет - создаем конфиг из заданных значений, иначе - загружаем
    print('Не найден файл конфига, создаю.')
    if inicfg.save(mainIni, 'moonloader\\pdhelperManstikosUA.ini') then
        print('Файл был с настройками был создан, ошибок нет.')
        mainIni = inicfg.load(nil, 'moonloader\\pdhelperManstikosUA.ini')
    end
end


local rusname = imgui.ImBuffer(256)
local rang = imgui.ImBuffer(256)
rusname.v = mainIni.config.rusname
rang.v = mainIni.config.rang


Lua:
function imgui.OnDrawFrame()
    imgui.SetNextWindowPos(imgui.ImVec2(500, 500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(500, 300), imgui.Cond.Always)
    imgui.Begin(u8'Пример', WinState, imgui.WindowFlags.NoResize)
    for numberTab,nameTab in pairs({'Основное','Настройки','Инфа'}) do -- создаём и парсим таблицу с названиями будущих вкладок
        if imgui.Button(u8(nameTab), imgui.ImVec2(100,50)) then -- 2ым аргументом настраивается размер кнопок (подробнее в гайде по мимгуи)
            tab = numberTab -- меняем значение переменной tab на номер нажатой кнопки
        end
    end
    imgui.SetCursorPos(imgui.ImVec2(120, 28)) -- [Для декора] Устанавливаем позицию для чайлда ниже
    if imgui.BeginChild('Name##'..tab, imgui.ImVec2(300, 250), true) then -- [Для декора] Создаём чайлд в который поместим содержимое
        -- == [Основное] Содержимое вкладок == --
        if tab == 1 then -- если значение tab == 1
            -- == Содержимое вкладки №1
            imgui.Text(u8'Открыта первая вкладка "Основное"')
            imgui.Text(u8"Ваш ник (RUS): ")
            if imgui.InputText(u8'', rusname) then
                mainIni.config.rusname = u8:decode(rusname.v)
        end
        imgui.Text(u8"Ваша должность: ")
    if imgui.InputText(u8' ', rang) then
        mainIni.config.rang = u8:decode(rang.v)
    end
    if imgui.Button(u8"Сохранить", imgui.ImVec2(100, 20)) then
        mainIni.config.rusname = u8:decode(rusname.v)
        mainIni.config.rang = u8:decode(rang.v)
        sampAddChatMessage("{FFFFFF}Вы успешно изменили ник на:{00BFFF} " .. u8:decode(rusname.v), -1)
        sampAddChatMessage("{FFFFFF}Ваш ранг:{00BFFF} " .. u8:decode(rang.v), -1)
        if inicfg.save(mainIni, directIni) then
            sampAddChatMessage("Сохранено! 2", -1)
        end
    end
            if imgui.Button(u8'Кнопка') then
                sampAddChatMessage('Вы нажали кнопку во вкладке номер '..tab, -1)
            end
        elseif tab == 2 then -- если значение tab == 2
            -- == Содержимое вкладки №2
            imgui.Text(u8'Открыта первая вкладка "Настройки"')
            if imgui.Button(u8'Кнопка') then
                sampAddChatMessage('Вы нажали кнопку во вкладке номер '..tab, -1)
            end
        elseif tab == 3 then -- если значение tab == 3
            -- == Содержимое вкладки №3
            imgui.Text(u8'Открыта первая вкладка "Инфа"')
            imgui.Text(u8"Команда /pas - показывает паспорт (/pas ID)")
            imgui.Text(u8"Команда /lics - показывает лицензии(/lics ID)")
            imgui.Text(u8"Команда /medka - отыгрывает рп для мед.карты(передавать нужно вручную)")
            imgui.Text(u8"Команда /udost - отыгрывает рп для удостоверения(передавать нужно вручную)")
            imgui.Text(u8"Команда /cuff - надеть на игрока наручники, есть отыгровка(/cuff ID)")
            imgui.Text(u8"Команда /gotome - потащить игрока за собой, есть отыгровка(/gotome ID)")
            imgui.Text(u8"Команда /cput - посадить игрока в машину, есть отыгровка(/cput ID)")
            imgui.Text(u8"Команда /bodycam - включает отыгровку фрапса")
            imgui.Text(u8"Команда /ticket - отыгровка рп для штарафа + выписка штрафа(/ticket ID)")
            imgui.Text(u8"Команда /frisk - отыгровка рп для обыска + обыск(/frisk ID)")
            imgui.Text(u8"Команда /arrest - отыгровка ареста + арест(/arrest ID)")
            imgui.Text(u8"Команда /uncuff - снять наручники + отыгровка(/uncuff ID)")
            imgui.Text(u8"Команда /su - выдать розыск + отыгровка(/su ID)")
            imgui.Text(u8"Команда /clear - очистить розыск + отыгровка(/clear ID)")
            imgui.Text(u8"Команда /doki - запросить документы(/doki ID)")
            imgui.Text(u8"Команда /meg - просьба остановить машину в мегафон(/meg)")
            imgui.Text(u8"Команда /setpaswrld - установить пароль для быстрого захода")
            imgui.Text(u8"Команда /chatclear - визуально очистить чат")
            imgui.Text(u8"Команда /ecspertiza - отыгровка рп экспертизы")
            imgui.Text(u8"Команда /drug количество - употребить наркотики с рп")
            imgui.Text(u8"Зажать клавишу L.ALT - сирена+стробоскопы")
            imgui.Text(u8"Команда /statistiko - вывести статистику персонажа")

            if imgui.Button(u8'Кнопка') then
                sampAddChatMessage('Вы нажали кнопку во вкладке номер '..tab, -1)
            end
        end
        -- == [Основное] Содержимое вкладок закончилось == --
        imgui.EndChild()
    end
    imgui.End()  
end
 

Вложения

  • 1703699847584.png
    1703699847584.png
    123.4 KB · Просмотры: 10
  • 1703699873453.png
    1703699873453.png
    123.4 KB · Просмотры: 12
Решение
Вы че как малолетки? И так же берете
local ini = inicfg.load({
config =
{
rusname = u8"Имя"
}}, "AutoSchool.ini")
К сожалению, если бы всё было бы так просто, вопроса бы не было
либо я не то сделал, либо ты не то написал, он у меня перестал ваще работать, можешь дать свой вк/тг/дс?
Я тебе фулл код скину


при обращении к элементу массива ini( при сохранении в переменную imBuffer ) нужно использовать u8:encode
при сохранении нужно применять к переменной u8:decode()

Fott

Простреленный
3,436
2,279
1. У тебя не мимгуи, а имгуи
2. Ты сохраняешь в u8:decode, и запихаешь его в инпут, а инпут должен принимать текст без декодировки.

У тебя первоначально в инпуте utf8. Ты его декодируешь и записываешь в конфиг. При загрузке скрипта ты уже декодированный текст запихиваешь в инпут, а ему такое не надо.
 

tfornik

Известный
311
223
Наведи пример, я не совсем понял как реализовать
/tgui
Lua:
local imgui = require("mimgui")
local ffi = require('ffi')
local inicfg = require("inicfg")
local encoding = require("encoding")
encoding.default = 'CP1251'
u8 = encoding.UTF8

local iFile = "test.ini"
local ini = inicfg.load({
    main = {
        text = "Привет, мир!"
    }
}, iFile)
if not doesFileExist(getWorkingDirectory() .. "\\config\\"..iFile) then inicfg.save(ini, iFile)   end


local new = imgui.new
local win = new.bool(false)
local input = new.char[128](u8:encode(ini.main.text))


function main()
    while not isSampAvailable() do wait(100) end

    sampRegisterChatCommand("tgui", function()
        win[0] = not win[0]
    end)

    wait(-1)
end

imgui.OnInitialize(function()
    imgui.GetIO().IniFilename = nil
end)

local frame = imgui.OnFrame(function() return win[0] end,
    function(this)
        imgui.SetNextWindowPos(imgui.ImVec2(imgui.GetIO().DisplaySize.x / 2, imgui.GetIO().DisplaySize.y / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(200, 225), imgui.Cond.FirstUseEver)
        imgui.Begin("Tgui", win, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoTitleBar)

        imgui.InputText(u8("Инпут текст"), input, ffi.sizeof(input))
        if imgui.Button("save") then
            ini.main.text = u8:decode(ffi.string(input))
            inicfg.save(ini, iFile)
        end

        imgui.End()
    end
)
 

ManstikosUA

Участник
Автор темы
66
15
/tgui
Lua:
local imgui = require("mimgui")
local ffi = require('ffi')
local inicfg = require("inicfg")
local encoding = require("encoding")
encoding.default = 'CP1251'
u8 = encoding.UTF8

local iFile = "test.ini"
local ini = inicfg.load({
    main = {
        text = "Привет, мир!"
    }
}, iFile)
if not doesFileExist(getWorkingDirectory() .. "\\config\\"..iFile) then inicfg.save(ini, iFile)   end


local new = imgui.new
local win = new.bool(false)
local input = new.char[128](u8:encode(ini.main.text))


function main()
    while not isSampAvailable() do wait(100) end

    sampRegisterChatCommand("tgui", function()
        win[0] = not win[0]
    end)

    wait(-1)
end

imgui.OnInitialize(function()
    imgui.GetIO().IniFilename = nil
end)

local frame = imgui.OnFrame(function() return win[0] end,
    function(this)
        imgui.SetNextWindowPos(imgui.ImVec2(imgui.GetIO().DisplaySize.x / 2, imgui.GetIO().DisplaySize.y / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(200, 225), imgui.Cond.FirstUseEver)
        imgui.Begin("Tgui", win, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoTitleBar)

        imgui.InputText(u8("Инпут текст"), input, ffi.sizeof(input))
        if imgui.Button("save") then
            ini.main.text = u8:decode(ffi.string(input))
            inicfg.save(ini, iFile)
        end

        imgui.End()
    end
)
тоесть так?


Lua:
   -- == Содержимое вкладки №1
            imgui.Text(u8'Открыта первая вкладка "Основное"')
            imgui.Text(u8"Ваш ник (RUS): ")
            if imgui.InputText(u8'', rusname) then
                mainIni.config.rusname = (rusname.v)
 

tfornik

Известный
311
223
а, у тебя имгуи. Сорри, не заметил
тогда легче намного шо

Lua:
local rusname = imgui.ImBuffer(u8:encode(mainIni.config.rusname)) --> Чтение( в начало кода )


--> В imgui
if imgui.InputText(u8'', rusname) then --> Запись
    mainIni.config.rusname = u8:decode(rusname.v)
    inicfg.save(mainIni, "pdhelperManstikosUA.ini'")
end
 

ManstikosUA

Участник
Автор темы
66
15
а, у тебя имгуи. Сорри, не заметил
тогда легче намного шо

Lua:
local rusname = imgui.ImBuffer(u8:encode(mainIni.config.rusname)) --> Чтение( в начало кода )


--> В imgui
if imgui.InputText(u8'', rusname) then --> Запись
    mainIni.config.rusname = u8:decode(rusname.v)
    inicfg.save(mainIni, "pdhelperManstikosUA.ini'")
end
либо я не то сделал, либо ты не то написал, он у меня перестал ваще работать, можешь дать свой вк/тг/дс?
Я тебе фулл код скину
 

tfornik

Известный
311
223
Вы че как малолетки? И так же берете
local ini = inicfg.load({
config =
{
rusname = u8"Имя"
}}, "AutoSchool.ini")
К сожалению, если бы всё было бы так просто, вопроса бы не было
либо я не то сделал, либо ты не то написал, он у меня перестал ваще работать, можешь дать свой вк/тг/дс?
Я тебе фулл код скину


при обращении к элементу массива ini( при сохранении в переменную imBuffer ) нужно использовать u8:encode
при сохранении нужно применять к переменной u8:decode()
 

ManstikosUA

Участник
Автор темы
66
15
К сожалению, если бы всё было бы так просто, вопроса бы не было



при обращении к элементу массива ini( при сохранении в переменную imBuffer ) нужно использовать u8:encode
при сохранении нужно применять к переменной u8:decode()
дай свой вк/тг/дс