ПУСТО

пятница, 12 июня 2015 г.

Функции escape() и unescape() аналоги функциям javascript

Тут собственно ничего оригинального две функции escape() и unescape() аналоги функциям javascript. Кстати, онлайн сервис тут.

В начале пара функций, с поддержкой русских символов (кодировка windows-1251)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include "escape.h"
#include <stdio.h>
 
char STR_acHexChar[]="0123456789ABCDEF";
unsigned long STR_HEX(char * pS, int d)
{
  int iTmp;
  unsigned long ulEx=0;
  while ((d) && (pS[0]))
  {  
   for (iTmp=0;((STR_acHexChar[iTmp]!=pS[0]) && (iTmp<16));iTmp++);
   ulEx<<=4;
   ulEx|=iTmp;pS++;d--;
  
  return ulEx;
}
 
 
void escape(char * pVal, const char * pSrc)
{
  while (*pSrc)
  {
   if ((*pSrc<'*') || (*pSrc==',') || ((*pSrc>'9') && (*pSrc<'@')) || ((*pSrc>'Z') && (*pSrc<'a')) || (*pSrc>'z'))
   { // Кодировать
     unsigned char ch;
     *pVal='%';pVal++;
     ch=(unsigned char)(*pSrc);
     if (ch>=192)
     { // Для русских символов кодировка должна быть в UNICODE
       sprintf(pVal,"u04%2.2X",(unsigned char)ch-176);pVal+=5;      
     } else
     if (ch==168)
     {
      strcpy(pVal,"u0401");pVal+=5;
     } else
     if (ch==184)
     {
      strcpy(pVal,"u0451");pVal+=5;
     } else
     {
       sprintf(pVal,"%2.2X",ch);pVal+=2;
     }
   } else
   {
     *pVal=*pSrc;pVal++;
   }
   pSrc++;
  }
  *pVal=0;
}
 
void unescape(char * pVal, const char * pSrc)
{
  while (*pSrc)
  {
   if (*pSrc=='%')
   { // Раскодировать
     int iTmp;
     pSrc++; 
  if (*pSrc=='u')
  { // Это unicode
    unsigned char ucTmp;
    pSrc++;
    if ((pSrc[0]=='0') && (pSrc[1]=='4'))
    {
     pSrc+=2;
     ucTmp=(unsigned char)STR_HEX(pSrc,2);pSrc++;
             if ((ucTmp>=0x10) && (ucTmp<=0x4F)) ucTmp+=176;
     else if (ucTmp==0x01) ucTmp=168;
     else if (ucTmp==0x51) ucTmp=184;
     else ucTmp='?';
    } else {pSrc+=3;ucTmp='?';}
    *pVal=ucTmp;
  } else
  {
          *pVal=(unsigned char)STR_HEX(pSrc,2);pSrc++;
  }
   } else
   {
     *pVal=*pSrc;
   }
   pSrc++;pVal++;
  }
  *pVal=0;
}
Те же функции, но без поддержки русских символов
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include "escape.h"
#include <stdio.h>
 
char STR_acHexChar[]="0123456789ABCDEF";
unsigned long STR_HEX(char * pS, int d)
{
  int iTmp;
  unsigned long ulEx=0;
  while ((d) && (pS[0]))
  {  
   for (iTmp=0;((STR_acHexChar[iTmp]!=pS[0]) && (iTmp<16));iTmp++);
   ulEx<<=4;
   ulEx|=iTmp;pS++;d--;
  
  return ulEx;
}
 
void escape(char * pVal, const char * pSrc)
{
  while (*pSrc)
  {
   if ((*pSrc<'*') || (*pSrc==',') || ((*pSrc>'9') && (*pSrc<'@')) || ((*pSrc>'Z') && (*pSrc<'a')) || (*pSrc>'z'))
   { // Кодировать
     *pVal='%';pVal++;sprintf(pVal,"%2.2X",(unsigned char)*pSrc);pVal+=2;
   } else
   {
     *pVal=*pSrc;pVal++;
   }
   pSrc++;
  }
  *pVal=0;
}
 
void unescape(char * pVal, const char * pSrc)
{
  while (*pSrc)
  {
   if (*pSrc=='%')
   { // Раскодировать
     int iTmp;
     pSrc++; 
     *pVal=(unsigned char)STR_HEX(pSrc,2);pSrc++;
   } else
   {
     *pVal=*pSrc;
   }
   pSrc++;pVal++;
  }
  *pVal=0;
}
Как то так

Комментариев нет:

Отправить комментарий