Read old strings or log values produced by JavaScript escape(), or recreate their escaped form. This tool uses the deprecated native escape() and unescape() functions with %XX and %uXXXX notation, not modern UTF-8 URL encoding.
Runs locally in your browserPaste text directly. Processing runs in the browser; there is no file upload, URL fetching or batch mode. These functions are for legacy data, not new application code.
A-Z a-z 0-9 and @ * _ + - . / stay unchanged. Other UTF-16 code units below 256 use %XX; the rest use %uXXXX. Hex digits are uppercase and zero-padded to two or four positions; the u is lowercase.
é becomes %E9, 你好 becomes %u4F60%u597D, and 😀 uses two units: %uD83D%uDE00. The symbols ~, ' and & become %7E, %27 and %26.
Decoding %u4f60 %GG %U0041 produces 你 %GG %U0041. Hex digits accept either case, but the u marker must be lowercase. Invalid pieces such as %, %GG and %u123 remain literal while valid sequences elsewhere decode. They do not cause URIError; this is not strict validation.
Decoding %E4%BD%A0 yields separate code units U+00E4, U+00BD and U+00A0, not 你. For modern UTF-8 URL components, use a tool based on encodeURIComponent/decodeURIComponent instead.
Literal \n, \u4F60 and & remain unchanged on decoding. There is no JS/JSON string parsing, HTML entity decoding or code execution. Escaping is not encryption.
+ stays + in both directions; a space encodes as %20. Encoding %20 gives %2520. Decoding %2520 gives the literal text %20 in one pass, not a space. This is not form decoding.
It does not trim whitespace or add Unicode normalization. The textarea normalizes actual line endings to LF, encoded as %0A, so original CRLF or CR bytes are not preserved. Empty input gives an empty result.
No. Native escape/unescape accepts lone surrogates such as %uD800. Display or clipboard handling can replace them; do not rely on a copy round trip. The tool reports unavailable native functions rather than substituting another encoder.