Ошибки из-за ужесточения проверки UTF-8 в строках

Здесь обсуждается всё, что касается макросов.
buniak_a_h
Posts: 2126
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 131 times
Been thanked: 211 times
Contact:

Глюки и баги, появившиеся в «ночных сборках»

Post by buniak_a_h »

Только что обновился на версию 5580 x64. При старте ФАРа сразу получаю
На версии 5578 всё было ок.

Что-нить ещё надо для исправления?
P/S. Версия Far30b5579.x64.20200406.7z тоже стартует нормально.
Last edited by buniak_a_h on Sat 11 Apr, 2020 12:53, edited 2 times in total.
Shmuel
Posts: 6167
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 330 times

Глюки и баги, появившиеся в «ночных сборках»

Post by Shmuel »

buniak_a_h wrote: Sat 11 Apr, 2020 12:44 Что-нить ещё надо для исправления?
Ради интереса - ваш файл CodePage.lua.
buniak_a_h
Posts: 2126
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 131 times
Been thanked: 211 times
Contact:

Глюки и баги, появившиеся в «ночных сборках»

Post by buniak_a_h »

Shmuel wrote: Sat 11 Apr, 2020 12:54
buniak_a_h wrote: Sat 11 Apr, 2020 12:44 Что-нить ещё надо для исправления?
Ради интереса - ваш файл CodePage.lua.
  1. local BaxUtils = require"BAX.BaxUtils"
  2. --local TabUtils = require"BAX.TabUtils"
  3. local F=far.Flags
  4. local tin=table.insert
  5. local Info = package.loaded.regscript or function(...) return ... end
  6. local CodePage_Setup
  7. local nfo = Info {_filename or ...,
  8.   name        = "CodePage";
  9.   description = "Устанавливает кодовую страницу при открытии редактора и просмотровщика в зависимости от расширения файла";
  10.   version     = "1.1.5"; --http://semver.org/lang/ru/
  11.   author      = "BAX";
  12.   url         = "";
  13.   id          = "6409EA25-AA64-4749-9E30-BB4E9A936DD7";
  14.   --parent_id   = "";
  15.   --minfarversion = {3,0,0,4744,0};
  16.   --files       = "*.cfg;*.ru.lng";
  17.   --config      = function()  end
  18.   --help        = function(nfo,name) end;
  19.   --execute     = function(nfo,name) end;
  20.  
  21.   --disabled    = false;
  22.   --options     = {};
  23. }
  24. if not nfo then return end
  25. -----------------------------------------------------------------------------
  26. local CpList={}
  27.  
  28. local DialogItem=BaxUtils.DialogItem
  29. local SetingKey={Author='BAX'; Key='Codepages'}
  30. local Settings0 =
  31.       {
  32.        {Mask="*.lua,*.fml,*.fmlua,*.lua.*,*.fb2"; Editor=true; Viewer=true; OnlyNew=false; Cp=65001};
  33.        {Mask="*.bat,*.cmd,*.prg,*.ch"; Editor=true; Viewer=true; OnlyNew=true; Cp=866};
  34.       }
  35. local Settings = mf.mload(SetingKey.Author, SetingKey.Key) or Settings0
  36. CodePage_Setup = function ()
  37.   -- Составляю список доступных кодировок
  38.   if not next(CpList) then
  39.     CpList={}
  40.     local cpl, maxl=win.EnumSystemCodePages(), 0
  41.     table.sort(cpl, function(a1,a2) maxl = math.max(maxl, a1:len(), a2:len()); return tonumber(a1) <= tonumber(a2) end)
  42.     local formatStr=('%%-%ds │ %%s'):format(maxl)
  43.     for _,v in ipairs(cpl) do
  44.       tin(CpList, {Text=formatStr:format(v, (win.GetCPInfo(tonumber(v)) or {CodePageName=(' '):rep(6)..'<Page='..v..'>'}).CodePageName:sub(7)); Source=v})
  45.     end
  46.   end
  47.   ------------------
  48.   local DlgItems, y={}, 1
  49.   local function Add(Arg) tin(DlgItems, DialogItem(Arg)) end
  50.   local function AddP(Arg) Add(Arg); y=y+1 end
  51.   local w=math.floor(math.min(200, Far.Width*0.8))
  52.   local wList = math.min(math.floor((w-5)/2),50)
  53.   local aPos={}
  54.   Add{"DI_DOUBLEBOX",0,0,w-1,0,Text="Установка кодовой страницы - настройка"}
  55.   y = y + 1
  56.   local List={}
  57.   for _,v in ipairs(Settings) do
  58.    tin(List, {Text=v.Mask})
  59.   end
  60.   Add{"DI_DOUBLEBOX", 2,y,wList+1,y+5, Flags="", Text=" &1. Маски файлов "}
  61.   Add{"DI_LISTBOX", 3,y+1,wList,y+4, Flags="DIF_LISTNOBOX", List=List}; aPos.List=#DlgItems
  62.   Add{"DI_BUTTON",3,y+6,Flags="DIF_BTNNOCLOSE|DIF_NOBRACKETS", Text="Add"}; aPos.Add=#DlgItems
  63.   Add{"DI_BUTTON",7,y+6,Flags="DIF_BTNNOCLOSE|DIF_NOBRACKETS", Text="Del"}; aPos.Del=#DlgItems
  64.   Add{"DI_BUTTON",11,y+6,Flags="DIF_BTNNOCLOSE|DIF_NOBRACKETS", Text="F4"}; aPos.F4=#DlgItems
  65.   AddP{"DI_SINGLEBOX",wList+3,y,w-2,y+6; Text="&2. Кодовая страница"}
  66.   AddP{"DI_COMBOBOX", wList+5, y,w-4, Flags="DIF_SELECTONENTRY", List=CpList}; aPos.Cp=#DlgItems
  67.   AddP{"DI_CHECKBOX", wList+5, y,w-4, Text="Добавить BOM"}; aPos.BOM=#DlgItems
  68.   --AddP{"DI_TEXT",math.floor(wList+(w-wList-15)/2),y,-1,y,Text="Использовать в:"}
  69.   AddP{"DI_TEXT",wList+9,y,-1,y,Text="Использовать в:"}
  70.   do
  71.   local txt1,txt2='редакторе','(только в новом)'
  72.   local x1=wList+5
  73.   local x2 = x1 + txt1:len() + 5
  74.   Add{"DI_CHECKBOX",x1,y,txt1:len(),y,Text=txt1}; aPos.Editor=#DlgItems
  75.   AddP{"DI_CHECKBOX",x2,y,x2,y,Text=txt2}; aPos.OnlyNew=#DlgItems
  76.   end
  77.   do
  78.   local txt="вьюере"
  79.   local x1=(wList+5) -- + math.ceil((w-txt:len()-4)/2+0.5)
  80.   Add{"DI_CHECKBOX",x1,y,x1+txt:len()+5,y,Flags="DIF_CENTERTEXT",Text=txt}; aPos.Viewer=#DlgItems
  81.   end
  82.   y = y + 3
  83.   Add{"DI_BUTTON",-1,y,-1,y,Flags="DIF_CENTERGROUP|DIF_DEFAULTBUTTON",Text="Ok"}; aPos.Ok = #DlgItems
  84.   Add{"DI_BUTTON",-1,y,-1,y,Flags="DIF_CENTERGROUP",Text="Cancel"}
  85.   local h = y + 2
  86.   do
  87.   local first=DlgItems[1]
  88.   first.y2=h-1
  89.   DlgItems[1] = DialogItem(first)
  90.   end
  91.   local LastPos={TopPos=1, SelectPos=1}
  92.   local function DlgProc(hDlg, Msg, Param1, Param2)
  93.     local function Save(iPos)
  94.       local Setting1 = Settings[iPos]
  95.       if Setting1 then
  96.         local _Cp=hDlg:send("DM_GETTEXT", aPos.Cp)
  97.         if tonumber(_Cp) then
  98.          Setting1.Cp = tonumber(_Cp)
  99.         end
  100.         Setting1.Editor = hDlg:send("DM_GETCHECK", aPos.Editor)==1
  101.         Setting1.BOM    = hDlg:send("DM_GETCHECK", aPos.BOM)==1
  102.         Setting1.OnlyNew = hDlg:send("DM_GETCHECK", aPos.OnlyNew)==1
  103.         Setting1.Viewer = hDlg:send("DM_GETCHECK", aPos.Viewer)==1
  104.       end
  105.     end
  106.     local bCont, bFirst=true, false
  107.     while bCont do
  108.       bCont = false
  109.       if Msg == F.DN_INITDIALOG then
  110.         hDlg:send(F.DM_LISTGETCURPOS, aPos.List, {SelectPos=1})
  111.         Msg = F.DN_LISTCHANGE
  112.         Param1 = aPos.List
  113.         Param2 = 1
  114.         bCont = true
  115.         bFirst = true
  116.       elseif Msg == F.DN_LISTCHANGE then
  117.         if not bFirst then
  118.           local iPos=hDlg:send("DM_LISTGETCURPOS", aPos.List).SelectPos
  119.           Save(iPos)
  120.         end
  121.         bFirst = false
  122.         local Setting1 = Settings[Param2]
  123.         if Setting1 then
  124.           hDlg:send("DM_SETTEXT", aPos.Cp, Setting1.Cp)
  125.           hDlg:send("DM_SETCHECK", aPos.BOM, Setting1.BOM and 1 or 0)
  126.           hDlg:send("DM_SETCHECK", aPos.Editor, Setting1.Editor and 1 or 0)
  127.           hDlg:send("DM_SETCHECK", aPos.OnlyNew, Setting1.OnlyNew and 1 or 0)
  128.           hDlg:send("DM_ENABLE", aPos.OnlyNew, Setting1.Editor and 1 or 0)
  129.           hDlg:send("DM_SETCHECK", aPos.Viewer, Setting1.Viewer and 1 or 0)
  130.         else
  131.           hDlg:send("DM_SETTEXT", aPos.Cp, '')
  132.           hDlg:send("DM_SETCHECK", aPos.BOM, 0)
  133.           hDlg:send("DM_SETCHECK", aPos.Editor, 1 )
  134.           hDlg:send("DM_SETCHECK", aPos.OnlyNew, 0)
  135.           hDlg:send("DM_ENABLE", aPos.OnlyNew, 1)
  136.           hDlg:send("DM_SETCHECK", aPos.Viewer, 1)
  137.         end
  138.       elseif (Msg == F.DN_EDITCHANGE and Param1 == aPos.Cp) or
  139.              (Msg == F.DN_DROPDOWNOPENED and Param1 == aPos.Cp and Param2 == 0) then
  140.        local _Cp=hDlg:send("DM_GETTEXT", aPos.Cp)
  141.        local _Cpm=_Cp:match('%d*')
  142.        if _Cpm then
  143.          hDlg:send("DM_SETTEXT", aPos.Cp, _Cpm)
  144.        end
  145.       elseif Msg == F.DN_BTNCLICK then
  146.         if Param1 == aPos.Add then
  147.           local Mask=far.InputBox('', 'Добавление группы', 'Введите маску файлов')
  148.           if Mask then
  149.             Save((hDlg:send("DM_LISTGETCURPOS", aPos.List)).SelectPos)
  150.             tin(Settings,{Mask=Mask; Editor=true; Viewer=true, OnlyNew=false, Cp=''; BOM=false})
  151.             hDlg:send("DM_LISTADDSTR", aPos.List, Mask)
  152.             hDlg:send("DM_LISTSETCURPOS", aPos.List, {SelectPos=#Settings})
  153.             hDlg:send("DM_SETFOCUS", aPos.Cp)
  154.           end
  155.         elseif Param1 == aPos.Del then
  156.           local iPos=hDlg:send("DM_LISTGETCURPOS", aPos.List).SelectPos
  157.           if Settings[iPos].Deleted then
  158.             if far.Message("Восстановить настройку?", '', ';YesNo', 'w') == 1 then
  159.               Settings[iPos].Deleted = false
  160.               local CurrItem=hDlg:send("DM_LISTGETITEM", aPos.List, iPos)
  161.               CurrItem.Index=iPos
  162.               CurrItem.Flags=F.LIF_NONE
  163.               hDlg:send("DM_LISTUPDATE", aPos.List, CurrItem)
  164.               LastPos.SelectPos = iPos
  165.               hDlg:send("DM_LISTSETCURPOS",aPos.List, {SelectPos=iPos+1})
  166.             end
  167.           else
  168.             if far.Message("Удалить настройку?", '', ';YesNo', 'w') == 1 then
  169.               Settings[iPos].Deleted = true
  170.               local CurrItem=hDlg:send("DM_LISTGETITEM", aPos.List, iPos)
  171.               CurrItem.Index=iPos
  172.               CurrItem.Flags=F.LIF_GRAYED
  173.               hDlg:send("DM_LISTUPDATE", aPos.List, CurrItem)
  174.               hDlg:send("DM_LISTSETCURPOS",aPos.List, {SelectPos=iPos+1})
  175.               LastPos = hDlg:send("DM_LISTGETCURPOS",aPos.List)
  176.             end
  177.           end
  178.         elseif Param1 == aPos.F4 then
  179.           local Mask=far.InputBox('', 'Редактирование группы', 'Введите маску файлов', nil, Settings[(hDlg:send("DM_LISTGETCURPOS", aPos.List)).SelectPos].Mask)
  180.           if Mask then
  181.             local iPos=hDlg:send("DM_LISTGETCURPOS", aPos.List).SelectPos
  182.             Settings[iPos].Mask=Mask
  183.             hDlg:send("DM_SETTEXT", aPos.List, Mask)
  184.           end
  185.         end
  186.       elseif Msg == F.DN_CONTROLINPUT and
  187.              Param2.EventType == F.KEY_EVENT then
  188.         local Key=far.InputRecordToName(Param2)
  189.         if Param1 == aPos.List then
  190.           if Key == 'Ins' then
  191.            Msg = F.DN_BTNCLICK
  192.            Param1 = aPos.Add
  193.            bCont = true
  194.           elseif Key == 'Del' then
  195.            Msg = F.DN_BTNCLICK
  196.            Param1 = aPos.Del
  197.            bCont = true
  198.           elseif Key == 'F4' then
  199.            Msg = F.DN_BTNCLICK
  200.            Param1 = aPos.F4
  201.            bCont = true
  202.           elseif Key == 'Alt2' then
  203.             hDlg:send("DM_SETFOCUS", aPos.Cp)
  204.           end
  205.         elseif Key == 'Alt1' then
  206.           hDlg:send("DM_SETFOCUS", aPos.List)
  207.         end
  208.       elseif Msg == F.DN_KILLFOCUS and Param1 == aPos.List then
  209.         LastPos = hDlg:send("DM_LISTGETCURPOS", Param1)
  210.       elseif Msg == F.DN_GOTFOCUS and Param1 == aPos.List then
  211.         hDlg:send("DM_LISTSETCURPOS", aPos.List, LastPos)
  212.       elseif Msg == F.DN_CLOSE then
  213.        Save((hDlg:send("DM_LISTGETCURPOS", aPos.List)).SelectPos)
  214.       end -- case Msg
  215.     end -- while bCont
  216.   end -- DlgProc
  217.   if far.Dialog(win.Uuid"5A39EBF9-4F29-49F2-902D-80F32110773E", -1,-1,w,h,nil,DlgItems,F.FDLG_SMALLDIALOG,DlgProc) == aPos.Ok then
  218.     for i=#Settings,1,-1 do
  219.       if Settings[i].Deleted then
  220.         table.remove(Settings, i)
  221.       end
  222.     end
  223.     mf.msave(SetingKey.Author, SetingKey.Key, Settings)
  224.     --far.Message"Внимание!\n\2\nИзменения вступят в силу после перезагрузки макросов!"
  225.   else
  226.    Settings = mf.mload(SetingKey.Author, SetingKey.Key) or Settings0
  227.   end
  228. end -- CodePage_Setup
  229. -----------------------------------------------------------------------------
  230. local function PostMacroStr(cp)
  231.  local NeedTab = not (Area.Viewer or Area.QView)
  232.  if NeedTab then Keys"Tab" end
  233.  Keys("ShiftF8")
  234.  if Menu.Select(cp,1) > 0 then Keys("Enter") else Keys("Esc") end
  235.  if NeedTab then Keys"Tab" end
  236. end -- PostMacroStr
  237. -----------------------------------------------------------------------------
  238.  
  239. for _,v in ipairs(Settings) do
  240.   if v.Editor then
  241.     local EventArg =
  242.       {
  243.         description="Set " .. v.Cp .. ' codepage for ' .. v.Mask;
  244.         group="EditorEvent";
  245.         filemask=v.Mask;
  246.         action = function(_, Event)
  247.           if Event == F.EE_READ then
  248.             editor.SetParam(nil, F.ESPT_CODEPAGE, v.Cp)
  249.             editor.SetParam(nil, F.ESPT_SETBOM, v.BOM)
  250.             -- Прибамбас специально для BAX - начало {
  251.             if Editor.FileName:sub(-4):lower()=='.lua' and
  252.                not _G.BAX and
  253.                mf.fexist(win.GetEnv("FARPROFILE") .. [[\Macros\scripts\Bax\Languages\LuaComplete.lua]]) and
  254.                mf.fexist(win.GetEnv("FARPROFILE") .. [[\Macros\modules\BAX\init.lua]]) then
  255.                require"BAX"
  256.             end
  257.             -- Прибамбас специально для BAX - конец }
  258.           end
  259.         end
  260.       }
  261.     if v.OnlyNew then
  262.      EventArg.condition =
  263.       function(_,Event)
  264.         return Event == F.EE_READ and band(Editor.State,1) == 1
  265.       end
  266.     end
  267.     Event(EventArg)
  268.   end -- if v.Editor
  269.   if v.Viewer then
  270.     Event {
  271.       description="Set " .. v.Cp .. " codepage for View " .. v.Mask;
  272.       group="ViewerEvent";
  273.       filemask=v.Mask;
  274.       action=function(Id,Event,Param)
  275.         if Event == far.Flags.VE_READ then
  276.           --far.MacroPost(PostMacroStr(v.Cp))
  277.           mf.postmacro(PostMacroStr, v.Cp)
  278.         end
  279.       end;
  280.     }
  281.   end -- if v.Viewer
  282. end
  283.  
  284. if math.pi > 0 then nfo.config = CodePage_Setup; end -- Всё равно не работает
  285. Macro{
  286.   id=win.Uuid"1467FA0A-CE28-4346-9327-019FC07C42CD";
  287.   area="Shell";
  288.   key="CtrlShiftB-C";
  289.   description="Настройка кодовых страниц";
  290. --  filemask="";
  291.   flags=""; -- DisableOutput RunAfterFARStart EmptyCommandLine NotEmptyCommandLine NoFilePanels NoFilePPanels NoPluginPanels NoPluginPPanels NoFolders NoPFolders NoFiles NoPFiles Selection PSelection NoSelection NoPSelection EVSelection NoEVSelection NoSendKeysToPlugins
  292. --  priority=50;
  293. --  sortpriority=50;
  294. --  condition=function(key) return true end;
  295.   action=CodePage_Setup;
  296. }
  297. --]===]
CodePage.lua.7z
(3.87 KiB) Downloaded 15 times
Shmuel
Posts: 6167
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 330 times

Глюки и баги, появившиеся в «ночных сборках»

Post by Shmuel »

buniak_a_h wrote: Sat 11 Apr, 2020 13:01 CodePage.lua.7z
Уберите win.Uuid со строчки 286.
buniak_a_h
Posts: 2126
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 131 times
Been thanked: 211 times
Contact:

Глюки и баги, появившиеся в «ночных сборках»

Post by buniak_a_h »

Shmuel wrote: Sat 11 Apr, 2020 12:54
buniak_a_h wrote: Sat 11 Apr, 2020 12:44 Что-нить ещё надо для исправления?
Ради интереса - ваш файл CodePage.lua.
Убрал этот файл -
Shmuel wrote: Sat 11 Apr, 2020 13:23
buniak_a_h wrote: Sat 11 Apr, 2020 13:01 CodePage.lua.7z
Уберите win.Uuid со строчки 286.
Уже - не помогло. См. выше.
Shmuel
Posts: 6167
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 330 times

Глюки и баги, появившиеся в «ночных сборках»

Post by Shmuel »

buniak_a_h wrote: Sat 11 Apr, 2020 13:25
Shmuel wrote: Sat 11 Apr, 2020 13:23 Уберите win.Uuid со строчки 286.
Уже - не помогло. См. выше.
Я нашёл вам один баг. Следующие ищите сами.
buniak_a_h
Posts: 2126
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 131 times
Been thanked: 211 times
Contact:

Глюки и баги, появившиеся в «ночных сборках»

Post by buniak_a_h »

Shmuel wrote: Sat 11 Apr, 2020 13:28 Я нашёл вам один баг. Следующие ищите сами.
Я вообще убрал "спорный" файл - не помогло. При чём тут я? Это был не баг. Ну, или баг, не имеющий принципиального значения.
Ладно. Чувствую, надо на Stand Alone варианте добавлять скрипты, пока не вылезет … Я надеялся, тот, кто внёс изменения, легко найдёт причину. Грустно…
User avatar
Smitis
Posts: 1639
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 20 times
Been thanked: 41 times

Глюки и баги, появившиеся в «ночных сборках»

Post by Smitis »

Shmuel, Тоже получаю вылет "invalid UTF-8 code" в своём модуле DialogClass, на вызове метода match. Пока никак не могу минимизировать проблему.
Разум когда-нибудь победит.
buniak_a_h
Posts: 2126
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 131 times
Been thanked: 211 times
Contact:

Глюки и баги, появившиеся в «ночных сборках»

Post by buniak_a_h »

Smitis, спасибо. А то как-то неучем себя чувствуешь … :-(
Shmuel
Posts: 6167
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 330 times

Глюки и баги, появившиеся в «ночных сборках»

Post by Shmuel »

Господа, ну вы же взрослые. Ваш код на ваших машинах, неужели я должен искать ваши проблемы дистанционно?
Да, обновилась библиотека luautf8, очевидно новая версия более тщательно проверяет строки на валидность UTF-8.
User avatar
Smitis
Posts: 1639
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 20 times
Been thanked: 41 times

Глюки и баги, появившиеся в «ночных сборках»

Post by Smitis »

Shmuel,
Shmuel wrote: Sat 11 Apr, 2020 13:48 Ваш код на ваших машинах, неужели я должен искать ваши проблемы дистанционно?
Нет, конечно. Я пытался вычленить проблему и написать минимальный тестовый скрипт. Пока не получилось. Вот полная версия. DialogClass.lua помещается в modules. Макросы из DescriptionEdit.lua заменяют CtrlZ.
Attachments
DescriptionEdit.7z
(8.1 KiB) Downloaded 13 times
Разум когда-нибудь победит.
Shmuel
Posts: 6167
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 330 times

Глюки и баги, появившиеся в «ночных сборках»

Post by Shmuel »

Smitis, ну это та же самая проблема, что выше была указана. Вызывается self.Guid:match() в ситуации, когда self.Guid не является валидной UTF-8 строкой.

P.S. В данном конкретном случае можно вызывать string.match(self.Guid, ...)
Last edited by Shmuel on Sat 11 Apr, 2020 14:11, edited 1 time in total.
User avatar
Smitis
Posts: 1639
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 20 times
Been thanked: 41 times

Глюки и баги, появившиеся в «ночных сборках»

Post by Smitis »

Shmuel wrote: Sat 11 Apr, 2020 14:00 self.Guid не является валидной UTF-8 строкой.
type(self.Guid) показывает тип string
Разум когда-нибудь победит.
Shmuel
Posts: 6167
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 330 times

Глюки и баги, появившиеся в «ночных сборках»

Post by Shmuel »

Smitis wrote: Sat 11 Apr, 2020 14:15 type(self.Guid) показывает тип string
Не каждый стринг являетя валидным UTF-8. Я отредактировал своё сообщение выше, привёл способ починить данный случай.
User avatar
Smitis
Posts: 1639
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 20 times
Been thanked: 41 times

Глюки и баги, появившиеся в «ночных сборках»

Post by Smitis »

Shmuel,
Да, спасибо, string.match работает. Вызывает беспокойство, что теперь обычная строка так вот запросто может перестать быть валидной...
Разум когда-нибудь победит.
Post Reply

Return to “Обсуждение макросов”