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

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
PavelNK
Старожил
Сообщения: 280
Зарегистрирован: 15 Март 2011, 8:02

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

Сообщение PavelNK »

Подскажите, есть процедуры для перекодировки такой строки "\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442" в ANSI
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8074
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 29 раз
Поблагодарили: 98 раз

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

Сообщение Игорь Столяров »

А в чем проблема в цикле прокрутить строку, распарсить на коды символов и перекодировать строку кодов в ANSI ?
Работы - на час. Если есть потребность - просто надо сделать и все. Или я что-то не понял в глубине постановки задачи ?
Make Clarion Great Again ! 😎
PavelNK
Старожил
Сообщения: 280
Зарегистрирован: 15 Март 2011, 8:02

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

Сообщение PavelNK »

Хотелось бы иметь полноценную проверенную рабочую процедуру, т.к. в строке, кроме букв, могут присутствовать служебные и управляющие символы, например ВК или ПС и т.д.. Но я, к сожалению, впервые сталкиваюсь с этим, поэтому могу не знать каких-то нюансов и особенностей. А вдруг у кого-нибудь есть уже готовая процедура.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8074
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 29 раз
Поблагодарили: 98 раз

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

Сообщение Игорь Столяров »

Вы рассуждаете как программист на Clarion ! :idied:
Ну, подождите. Может быть действительно кто-то решал такую задачу или есть шаблон ....
Make Clarion Great Again ! 😎
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

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

Сообщение Admin »

В Clarion 10 есть класс JSONDataClass
По моему он должен этим заниматься судя по http://stackoverflow.com/questions/9713 ... caped-text
На php в пару строк кстати декодится.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

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

Сообщение 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
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
kreator
✯ Ветеран ✯
Сообщения: 5174
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

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

Сообщение kreator »

PavelNK молчит, ждёт нового релиза. Там будет функция ToUSTRING, в качестве аргумента в которую подставляется строка типа той, что у него.
We are hard at work… for you. :)
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

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

Сообщение Admin »

Да не вопрос. Просто делать нечего было.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1412
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 12 раз
Поблагодарили: 2 раза
Контактная информация:

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

Сообщение RaFaeL »

Admin писал(а): Просто делать нечего было.
Кому делать нечего - напишите SSL на сокетах в Кларе, очень нужно для работы почты, прям очень-очень
Вот тут есть пример на С но к сожалению я на С никогда не писал даже Hello World и ничего не понимаю
Замучался я всем ставить stunnel. Исходники почтовой библиотеки, куда надо это добавить, я в одной из соседних тем выкладывал
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

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

Сообщение Admin »

RaFaeL писал(а): Кому делать нечего
Не на столько. :) Тяжелый код для меня + нужно в тему вникать хорошо.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
PavelNK
Старожил
Сообщения: 280
Зарегистрирован: 15 Март 2011, 8:02

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

Сообщение PavelNK »

Хочется иметь грамотно написанную функцию. Например, самописную функцию StrHexToLong правильней заменить на
strtol(*cstring,long,long),long,raw,name('_strtol')
Кроме того, есть еще и управляющие символы, например \n или \r. А в приведенной функции они не обрабатываются.
А вот сам код мне понравился = 5+.
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1412
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 12 раз
Поблагодарили: 2 раза
Контактная информация:

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

Сообщение RaFaeL »

PavelNK,
Скажите, за год появилось что-то красивое и максимально отлаженное?
Тоже очень актуально!
PavelNK
Старожил
Сообщения: 280
Зарегистрирован: 15 Март 2011, 8:02

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

Сообщение PavelNK »

Не видел, думаю нет. Пришлось впопыхах, быстро, криво и в лоб, писать самому. Взял какой-то пример с инета и переделал под клашу
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1412
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 12 раз
Поблагодарили: 2 раза
Контактная информация:

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

Сообщение RaFaeL »

PavelNK, А можете скинуть что получилось?
PavelNK
Старожил
Сообщения: 280
Зарегистрирован: 15 Март 2011, 8:02

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

Сообщение 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)
Ответить