134 lines
3.9 KiB
C#
134 lines
3.9 KiB
C#
|
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();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|