Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Кириллические символы в урле для location.search (https://javascript.ru/forum/misc/75372-kirillicheskie-simvoly-v-urle-dlya-location-search.html)

MC-XOBAHCK 30.09.2018 13:56

Кириллические символы в урле для location.search
 
Допускается ли использование кириллицы в url для передачи параметров для метода location.search?

Например урл: site.ru/page?id=0&title=слово

Получаю такой результат с абракадаброй:
const param = location.search.slice(1).split('&');
console.log(param); // ["id=0", "title=%D1%81%D0%BB%D0%BE%D0%B2%D0%BE"]


Можно как то получить это значение корректно или кириллицу нельзя использовать в таких случаях?

laimas 30.09.2018 15:15

Цитата:

Сообщение от MC-XOBAHCK
Получаю такой результат с абракадаброй

Это UTF, и вообще строки url кодируются, так что все в норме и все можно.

MC-XOBAHCK 30.09.2018 15:52

laimas, подскажите пожалуйста, что мне нужно сделать чтобы абракадабру перегнать опять в кириллицу?
Я урл распарсиваю и у меня значение для параметра с кириллицей получается абракадаброй.

Aetae 30.09.2018 15:57

decodeURIComponent(location.search)
а ещё если наплевать на ослика, можно юзать
new URLSearchParams(location.search)
что гораздо удобнее.

MC-XOBAHCK 30.09.2018 16:21

Aetae,
Спасибо! Теперь работает правильно.

MC-XOBAHCK 02.10.2018 15:39

Прошу опытных пользователей подсказать по такой ситуации. Я распарсиваю урл в массив объектов. Какие символы можно использовать в урле для разделения между элементами массива?
Например у меня урл:
site.ru/page?id=0&title=слово??id=1&title=текст??id=2&title=test

Я код полностью написал, но пока для разделения между элементами массива поставил по два знака вопроса ??
А есть ли какие рекомендации что использовать вместо моих ??, чтобы избежать возможных конфликтов?

laimas 02.10.2018 15:48

Странно, у вас кодировка страницы не совпадает с кодировкой URL?

Уберите вопросики вообще, передавайте парно, разбирая пары.

MC-XOBAHCK 02.10.2018 16:13

Цитата:

Сообщение от laimas (Сообщение 495684)
Странно, у вас кодировка страницы не совпадает с кодировкой URL?

Уберите вопросики вообще, передавайте парно, разбирая пары.

Я пока локально на компе пишу в файле js подключённому в html (всё utf-8).
А что значит "передавайте парно, разбирая пары"? Можете показать как должен быть такой урл:
site.ru/page?id=0&title=слово??id=1&title=текст??id=2&title=test

У меня title - это пользователи текстовую метку добавляют. Могут и вопросов туда натыкать, вот я и опасаюсь что некорректно может получиться.

laimas 02.10.2018 16:21

Если все в UTF, то какие проблемы с кириллицей?

Параметры (ключ-значение) в URL разделяются &, выдумывать что-то можно в том случае, если сложный составной параметр. Вопрос символ занятый тем более.

key=var&key=var&key=var&key=var

Разбить по & и получим все параметры, дальше разбиение по = .....

MC-XOBAHCK 02.10.2018 16:41

Цитата:

Сообщение от laimas (Сообщение 495687)
Если все в UTF, то какие проблемы с кириллицей?

Я не знаю почему так, это в браузере гугл-хром (обновлён до последней версии) на винде.

Цитата:

Сообщение от laimas (Сообщение 495687)
Параметры (ключ-значение) в URL разделяются &, выдумывать что-то можно в том случае, если сложный составной параметр. Вопрос символ занятый тем более.

key=var&key=var&key=var&key=var

Разбить по & и получим все параметры, дальше разбиение по = .....

Я так и делаю. У меня амперсанды проставлены между ключ-значение.
Просто мне нужно из урла получить массив объектов [{...}, {...}]

Я вот так делаю:
const parts = location.search.slice(1).split('??');
let params = [];

for (let i = 0; i < parts.length; i++) {
    params[i] = parts[i].split('&').reduce((prev, current) => {
        const [name, value] = current.split('=');
        prev[name] = value;
        return prev;
    }, {});
}
console.log(parts);
console.log(params);

laimas 02.10.2018 18:03

Да, странно работает JS с utf, а вот с запросами ...

Вам чего надо чтобы в каждый объект массива попадала пара - id->значение и title->значение? Ну так после получения параметров, берете по две пары и помещаете в объект. Они же у вас повторяются, зачем лишние разделители?

MC-XOBAHCK 02.10.2018 19:32

Цитата:

Сообщение от laimas (Сообщение 495691)
Вам чего надо

Я бы хотел разделитель.
Так как мне чтобы хоть малость приблизится к вашему уровню нужно ещё как минимум лет 10 гавнокодить, то я не понимаю ваших намёков. Вы уж извините меня.

Я так прикинул глядя на клавиатуру, возьму ка я лучше вместо двух вопросов для разделения между объектами в массиве, две палочки ||, а в текстовом инпуте, где пользователь имеет влияние на генерируемый урл, сделаю фильтр на запрет символов: &, || и =
, чтобы вдруг чаво не сломать.

Теперь у меня новая проблема - фильтр на упомянутые выше символы. Никогда не писал, пользовался фильтром который мне здесь ещё год назад помогли написать. Но, помню что не раз натыкался на документацию по написанию фильтров, так что буду искать и пробовать.

SuperZen 02.10.2018 20:21

const urlParameters = {
      title: 'гимми да бест',
      other: ['один', 'два', 'три']
    }
    const encodedUrl = (`http://localhost:2999/page?data=${encodeURIComponent(JSON.stringify(urlParameters))}`)
    console.log(encodedUrl)
    const decodedUrl = decodeURIComponent(encodedUrl)
    const data = decodedUrl.split('?data=')[1] && JSON.parse(decodedUrl.split('?data=')[1])
    data && console.log(data.title, data.other[0])


Другой варик

Aetae 02.10.2018 20:27

Используйте POST, а не GET.
Используйте JSON.stringify и JSON.parse, а не изобретайте велосипед.

laimas 03.10.2018 01:07

Цитата:

Сообщение от MC-XOBAHCK
Я бы хотел разделитель.

Зачем? И вообще ищут на сервере, если только вы не хотите сделать поиск по странице, но тогда причем тут id и title?

Если эти GET параметры есть поля формы, то последовательность их будет такой, в какой поля объявлены в форме. Другими словами вы можете структурой формы следовать ожиданиям сервера. А к примеру для РНР именованием полей можно задавать итоговый массив любой вложенности при этом поля в форме могут располагаться произвольно. И это никак не достигается дополнительными никчемными разделителями в GET параметрах, исключительно только использованием ключей (имен полей формы).

У вас запрос key=var&key=var&key=var&key=var и судя по тому месту где вы вставляете свой разделитель вы хотите получить по две пары key=var&key=var. Вам показали как (или вы сами). Если в цикле этого кода проверять на четность его итерацию (деление по модулю, а можно и проще, проверяя младший бит, у нечетных он равен 1), то это будет говорить о том, что нужно объявить в массиве объект, который будет текущим и в который помещаются разбираемые в цикле параметры (key=var).

Если бы речь была о сервере и РНР, то ему достаточно array_chunk($_GET, 2). А вот если передается значение некоторого ключа, из которого методом расколачивания нужно получить массив, тут уже иное дело. Или же "размерность следования" ваших параметров запроса не постоянная, можно еще что-то придумать, но вот для чего такой костыль может потребоваться я ума не приложу. )

MC-XOBAHCK 03.10.2018 13:33

Цитата:

Сообщение от laimas
Зачем?

Я извиняюсь, где то ввёл в заблуждение. Нет у меня никаких запросов к серверу, и поиска в данном случае тоже нет. Я просто передаю таким способом данные для скрипта (в данном случае массив объектов). Вон же для карт передают в урле зум, координаты, дескрипшины и изображения для меток.

Более приблежённый к моему вариант:
http://sait.com/page?form=treagle&size=10.5,4.24&color=red&tag=меточка||form=rechtagle&size=10,4&color=green&tag=другая_метка||form=treagle&size=7,9,12&color=orange&tag=ещё_меточка

Получив такие данные я могу сгенерировать скриптом три блока - 2 треугольника и 1 прямоугольник, нарисовать фигуры по заданными размерам, задать цвет и заголовки, произвести какие либо расчёты. Данных и элементов можно больше напихать, у меня в скрипте что я пишу получилось 5 ключей для каждого элемента массива.
Само собой названия ключей оптимизируются до 1-го символа, чтобы максимально укоротить длину урла.

Вы работаете над сложными задачами, а у меня уровень не тот, поэтому всё куда примитивнее чем вы подумали.

Dilettante_Pro 03.10.2018 13:59

Цитата:

Сообщение от MC-XOBAHCK
Я просто передаю таким способом данные для скрипта

Интересно, откуда?
Пользователь набивает в адресную строку при вызове страницы??

MC-XOBAHCK 03.10.2018 14:06

Цитата:

Сообщение от Dilettante_Pro
Интересно, откуда?

Из онлайн-конструктора который генерирует эту ссылку.
Что то типа как в Codepen - я написал код и дал вам ссылку чтобы вы оценили какой я гавнокодер. Только тут данные не хранятся на сервере, а берутся из урла.

MC-XOBAHCK 03.10.2018 14:15

Или другой пример.
Для себя пользователь может сохранить данные в localStorage (у меня localStorage реализован в конструкторе), а вот чтобы показать кому то результат, чтобы другой человек мог увидеть что у него получилось - вот для этого данные засовываются в урл.

laimas 03.10.2018 15:26

Сравните прежнее с этим. А вообще вам уже сказали - есть json.

SuperZen 03.10.2018 15:31

https://github.com/dreikanter/paradi...-max-length.md

В особо-тяжелых случаях можно сжимать данные gzip-ом с последующим кодированием в BASE64, но лучше, конечно, по возможности избегать таких вещей.

Dilettante_Pro 03.10.2018 15:50

MC-XOBAHCK,
Поскольку этот УРЛ - чисто ваше творение и не будет обрабатываться никаким сервером, то можете написать в нем все, что угодно - как вам удобнее.
Например,
var url = 'http://sait.com/page?[{"form":"treangle","size":[10.5,4.24],"color":"red","tag":"меточка"},{"form":"rechtangle","size":[10,4],"color":"green","tag":"другая_метка"}]';
var params = JSON.parse(url.split('?')[1]);
alert(params[1].tag);
alert(params[0].size[1]);


Для УРЛ со страницы использовать во второй строке
var params = JSON.parse(decodeURI(location.search.split('?')[1]));

MC-XOBAHCK 03.10.2018 16:22

Цитата:

Сообщение от SuperZen
https://github.com/dreikanter/paradi...-max-length.md

Спасибо! Я хотел спросить об этом ещё в топике, но в последний момент застеснялся и удалил этот вопрос из поста.
Цитата:

Сообщение от Dilettante_Pro
можете написать в нем все, что угодно - как вам удобнее

ПризнАюсь, я об этом даже не думал. У меня так в localStorage записывает и тоже есть готовая реализация в которой только из за браузеров добавить обратную конвертацию в кириллицу для одного из параметров.


Если можно, я задам тут такой вопрос.
Посмотрите пожалуйста, я написал фильтр для input type="text" который запрещает ввод таких значений:
'||', '&', '='
inputTag.addEventListener('keyup', function() {
    this.value = this.value.replace('||', '').replace('&', '').replace('=', '');
});

Это нормально или можно как то проще сделать?

Я штудирую раздел https://learn.javascript.ru/regular-...ons-javascript , но тут нужно время чтобы разобраться.

laimas 03.10.2018 17:10

Цитата:

Сообщение от MC-XOBAHCK
Я хотел спросить об этом ещё в топике, но в последний момент застеснялся

Тимоти Бернерс-Ли представил структуру Inrupt, которая гарантирует защищенность персональных данных пользователя. Новая платформа Solid с открытым кодом позволит пользователям выбирать, где хранить свою личную информацию и с кем ею делиться. То есть, без сервера, поисковики и прочие диктующие правила, боком. На гите выложено, можно ознакомится.

Но когда это будет, так что без сервера не обойтись. А в статье товарищ сильно заблуждается, утверждая, что метод POST скушает все, это не так, ограничения накладываются ПО которое на хосте. Это ограничение определяет максимальное количество переменных в запросе, и связано это с безопасностью.

MC-XOBAHCK 03.10.2018 19:06

Цитата:

Сообщение от laimas
Тимоти Бернерс-Ли представил структуру Inrupt, которая гарантирует защищенность персональных данных пользователя. Новая платформа Solid с открытым кодом позволит пользователям выбирать, где хранить свою личную информацию и с кем ею делиться. То есть, без сервера, поисковики и прочие диктующие правила, боком. На гите выложено, можно ознакомится.

А я ознакомился. Интересная свежая новость, НО:
Вам не кажется что это всего лишь пиар компания нового сервиса? Удачный лозунг для маркетинга - "создатель ынтырнета уничтожит ынтырнет". Громко и к завтрашнему утру забъют этим все таблоиды. Толпа побЯгит на такое проверять что к чему.

Я может неправильно понял, но мне понравились пункты - наш сервис исключительно на Node.js, ссылки на тарифы с всякими голд пакетами, и пункты в регистрации - ваше мыло (глядишь скоро появится телефон, а потом ожидаемс запроса паспортных данных : )

Как говАривал Герадот: "В ентырнете главное обвёртка, а не содержание". Все данные сразу в ЦРУ или в какое то там веб-закулисье (не путать с теневым правительством).

laimas 04.10.2018 03:14

Цитата:

Сообщение от MC-XOBAHCK
Вам не кажется что это всего лишь пиар компания нового сервиса?

Кто его знает, что нас ожидает. Не так и много времени прошло с того момента, когда о звонящем по сотовому телефону судили как о "новом русском в малиновом пиджаке", а теперь же практически о каждом встречном как о "придурке не смотрящем перед собой уткнувшемся в мобильник". И сравнивать сотовый телефон "малинового пиджака" с телефоном "придурка", это что телегу с Бугатти. А с ростом аппаратных технологий и возможностей всегда будут расти и технологии связи, и ее возможности.

MC-XOBAHCK 04.10.2018 04:07

Мне один уважаемый человек недавно так написал:
Цитата:

уже HTTP2 протокол на дворе – это, на самом деле, штука революционная. Скоро изменит наше отношение к сайтостроительству

MC-XOBAHCK 05.10.2018 22:40

Цитата:

Сообщение от laimas
Новая платформа Solid с открытым кодом

А дело тем временем пошло, Solid уже на 9 месте в трендах гитхаба. Уже 5180 звёзд всего набрано. Интересно будет проследить сколько звёзд будет через определённые временные промежутки.


Часовой пояс GMT +3, время: 06:47.