escape
работает только с символами в диапазоне от 0 до 255 включительно (ISO-8859-1, который фактически представляет собой кодовые точки Unicode, представляемые одним байтом). (*)
encodeURIComponent
работает для всех строк, которые может представлять javascript (который представляет собой весь диапазон базовой многоязычной плоскости Юникода, т. Е. Кодовые точки Юникода от 0 до 1 114 111 или 0x10FFFF, которые охватывают практически любую систему письма, написанную человеком).
Обе функции создают безопасные для URL строки, которые используют только кодовые точки от 0 до 127 включительно (US-ASCII), что достигается последним, сначала кодируя строку как UTF-8, а затем применяя шестнадцатеричное кодирование %XX
, знакомое по * 1008. *, в любой код, который не является безопасным для URL.
Это, кстати, то, почему вы можете сделать кодировщик / декодер UTF-8 с двумя функциями в javascript без каких-либо циклов или генерации мусора, комбинируя эти примитивы для отмены всей обработки, кроме UTF-8 побочные эффекты, так как версии unescape
и decodeURIComponent
делают то же самое в обратном порядке.
(*) Примечание. Некоторые современные браузеры, такие как Google Chrome, были настроены для получения% uXXXX для диапазона символов выше-255, для которого первоначально не было задано escape-число, но поддержка веб-сервера для декодирования этой кодировки также не так хороша. - реализуется как декодирование стандартизированного IETF кодирования на основе UTF-8.