一个类来编码URL ,.net 自带的 HttpUtility.UrlEncode, Uri.EscapeUriString 都不能满足超长度的字符串编码,根据官方文档知道 stringToEscape 的长度超过 32766 个字符。
于是用下面这个类就好了:
public static class Url{ private static bool IsSafe(char ch) { if ((((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z'))) || ((ch >= '0') && (ch <= '9'))) { return true; } switch (ch) { case '\'': case '(': case ')': case '*': case '-': case '.': case '_': case '!': return true; } return false; } private static char IntToHex(int n) { if (n <= 9) { return (char)(n + 0x30); } return (char)((n - 10) + 0x61); } public static byte[] UrlEncodeBytesToBytes(byte[] bytes, int offset, int count, bool alwaysCreateReturnValue) { int num = 0; int num2 = 0; for (int i = 0; i < count; i++) { char ch = (char)bytes[offset + i]; if (ch == ' ') { num++; } else if (!IsSafe(ch)) { num2++; } } if ((!alwaysCreateReturnValue && (num == 0)) && (num2 == 0)) { return bytes; } byte[] buffer = new byte[count + (num2 * 2)]; int num4 = 0; for (int j = 0; j < count; j++) { byte num6 = bytes[offset + j]; char ch2 = (char)num6; if (IsSafe(ch2)) { buffer[num4++] = num6; } else if (ch2 == ' ') { buffer[num4++] = 0x2b; } else { buffer[num4++] = 0x25; buffer[num4++] = (byte)IntToHex((num6 >> 4) & 15); buffer[num4++] = (byte)IntToHex(num6 & 15); } } return buffer; } public static byte[] UrlEncodeToBytes(string str) { if (str == null) { return null; } return UrlEncodeToBytes(str, Encoding.UTF8); } public static byte[] UrlEncodeToBytes(string str, Encoding e) { if (str == null) { return null; } byte[] bytes = e.GetBytes(str); return UrlEncodeToBytes(bytes); } public static byte[] UrlEncodeToBytes(byte[] bytes) { if (bytes == null) { return null; } return UrlEncodeBytesToBytes(bytes, 0, bytes.Length, false); } public static string UrlEncode(string str, Encoding e) { if (str == null) { return null; } return Encoding.ASCII.GetString(UrlEncodeToBytes(str, e)); } public static string UrlEncode(string str) { if (str == null) { return null; } return UrlEncode(str, Encoding.UTF8); } public static string UrlEncode(byte[] bytes) { if (bytes == null) { return null; } return Encoding.ASCII.GetString(UrlEncodeToBytes(bytes)); }}
//-----------------------------------------------------------
//调用:Url.UrlEncode(s); //---------------------------------------------------------