Согласно RFC 2109 , значение cookie "непрозрачно для пользовательского агента и может быть любым, что сервер отправления выберет для отправки, возможно, в выбранной для печати кодировке ASCII для сервера."
Вследствие этого разные языки / платформы / сервер отправляют разные значения cookie, даже если исходное значение одинаково.
Например, C # / ASP.NET отправляет текст как есть; классические ASP urlencodes и urldecodes текст; Perl / Apache urlencodes / расшифровывает текст (но отличается от ASP!). Php дает вам возможность.
Я пишу систему с единым входом, для которой требуется обмен файлами cookie с различными приложениями. В частности, у меня есть .NET, Java, Perl, ColdFusion, которые необходимо поддерживать "из коробки".
Текст, который я храню в cookie, всегда является допустимой ASCII-7 строкой. Тем не менее, Perl любит кодировать некоторые 7-битные символы ASCII, например.
Я вижу две основные альтернативы, чтобы сделать эту работу:
Принимайте только некодированные значения. Ведь нет необходимости кодировать их. Вот как это сейчас. Очевидно, что все интегрированные системы должны поддерживать некодированные значения.
Принимайте как закодированные, так и некодированные значения. Это позволило бы обеспечить максимальную совместимость из коробки, но мне нужно было бы определить, закодировано ли конкретное значение или нет (что звучит совершенно невозможно: "% 20" - буквальная строка "% 20" или пробел?)
Какое решение вы бы предложили и почему? Если это # 2, как бы вы обнаружили UrlEncoded текст?
Пример файла cookie (я добавил разрывы строк, чтобы он подходил)
A5A2794D694241AD92F9B22F288EFAA1|8428DCCC|20090821142732|20090821142832|
10.100.107.40|955098D50AB4982D4E247EFA53F4E23B32A05ED0131E096709BE1D8CCC
8A3CA18252D376473C244FD71C462AB42CF54C