2014-09-12 6 views
1

Состояние моей страницы может быть описано объектом JavaScript, который может быть сериализован в JSON. Но я не думаю, что строка JSON подходит для использования в идентификаторе фрагмента из-за, например, пробелов и двойных кавычек.Каков наилучший способ сериализации объекта JavaScript во что-то, что можно использовать в качестве идентификатора фрагмента (url # hash)?

Будет ли кодирование строки JSON в строку base64 разумным, или есть лучший способ? Моя цель - позволить пользователю закладок на странице, а затем, вернувшись к этой закладке, купите код JavaScript window.location.hash и измените его соответствующим образом.

ответ

0

Я думаю, что вы на хорошем пути. Приведем следующие требования:

  1. Закодированная строка должна использоваться как хэш, т. Е. Только буквы и цифры.
  2. Исходное значение должно быть возможным для восстановления, то есть хеширование (md5, sha1) не является вариантом.
  3. Не должно быть слишком долго, чтобы оставаться пригодным для использования.
  4. Должна быть реализация в JavaScript, поэтому ее можно сгенерировать в браузере.

Base64 - отличное решение для этого. Только проблема: base64 также содержит символы, такие как - и +, поэтому вы ничего не выигрываете по сравнению с простое подключение строки JSON (которая также должна быть закодирована в URL).

НО: К счастью, есть вариант base64 под названием base64url который именно то, что вам нужно. Он специально разработан для типа проблемы, которую вы описываете.

Однако я не смог найти реализацию JS; может быть, вам придется написать один сам - или сделать немного больше исследований, чем мои полузаселенные 15 секунд сканирования первых 5 результатов Google.

EDIT: На второй взгляд, я думаю, вам не нужно писать собственную реализацию. Используйте обычную реализацию и просто заменяйте «запрещенные» символы тем, что вам подходит для ваших URL-адресов.

0

Base64 - отличный способ хранения двоичных данных в тексте. Он использует на 33% больше символов/байтов, чем исходные данные, и в основном использует 0-9, a-z и A-Z. Он также имеет три других символа, которые должны быть закодированы для хранения в URL-адресе: /, = и +. Если вы просто использовали кодировку URL, это займет 300% (3 раза) размера.

Если вы сохраняете только символы в фрагменте URL, закодированном в base64 тексте, его не нужно перекодировать и не изменять. Но если вы хотите отправить данные как часть фактического URL-адреса для посещения, это имеет значение.

Как указано lxg, для этого есть вариант base64url. Это модифицированная версия base64 для замены небезопасных символов для хранения в URL-адресе. Вот как кодировать его:

function tobase64url(s) { 
    return btoa(x).replace(/\+/g,'-').replace(/\//g,'_').replace(/=/g,''); 
} 
console.log(tobase64url('\x00\xff\xff\xf1\xf1\xf1\xff\xff\xfe')); 
// Returns "AP__8fHx___-" instead of "AP//8fHx///+" 

И декодировать строку base64 из URL:

function frombase64url(s) { 
    return atob(x.replace(/-/g,'+').replace(/_/g, '/')); 
} 
+0

Могу ли я спросить, почему вы раздеть '=' отступы, а не заменить его?Знаете ли вы, что функция 'atob' способна правильно декодировать строку даже без символов заполнения? – jl6

+0

@ jl6 Заполнение в base64 просто представляет отсутствие символов, потому что каждые 3 символа кодируются в 4 символах base64. В Firefox функция 'btoa' может декодировать ее без нее, хотя я не проверял другие браузеры. Но есть только одна строка в URL-адресе, поэтому заполнение будет происходить только в конце, и любой браузер должен уметь это понять. Если вы хотите убедиться, что он был добавлен обратно до его декодирования, вы добавите в конец слова '4 * Math.ceil (s.length/4) -s.length' = padding. В любом случае причина его отказа в том, что знак равенства используется в строках запроса в URL-адресах. – Pluto

 Смежные вопросы

  • Нет связанных вопросов^_^