Какое имя функции, которая делает противоположное HttpUtility.JavaScriptStringEncode? - PullRequest
3 голосов
/ 02 марта 2012

Мне нужно оценить escape-последовательности в строке. Чтобы избежать этой строки, был использован HttpUtility.JavaScriptStringEncode или что-то подобное. Как мне сделать обратное преобразование?

Вот пример:

        var s = @"otehu""oeuhnoa
        oaehu
        oatehu
        oeu";
        var t = HttpUtility.JavaScriptStringEncode(s);
        var n = Decode(t);

мне нужна такая функция Decode, которая бы делала n == s;

Ответы [ 2 ]

2 голосов
/ 02 августа 2015

вот моя реализация, для тех, кто ее ищет

private string JavaScriptStringDecode(string value, bool removeDoubleQuotes)
            {
                StringBuilder b = new StringBuilder();
                int startIndex = 0;
                int count = 0;
                for (int i = 0; i < value.Length; i++)
                {
                    var c = value[i];
                    if (c == '\\')
                    {
                        if (count > 0)
                        {
                            b.Append(value, startIndex, count);
                            count = 0;
                        }

                        if (i < value.Length - 1)
                        {
                            var c1 = value[i + 1];
                            bool ignore = false;
                            char charToAppend;
                            switch (c1)
                            {
                                case 'r':
                                    charToAppend = '\r';
                                    break;
                                case 't':
                                    charToAppend = '\t';
                                    break;
                                case 'n':
                                    charToAppend = '\n';
                                    break;
                                case 'b':
                                    charToAppend = '\b';
                                    break;
                                case 'f':
                                    charToAppend = '\f';
                                    break;
                                case '\\':
                                    charToAppend = '\\';
                                    break;
                                case '\'':
                                    charToAppend = '\'';
                                    break;
                                case '\"':
                                    charToAppend = '\"';
                                    break;
                                case 'u':
                                case 'U':
                                    if (i < value.Length - 5)
                                    {
                                        var style = NumberStyles.HexNumber;
                                        var cult = CultureInfo.InvariantCulture;
                                        int u;

                                        if (Int32.TryParse(value.Substring(i + 2, 4), style, cult, out u))
                                        {
                                            charToAppend = ((char)u);
                                            i += 4;
                                            break;
                                        }
                                    }
                                    charToAppend = '\\';
                                    ignore = true;
                                    break;
                                default:
                                    charToAppend = '\\';
                                    ignore = true;

                                    break;
                            }
                            if (!ignore)
                            {
                                i++;
                            }
                            startIndex = i + 1;
                            b.Append(charToAppend);
                            continue;
                        }


                    }
                    count++;

                }
                if (count > 0)
                {
                    b.Append(value, startIndex, count);
                }
                if (removeDoubleQuotes)
                {
                    if (b.Length > 0)
                    {
                        if (b[0] == '"')
                        {
                            b.Remove(0, 1);
                        }
                        if (b[b.Length - 1] == '"')
                        {
                            b.Remove(b.Length - 1, 1);
                        }
                    }
                }
                return b.ToString();
            }
2 голосов
/ 06 марта 2014

Я обнаружил, что эта функция размещена на другом форуме:

public static string JavaScriptStringDecode(string source)
{
    // Replace some chars.
    var decoded = source.Replace(@"\'", "'")
                .Replace(@"\""", @"""")
                .Replace(@"\/", "/")
                .Replace(@"\\", @"\")
                .Replace(@"\t", "\t")
                .Replace(@"\n", "\n");

    // Replace unicode escaped text.
    var rx = new Regex(@"\\[uU]([0-9A-F]{4})");

    decoded = rx.Replace(decoded, match => ((char)Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber))
                                            .ToString(CultureInfo.InvariantCulture));

    return decoded;
}

И у меня это сработало

...