C#实现JS脚本的escape()和unescape()
2007-12-29 09:49
246 查看
//在C#后台实现JavaScript的函数escape()的字符串转换
//些方法支持汉字
private string escape(string s)
{
StringBuilder sb = new StringBuilder();
byte[] byteArr = System.Text.Encoding.Unicode.GetBytes(s);
for (int i = 0; i < byteArr.Length; i += 2)
{
sb.Append("%u");
sb.Append(byteArr[i + 1].ToString("X2"));//把字节转换为十六进制的字符串表现形式
sb.Append(byteArr[i].ToString("X2"));
}
return sb.ToString();
}
//把JavaScript的escape()转换过去的字符串解释回来
//些方法支持汉字
private string unescape(string s)
{
string str = s.Remove(0, 2);//删除最前面两个"%u"
string[] strArr = str.Split(new string[]{"%u"}, StringSplitOptions.None);//以子字符串"%u"分隔
byte[] byteArr = new byte[strArr.Length * 2];
for (int i = 0,j=0; i < strArr.Length;i++,j+=2)
{
byteArr[j + 1] = Convert.ToByte(strArr[i].Substring(0,2), 16); //把十六进制形式的字串符串转换为二进制字节
byteArr[j ] = Convert.ToByte(strArr[i].Substring(2, 2), 16);
}
str = System.Text.Encoding.Unicode.GetString(byteArr); //把字节转为unicode编码
return str;
}
//在这顺便提一下String和StirngBuilder的区别
String 对象串联操作总是用现有字符串和新数据创建新的对象。StringBuilder 对象维护一个缓冲区,以便容纳新数据的串联。如果有足够的空间,新数据将被追加到缓冲区的末尾;否则,将分配一个新的、更大的缓冲区,原始缓冲区中的数据被复制到新的缓冲区,然后将新数据追加到新的缓冲区。
String 或 StringBuilder 对象的串联操作的性能取决于内存分配的发生频率。String 串联操作每次都分配内存,而 StringBuilder 串联操作仅当 StringBuilder 对象缓冲区太小而无法容纳新数据时才分配内存。因此,如果串联固定数量的 String 对象,则 String 类更适合串联操作。这种情况
下,编译器甚至会将各个串联操作组合到一个操作中。如果串联任意数量的字符串,则 StringBuilder 对象更适合串联操作;例如,某个循环对用户输入的任意数量的字符串进行串联。
//以下是不支持汉字的转换,摘自网络以作为参考。
public string Escape(string str)
{
if (str == null)
return String.Empty;
StringBuilder sb = new StringBuilder();
int len = str.Length;
for (int i = 0; i != len; i++)
{
char c = str[i];
//everything other than the optionally escaped chars _must_ be escaped
if (Char.IsLetterOrDigit(c) || c == '-' || c == '_' || c == '/' || c == '//' || c == '.')
sb.Append(c);
else
sb.Append(Uri.HexEscape(c));
}
return sb.ToString();
}
public string UnEscape(string str)
{
if (str == null)
return String.Empty;
StringBuilder sb = new StringBuilder();
int len = str.Length;
int i = 0;
while (i != len)
{
if (Uri.IsHexEncoding(str, i))
sb.Append(Uri.HexUnescape(str, ref i));
else
sb.Append(str[i++]);
}
return sb.ToString();
}
//些方法支持汉字
private string escape(string s)
{
StringBuilder sb = new StringBuilder();
byte[] byteArr = System.Text.Encoding.Unicode.GetBytes(s);
for (int i = 0; i < byteArr.Length; i += 2)
{
sb.Append("%u");
sb.Append(byteArr[i + 1].ToString("X2"));//把字节转换为十六进制的字符串表现形式
sb.Append(byteArr[i].ToString("X2"));
}
return sb.ToString();
}
//把JavaScript的escape()转换过去的字符串解释回来
//些方法支持汉字
private string unescape(string s)
{
string str = s.Remove(0, 2);//删除最前面两个"%u"
string[] strArr = str.Split(new string[]{"%u"}, StringSplitOptions.None);//以子字符串"%u"分隔
byte[] byteArr = new byte[strArr.Length * 2];
for (int i = 0,j=0; i < strArr.Length;i++,j+=2)
{
byteArr[j + 1] = Convert.ToByte(strArr[i].Substring(0,2), 16); //把十六进制形式的字串符串转换为二进制字节
byteArr[j ] = Convert.ToByte(strArr[i].Substring(2, 2), 16);
}
str = System.Text.Encoding.Unicode.GetString(byteArr); //把字节转为unicode编码
return str;
}
//在这顺便提一下String和StirngBuilder的区别
String 对象串联操作总是用现有字符串和新数据创建新的对象。StringBuilder 对象维护一个缓冲区,以便容纳新数据的串联。如果有足够的空间,新数据将被追加到缓冲区的末尾;否则,将分配一个新的、更大的缓冲区,原始缓冲区中的数据被复制到新的缓冲区,然后将新数据追加到新的缓冲区。
String 或 StringBuilder 对象的串联操作的性能取决于内存分配的发生频率。String 串联操作每次都分配内存,而 StringBuilder 串联操作仅当 StringBuilder 对象缓冲区太小而无法容纳新数据时才分配内存。因此,如果串联固定数量的 String 对象,则 String 类更适合串联操作。这种情况
下,编译器甚至会将各个串联操作组合到一个操作中。如果串联任意数量的字符串,则 StringBuilder 对象更适合串联操作;例如,某个循环对用户输入的任意数量的字符串进行串联。
//以下是不支持汉字的转换,摘自网络以作为参考。
public string Escape(string str)
{
if (str == null)
return String.Empty;
StringBuilder sb = new StringBuilder();
int len = str.Length;
for (int i = 0; i != len; i++)
{
char c = str[i];
//everything other than the optionally escaped chars _must_ be escaped
if (Char.IsLetterOrDigit(c) || c == '-' || c == '_' || c == '/' || c == '//' || c == '.')
sb.Append(c);
else
sb.Append(Uri.HexEscape(c));
}
return sb.ToString();
}
public string UnEscape(string str)
{
if (str == null)
return String.Empty;
StringBuilder sb = new StringBuilder();
int len = str.Length;
int i = 0;
while (i != len)
{
if (Uri.IsHexEncoding(str, i))
sb.Append(Uri.HexUnescape(str, ref i));
else
sb.Append(str[i++]);
}
return sb.ToString();
}
相关文章推荐
- C#实现JS脚本的escape()和unescape()
- Java式实现JS的Escape以及Unescape
- 用php实现js中escape和unescape
- Java实现JS中的escape和UNescape代码分享
- C#利用js脚本实现配置的文本表达式计算
- C#中转换JS的Escape()和Unescape()
- c# 实现javascript中的escape和unescape
- PHP实现JS中escape与unescape的方法
- c#中时间js的escape 和unescape
- js,java实现escape()和unescape()函数解决以给方式提交中中文参数问题
- 转义分为escapeHTML和unescapeHTML,先看两个函数的实现。
- 请实现一个js脚本,要求做到将数字转化为千分位表示如:1234567转化为1,234,567
- 回调callback的C#及JS同步、异步实现
- js的escape()函数 ASP.NET中c#的URL编码处理 万恶的IE6
- C# 实现类似SMSS的执行脚本的功能
- c#实现javascript escape
- Atitit. 悬浮窗口的实现 java swing c# .net c++ js html 的实现
- C# websocket与html js实现文件发送与接收处理
- Unity C#脚本实现的相机漫游…