You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
3.9 KiB
133 lines
3.9 KiB
using System; |
|
using System.Text; |
|
|
|
namespace FairyGUI.Utils |
|
{ |
|
/// <summary> |
|
/// |
|
/// </summary> |
|
public class XMLUtils |
|
{ |
|
public static string DecodeString(string aSource) |
|
{ |
|
int len = aSource.Length; |
|
StringBuilder sb = new StringBuilder(); |
|
int pos1 = 0, pos2 = 0; |
|
|
|
while (true) |
|
{ |
|
pos2 = aSource.IndexOf('&', pos1); |
|
if (pos2 == -1) |
|
{ |
|
sb.Append(aSource.Substring(pos1)); |
|
break; |
|
} |
|
sb.Append(aSource.Substring(pos1, pos2 - pos1)); |
|
|
|
pos1 = pos2 + 1; |
|
pos2 = pos1; |
|
int end = Math.Min(len, pos2 + 10); |
|
for (; pos2 < end; pos2++) |
|
{ |
|
if (aSource[pos2] == ';') |
|
break; |
|
} |
|
if (pos2 < end && pos2 > pos1) |
|
{ |
|
string entity = aSource.Substring(pos1, pos2 - pos1); |
|
int u = 0; |
|
if (entity[0] == '#') |
|
{ |
|
if (entity.Length > 1) |
|
{ |
|
if (entity[1] == 'x') |
|
u = Convert.ToInt16(entity.Substring(2), 16); |
|
else |
|
u = Convert.ToInt16(entity.Substring(1)); |
|
sb.Append((char)u); |
|
pos1 = pos2 + 1; |
|
} |
|
else |
|
sb.Append('&'); |
|
} |
|
else |
|
{ |
|
switch (entity) |
|
{ |
|
case "amp": |
|
u = 38; |
|
break; |
|
|
|
case "apos": |
|
u = 39; |
|
break; |
|
|
|
case "gt": |
|
u = 62; |
|
break; |
|
|
|
case "lt": |
|
u = 60; |
|
break; |
|
|
|
case "nbsp": |
|
u = 32; |
|
break; |
|
|
|
case "quot": |
|
u = 34; |
|
break; |
|
} |
|
if (u > 0) |
|
{ |
|
sb.Append((char)u); |
|
pos1 = pos2 + 1; |
|
} |
|
else |
|
sb.Append('&'); |
|
} |
|
} |
|
else |
|
{ |
|
sb.Append('&'); |
|
} |
|
} |
|
|
|
return sb.ToString(); |
|
} |
|
|
|
private static string[] ESCAPES = new string[] { |
|
"&", "&", |
|
"<", "<", |
|
">", ">", |
|
|
|
"'", "'", |
|
"\"", """, |
|
"\t", "	", |
|
"\n", "
", |
|
"\r", "
" |
|
}; |
|
public static void EncodeString(StringBuilder sb, int start, bool isAttribute = false) |
|
{ |
|
int count; |
|
int len = isAttribute ? ESCAPES.Length : 6; |
|
for (int i = 0; i < len; i += 2) |
|
{ |
|
count = sb.Length - start; |
|
sb.Replace(ESCAPES[i], ESCAPES[i + 1], start, count); |
|
} |
|
} |
|
|
|
public static string EncodeString(string str, bool isAttribute = false) |
|
{ |
|
if (string.IsNullOrEmpty(str)) |
|
return ""; |
|
else |
|
{ |
|
StringBuilder sb = new StringBuilder(str); |
|
EncodeString(sb, 0); |
|
return sb.ToString(); |
|
} |
|
} |
|
} |
|
}
|
|
|