Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

MyDC.ru _ DC-клиенты _ Не могу разобраться с кодировкой в скрипте

Автор: a97873 5.3.2010, 16:53

Грей 0.17
Суть скрипта: По рзелульаттам илссеовадний одонго анлигйсокго унвиертисета,не иеемт занчнеия, в кокам пряокде рсапожолена бкувы в солве. Галвоне, чотбы преавя и пслоендяя бквуы блыи на мсете. Осатьлыне бкувы мгоут селдовтаь в плоонм бсепордяке, все-рвано ткест чтаитсея без побрелм. Пичрионй эгото ялвятеся то, что мы не чиатем кдаужю бкуву по отдльенотси, а все солво цликеом.
Проблема: не получается оседлать русскую кодировку о0

Код
dcpp = {}

math.randomseed(os.time())

function dcpp.PreviewPublicMessage(sHubUrl, sMsg)
  local sArg = sMsg:match"^/t(.*)"
  if sArg then sArg = sArg:match"%s+(.*)"
     if sArg then

    DC():SendPublicMessage(sHubUrl,sArg)
    DC():SendPublicMessage(sHubUrl,mag(sArg))


     return 1
     end
  end
  return nil
end


function tblr(t)
  local n = #t
  while n > 1 do
    local k = math.random(n)
    t[n], t[k] = t[k], t[n]
    n = n - 1
  end

  return t
end


function mag(ma)
  local mai,str,hj={},'',#ma-2
  if hj<2 then return ma end
  local h,j,k=ma:sub(1,1),ma:sub(-1),ma:sub(2,-2)

  for i=1, hj+1 do  mai[i]=k:sub(i,i) end
  mai=tblr(mai)
   for i=1, hj+1 do

    str=str..mai[i]

   end



  return h..str..j
end

Автор: Setuper 5.3.2010, 17:43

Грей использует кодировку utf8, в которой русские буквы занимают по 2 байта, поэтому нельзя перемешивать байты одной буквы, ибо получится совершенно другой символ. Выход есть. Нужно из utf8 перейти в кодировку cp1251 и работать уже в ней (в ней русские буквы занимают по 1 байту).

В грее есть функции DC():FromUtf8(str) и DC():ToUtf8(str). Воспользуйся ими для перевода сначала в cp1251, а после всех операций обратно в utf8.

Автор: a97873 5.3.2010, 17:53

Спасибо! =) Странно... вроде уже побывал так, но криво =) А после тебя все нормуль =)