Страница 1 из 2

Перекодировка

Добавлено: 13 Октябрь 2015, 7:22
PavelNK
Подскажите, есть процедуры для перекодировки такой строки "\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442" в ANSI

Перекодировка

Добавлено: 13 Октябрь 2015, 9:25
Игорь Столяров
А в чем проблема в цикле прокрутить строку, распарсить на коды символов и перекодировать строку кодов в ANSI ?
Работы - на час. Если есть потребность - просто надо сделать и все. Или я что-то не понял в глубине постановки задачи ?

Перекодировка

Добавлено: 13 Октябрь 2015, 9:41
PavelNK
Хотелось бы иметь полноценную проверенную рабочую процедуру, т.к. в строке, кроме букв, могут присутствовать служебные и управляющие символы, например ВК или ПС и т.д.. Но я, к сожалению, впервые сталкиваюсь с этим, поэтому могу не знать каких-то нюансов и особенностей. А вдруг у кого-нибудь есть уже готовая процедура.

Перекодировка

Добавлено: 13 Октябрь 2015, 9:45
Игорь Столяров
Вы рассуждаете как программист на Clarion ! :idied:
Ну, подождите. Может быть действительно кто-то решал такую задачу или есть шаблон ....

Перекодировка

Добавлено: 13 Октябрь 2015, 10:46
Admin
В Clarion 10 есть класс JSONDataClass
По моему он должен этим заниматься судя по http://stackoverflow.com/questions/9713 ... caped-text
На php в пару строк кстати декодится.

Перекодировка

Добавлено: 23 Октябрь 2015, 15:03
Admin
PavelNK писал(а): Хотелось бы иметь полноценную проверенную рабочую процедуру, т.к. в строке, кроме букв, могут присутствовать служебные и управляющие символы, например ВК или ПС и т.д.. Но я, к сожалению, впервые сталкиваюсь с этим, поэтому могу не знать каких-то нюансов и особенностей. А вдруг у кого-нибудь есть уже готовая процедура.
Нужен пример строки с переводом символов и т.д., т.к. с ходу непонятно о чем речь.
Вообще эта строка просто слово "стандарт" в юникоде.

Код: Выделить всё

/u0441 - с
/u0442 - т
/u0430 - а
/u043d - н
/u0434 - д
/u0430 - а
/u0440 - р
/u0442 - т
Как ее перевести в Windows-1251 - дело техники.
Прошу прощения за убогий текст. На коленке состряпал в меру ума :)

Код: Выделить всё

                    PROGRAM
                    MAP
                        module('API')
                            WideCharToMultiByte(long CodePage, long dwFlags, long lpWideCharStr, long cchWideChar,long lpMultiByteStr, long cbMultiByte, long lpDefaultChar,long lpUsedDefaultChar),long,pascal
                        end
                        StrHexToLong(STRING xHex),LONG
                    END
EncodedString       STRING('/u0441/u0442/u0430/u043d/u0434/u0430/u0440/u0442')
loc:unicode         STRING(2)
unicode_group       GROUP,OVER(loc:unicode)
unicode_character       USHORT
                    END
loc:cp1251          STRING(1)
result              CSTRING(1024)

    CODE
        LOOP
            Pos# = INSTRING('/u',EncodedString,1,Pos#+1)
            if Pos#
                unicode_group.unicode_character = StrHexToLong(SUB(EncodedString,Pos#+2,4))
                Err# = WideCharToMultiByte(1251, 0, ADDRESS(loc:unicode), 1, ADDRESS(loc:cp1251), SIZE(loc:cp1251), 0, 0)
                result = result & loc:cp1251
            end
        WHILE Pos#
        MESSAGE(result)
        
StrHexToLong                 PROCEDURE (STRING xHex)
Rtn                                 LONG(0)
Hex                                 STRING('0123456789ABCDEF')
H                                   STRING(1)
Multiplier                          LONG(0)
Value                               BYTE(0)
Len                                 BYTE(0)
Ndx                                 BYTE(0)
    CODE
        Len  = LEN(CLIP(xHex))
        xHex = UPPER(xHex)
        IF xHex[Len] = 'H' THEN
           xHex[Len] = ''
           Len -= 1
        END
        CLEAR(Multiplier)
        LOOP Ndx = Len TO 1 BY - 1
           H = xHex[Ndx]
           Value = INSTRING(H,Hex,1,1)
           IF Multiplier THEN
              Multiplier *= 16
           ELSE
              Multiplier = 1
           END
           Rtn += ((Value-1) * Multiplier)
        END
        RETURN Rtn

Перекодировка

Добавлено: 23 Октябрь 2015, 15:32
kreator
PavelNK молчит, ждёт нового релиза. Там будет функция ToUSTRING, в качестве аргумента в которую подставляется строка типа той, что у него.

Перекодировка

Добавлено: 23 Октябрь 2015, 15:53
Admin
Да не вопрос. Просто делать нечего было.

Перекодировка

Добавлено: 23 Октябрь 2015, 16:21
RaFaeL
Admin писал(а): Просто делать нечего было.
Кому делать нечего - напишите SSL на сокетах в Кларе, очень нужно для работы почты, прям очень-очень
Вот тут есть пример на С но к сожалению я на С никогда не писал даже Hello World и ничего не понимаю
Замучался я всем ставить stunnel. Исходники почтовой библиотеки, куда надо это добавить, я в одной из соседних тем выкладывал

Перекодировка

Добавлено: 23 Октябрь 2015, 17:25
Admin
RaFaeL писал(а): Кому делать нечего
Не на столько. :) Тяжелый код для меня + нужно в тему вникать хорошо.

Перекодировка

Добавлено: 23 Октябрь 2015, 20:27
PavelNK
Хочется иметь грамотно написанную функцию. Например, самописную функцию StrHexToLong правильней заменить на
strtol(*cstring,long,long),long,raw,name('_strtol')
Кроме того, есть еще и управляющие символы, например \n или \r. А в приведенной функции они не обрабатываются.
А вот сам код мне понравился = 5+.

Перекодировка

Добавлено: 28 Октябрь 2016, 15:03
RaFaeL
PavelNK,
Скажите, за год появилось что-то красивое и максимально отлаженное?
Тоже очень актуально!

Перекодировка

Добавлено: 28 Октябрь 2016, 15:34
PavelNK
Не видел, думаю нет. Пришлось впопыхах, быстро, криво и в лоб, писать самому. Взял какой-то пример с инета и переделал под клашу

Перекодировка

Добавлено: 28 Октябрь 2016, 15:47
RaFaeL
PavelNK, А можете скинуть что получилось?

Перекодировка

Добавлено: 28 Октябрь 2016, 16:03
PavelNK

Код: Выделить всё

DecodeStr            FUNCTION (string sIn)                 ! Declare Procedure
CP_ACP0   EQUATE (0)          ! CodePage Ansii

i         LONG
c         STRING(1)
c1        STRING(1)
c2        STRING(16)
c3        CSTRING(16)
c4        CSTRING(16)
sOut      &CSTRING
sBuf      &CSTRING
ul        ULONG

Blength   LONG
Slength   LONG
RetCode   LONG
  CODE                                                     ! Begin processed code
  i = 0
  Blength = len(clip(sIn)) + 100
  sOut &= NEW(CSTRING(Blength))
  clear(sOut)
  loop 1000000 times 
    i += 1
    if len(clip(sIn)) < i then break.
    c = sub(sIn,i,1)
    if c = '\'
      c1 = sub(sIn,i+1,1)
      case c1
      of 'b'
        sOut = sOut &'<08>'
      of 't'
        sOut = sOut &'<09>'
      of 'n'
        sOut = sOut &'<10>'
      of 'f'
        sOut = sOut &'<12>'
      of 'r'
        sOut = sOut &'<13>'
      of 'u'
        clear(c2)
        c3 = sub(sIn,i+4,2)
        ccc1# = strtol(c3,ccc2#,16)
        c2[1] = chr(ccc1#)
        c3 = sub(sIn,i+2,2)
        ccc1# = strtol(c3,ccc2#,16)
        c2[2] = chr(ccc1#)

        memset(c3,0,size(c3))
        memset(c4,0,size(c4))

        c4 = clip(c2)
        Blength = size(c4)
        Slength = size(c3)
        RetCode = WideCharToMultiByte (CP_ACP0, 0, address(c4), Blength, address(c3), Slength, 0, 0)
        sOut = sOut & clip(c3)

        i += 4
      else 
        sOut = sOut & clip(c1)
      end 
      i += 1
    else 
      sOut = sOut & c
    end 
  end 

  RETURN(sOut)