A little late to the party, but since the currently accepted answer is off the mark (it quotes about a part of the RFC with an optional suggestion about further encoding, i.e. base64, for really arbitrary data, which would be in addition to URL-encoding, since regular base64 itself contains characters that require URL-encoding), I'll give a more explicit answer:
RFC6265 from 2011 specifies the permitted bytes in a cookie value string:
cookie-pair = cookie-name "=" cookie-value
[...]
cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )
cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E
; US-ASCII characters excluding CTLs,
; whitespace DQUOTE, comma, semicolon,
; and backslash
Specifically, the mentioned characters are not allowed to be used un-encoded by the RFC. For these characters, there is no confusion, they must be encoded. The way they wrote it is a little informal (i.e., the human comment "; ..." does not even completely contain the formal list of "%..." values before oit).
So clients must URL-decode at least the mentioned codes and of course all bytes starting at 128, since US-ASCII is 7-bit only). Since all bytes involved in URL-encoding are themselves (of course) included in the bytes that need to be encoded, there is no risk in point-blank url-encoding the complete string (i.e. accepting any 2-digit hex value and decoding it to its byte).
Clients should be able to process all values that are specifically allowed by the RFC. Since the