Вот такой функ у меня получился
Код
stock String:httpURLencode(const String:URL[])
{
new String:s_encode[1024];
new bool:invalid = false;
for(new i = 0; i < strlen(URL); i++)
{
new Hex = (URL[i] & 0xFF);
switch (Hex)
{
case 0x21 : { invalid = true; }
case 0x22 : { invalid = true; }
case 0x23 : { invalid = true; }
case 0x24 : { invalid = true; }
case 0x25 : { invalid = true; }
case 0x26 : { invalid = true; }
case 0x27 : { invalid = true; }
case 0x2A : { invalid = true; }
case 0x2C : { invalid = true; }
case 0x3A : { invalid = true; }
case 0x3B : { invalid = true; }
case 0x3C : { invalid = true; }
case 0x3D : { invalid = true; }
case 0x3E : { invalid = true; }
case 0x3F : { invalid = true; }
case 0x5B : { invalid = true; }
case 0x5D : { invalid = true; }
case 0x60 : { invalid = true; }
case 0x7B : { invalid = true; }
case 0x7C : { invalid = true; }
case 0x7D : { invalid = true; }
case 0x20 : { invalid = true; }
}
Format(s_encode, sizeof(s_encode), ((0x1F < Hex < 0x7F) && !invalid) ? "%s%c" : "%s%%%X", s_encode, Hex);
invalid = false;
}
return s_encode;
}
Если можно что-то улучшить\упростить, пишите.
Добавлено (27.02.2014, 14:30:20)
---------------------------------------------
А теперь я отвечу на вопрос, как же получить юникод (мульти) байт 1040 из русской буквы А.
Код
stock toUnicodeByte(const String:Char[])
{
if(Char[0] == '\0') return -1;
new Byte = toByte(Char[0]);
if(Byte >= 128)
{
if(Byte >= 240)
{
// 4 byte sequence
if(strlen(Char) < 4) return -1;
Byte = (Byte % 8) * 262144 ;
Byte += (toByte(Char[1]) % 64) * 4096 ;
Byte += (toByte(Char[2]) % 64) * 64 ;
Byte += (toByte(Char[3]) % 64) ;
}
else if(Byte >= 224)
{
// 3 byte sequence
if(strlen(Char) < 3) return -1;
Byte = (Byte % 16) * 4096 ;
Byte += (toByte(Char[1]) % 64) * 64 ;
Byte += (toByte(Char[2]) % 64) ;
}
else if(Byte >= 192)
{
// 2 byte sequence
if(strlen(Char) < 2) return -1;
Byte = (Byte % 32) * 64 ;
Byte += (toByte(Char[1]) % 64) ;
}
else
{
// invalid sequence
Byte = -1;
}
}
return Byte;
}
Ну и наконец, как же получить обычный байт ?
Код
stock toByte(const String:Char[])
{
if(Char[0] == '\0') return -1;
return (Char[0] & 0xFF);
}
П.С. Сам спросил, сам ответил =_=Добавлено (12.03.2014, 16:32:52)
---------------------------------------------
небольшое упрощение функции httpURLencode
Код
stock String:httpURLencode(const String:URL[])
{
new String:s_encode[2048];
new bool:invalid = false;
for(new i = 0; i < strlen(URL); i++)
{
new Hex = (URL[i] & 0xFF);
switch (Hex)
{
case
0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x2A, 0x2C, 0x3A, 0x3B,
0x3C, 0x3D, 0x3E, 0x3F, 0x5B, 0x5D, 0x60, 0x7B, 0x7C, 0x7D, 0x20:
{ invalid = true; }
}
Format(s_encode, sizeof(s_encode), ((0x1F < Hex < 0x7F) && !invalid) ? "%s%c" : "%s%%%X", s_encode, Hex);
invalid = false;
}
return s_encode;
}