Как определить кодировку?

Ilshakin

Client
Регистрация
14.02.2017
Сообщения
631
Благодарностей
543
Баллы
93
Есть исходное сообщение, которое нужно передать запросом, данное сообщение содержит в себе "", tab(2раза) и перенос строки:
C#:
Шла "Саша" по шоссе        и
сосала сушку

Из запросов вижу, что сервер кодирует данное сообщение и отправляет в следующем виде:
C#:
%D0%A8%D0%BB%D0%B0%20%5C%22%D0%A1%D0%B0%D1%88%D0%B0%5C%22%20%D0%BF%D0%BE%20%D1%88%D0%BE%D1%81%D1%81%D0%B5%5Ct%5Ct%D0%B8%5Cn%D1%81%D0%BE%D1%81%D0%B0%D0%BB%D0%B0%20%D1%81%D1%83%D1%88%D0%BA%D1%83

Если применить urldecode к коду выше, то получаем следующее:
C#:
Шла \"Саша\" по шоссе\t\tи\nсосала сушку

Не самопис ли это случаем?
" кодируется как \"
tab
кодируется как \t
перенос строки
кодируется как \n
 

Solus

Client
Регистрация
14.04.2014
Сообщения
377
Благодарностей
119
Баллы
43
сервер кодирует данное сообщение
Так там уже вместо табов и переноса строк определены как \t и \n только слэши кодированы.
Логично, что после decode будет именно так. Или нет?
 
  • Спасибо
Реакции: Ilshakin

Ilshakin

Client
Регистрация
14.02.2017
Сообщения
631
Благодарностей
543
Баллы
93
Пишу вот так:

C#:
Шла "Саша" по шоссе        и
сосала сушку
Получаю конечный ответ:

C#:
%D0%A8%D0%BB%D0%B0%20%5C%22%D0%A1%D0%B0%D1%88%D0%B0%5C%22%20%D0%BF%D0%BE%20%D1%88%D0%BE%D1%81%D1%81%D0%B5%5Ct%5Ct%D0%B8%5Cn%D1%81%D0%BE%D1%81%D0%B0%D0%BB%D0%B0%20%D1%81%D1%83%D1%88%D0%BA%D1%83
Т.е. мое исходное сообщение сервер сначала кодирует как то , потом уже прогоняет через urlencode
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 691
Баллы
113
Пишу вот так:

C#:
Шла "Саша" по шоссе        и
сосала сушку
Получаю конечный ответ:

C#:
%D0%A8%D0%BB%D0%B0%20%5C%22%D0%A1%D0%B0%D1%88%D0%B0%5C%22%20%D0%BF%D0%BE%20%D1%88%D0%BE%D1%81%D1%81%D0%B5%5Ct%5Ct%D0%B8%5Cn%D1%81%D0%BE%D1%81%D0%B0%D0%BB%D0%B0%20%D1%81%D1%83%D1%88%D0%BA%D1%83
Т.е. мое исходное сообщение сервер сначала кодирует как то , потом уже прогоняет через urlencode
так ?

65361
 
  • Спасибо
Реакции: Ilshakin

Ilshakin

Client
Регистрация
14.02.2017
Сообщения
631
Благодарностей
543
Баллы
93

Ilshakin

Client
Регистрация
14.02.2017
Сообщения
631
Благодарностей
543
Баллы
93
Частично нашел решение, но через сторонний сайт, переходим, вводим начальное сообщение:




На выходе получаем сообщение, которое в дальнейшем переводим в urlencode
Вопрос: Как прикрутить эту кодировку в зенке, ибо не хочется для работы одного запроса - посылать запрос на другой сайт :D
 

nicanil

Client
Регистрация
06.03.2016
Сообщения
2 242
Благодарностей
1 805
Баллы
113
Частично нашел решение, но через сторонний сайт
Сайт использует самописное решение. Найти его можно тут - https://coderstoolbox.net/string/string.js , строка 201-221
Можно попробовать на основе этого js кода написать своё решение. Что-то вроде этого (использовать аккуратно, писал на скорую руку. На фразе из первого поста код отработал как положено):
C#:
string result = "";

foreach (char ch in project.Variables["text"].Value)
{
    int match = "\b\t\n\v\f\r\"\\".IndexOf(ch);
    if (match != -1)
    {
        result += "\\" + "btnvfr\"'\\".Substring(match, 1);
    }
    else
    {
        result += ch.ToString();
    }
}

return result;
Текст должен находиться в переменной проекта text (изменить название переменной можно на 3й строке). В настройках экшена C# указать переменную куда будет записан результат работы экшена.
 
  • Спасибо
Реакции: Ilshakin

Ilshakin

Client
Регистрация
14.02.2017
Сообщения
631
Благодарностей
543
Баллы
93
Сайт использует самописное решение. Найти его можно тут - https://coderstoolbox.net/string/string.js , строка 201-221
Можно попробовать на основе этого js кода написать своё решение. Что-то вроде этого (использовать аккуратно, писал на скорую руку. На фразе из первого поста код отработал как положено):
C#:
string result = "";

foreach (char ch in project.Variables["text"].Value)
{
    int match = "\b\t\n\v\f\r\"\\".IndexOf(ch);
    if (match != -1)
    {
        result += "\\" + "btnvfr\"'\\".Substring(match, 1);
    }
    else
    {
        result += ch.ToString();
    }
}

return result;
Текст должен находиться в переменной проекта text (изменить название переменной можно на 3й строке). В настройках экшена C# указать переменную куда будет записан результат работы экшена.
Тоже изначально подумал, что это самопис, непонятно, почему сайт автоматом подхватывает исходное сообщение, как ECMAScript
Ваш код неверно отработал:

C#:
Шла \"Саша\" по шоссе\t\tи\nсосала сушку - Правильный исходник
Шла \"Саша\" по шоссе\t\tи\r\nсосала сушку - C#
Исходное сообщение по-сути очень маленькое, если встявлять большой html-код, в котором возможны спец.символы и прочие знаки, закодировать через представленный C# выше - вряд ли получится.
 

nicanil

Client
Регистрация
06.03.2016
Сообщения
2 242
Благодарностей
1 805
Баллы
113
Попытка №2:-)

Добавляем System.Web в Ссылки из GAC (в противном случае код работать не будет)

C#:
string input = project.Variables["text"].Value;
string escaped = System.Web.HttpUtility.JavaScriptStringEncode(input);
return escaped.Replace(@"\r\n", @"\n");
\r\n и \n - это переносы строк. Если загуглить в чём разница, то 95 % ответов будут о том, что \r\n - используется в Windows, а \n - в Unix.
В коде выше я пошёл самым прямым путём - после экранирования всех символов, заменил все вхождения \r\n на \n.
Пробуйте.
 
  • Спасибо
Реакции: Ilshakin

Ilshakin

Client
Регистрация
14.02.2017
Сообщения
631
Благодарностей
543
Баллы
93
Благодарю за отзывчивость, но полагаю, что нужно искать обходные пути.
Видимо это действительно самопис, по которому нужно регулярить по каждому символу)
Расхождения в \r\n и \n - это же самое начало, дальше больше.
Ради интереса, глянул несколько символов, вот пример обертывания следующей строки:

№11090\05900076 - Исходная
№11090\\05900076 - На выходе

Как обертываются спецсимволы да же не хочу представлять, ведь вполне возможно, что отдельные
символы кодируются по одной js-обертке, а связки символов будут уже оборачиваться в совершенно другие js :D
 

nicanil

Client
Регистрация
06.03.2016
Сообщения
2 242
Благодарностей
1 805
Баллы
113
№11090\05900076 - Исходная
№11090\\05900076 - На выходе
Тут просто экранирование слэша. Код из этого сообщения справится с такой задачей

Как обертываются спецсимволы да же не хочу представлять, ведь вполне возможно, что отдельные
символы кодируются по одной js-обертке, а связки символов будут уже оборачиваться в совершенно другие js :D
Можно взять большой кусок текста с различными спец. символами и отправить его через исходный сайт, потом этот же текст прогнать через код, который я давал выше и сравнить их.

Благодарю за отзывчивость, но полагаю, что нужно искать обходные пути.
Можно так же покопаться в сайте и поискать где именно находится скрипт, который экранирует строку и уже в этом скрипте смотреть какие конкретно символы он экранируют .
 
  • Спасибо
Реакции: Ilshakin

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)