Тут собственно ничего оригинального две функции escape() и unescape() аналоги функциям javascript. Кстати, онлайн сервис тут.
В начале пара функций, с поддержкой русских символов (кодировка windows-1251)
Те же функции, но без поддержки русских символов
Как то так
В начале пара функций, с поддержкой русских символов (кодировка 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; } |
Комментариев нет:
Отправить комментарий