Перекодировка
Добавлено: 13 Октябрь 2015, 7:22
Подскажите, есть процедуры для перекодировки такой строки "\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442" в ANSI
Место общения программистов, форум разработчиков БД на Clarion
https://forum.clarionlife.net/
Нужен пример строки с переводом символов и т.д., т.к. с ходу непонятно о чем речь.PavelNK писал(а): Хотелось бы иметь полноценную проверенную рабочую процедуру, т.к. в строке, кроме букв, могут присутствовать служебные и управляющие символы, например ВК или ПС и т.д.. Но я, к сожалению, впервые сталкиваюсь с этим, поэтому могу не знать каких-то нюансов и особенностей. А вдруг у кого-нибудь есть уже готовая процедура.
Код: Выделить всё
/u0441 - с
/u0442 - т
/u0430 - а
/u043d - н
/u0434 - д
/u0430 - а
/u0440 - р
/u0442 - т
Код: Выделить всё
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
Кому делать нечего - напишите SSL на сокетах в Кларе, очень нужно для работы почты, прям очень-очень
Код: Выделить всё
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)