Точка с запятой как разделитель URL-запросов

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

Например, сравните

http://www.google.com/search?q=nemo& oe=utf-8

http://www.google.com/search?q=nemo;ое=utf-8

Результаты. (В последнем случае точка с запятой или была во время написания этого текста интерпретироваться как обычный строковый символ, как если бы URL-адрес был: http://www.google.com/search?q=nemo%3Boe=utf-8 )

Хотя первая библиотека разбора URL-адресов, которую я пробовал, ведет себя хорошо:

>>> from urlparse import urlparse, query_qs
>>> url = 'http://www.google.com/search?q=nemo;oe=utf-8'
>>> parse_qs(urlparse(url).query)
{'q': ['nemo'], 'oe': ['utf-8']}

Каков текущий статус принятия точки с запятой в качестве разделителя, и каковы потенциальные проблемы или некоторые интересные замечания? (как с точки зрения сервера, так и с точки зрения клиента)


person mykhal    schedule 14.08.2010    source источник
comment
Поиск Google делает одно, а Golang делает противоположное: github.com/golang/go/issues/ 2210   -  person Brent Bradburn    schedule 05.12.2019


Ответы (4)


Рекомендация W3C от 1999 г. устарел. Текущий статус согласно Рекомендация W3C 2014 заключается в том, что точка с запятой теперь недопустима в качестве разделителя параметров:

Для декодирования полезной нагрузки application/x-www-form-urlencoded следует использовать следующий алгоритм. [...] Результатом этого алгоритма является отсортированный список пар имя-значение. [...]

  1. Пусть строки будут результатом строгого разделения полезной нагрузки строки на U+0026 символов AMPERSAND (&).

Другими словами, ?foo=bar;baz означает, что параметр foo будет иметь значение bar;baz; тогда как ?foo=bar;baz=sna должно привести к тому, что foo будет bar;baz=sna (хотя технически это незаконно, поскольку второй = должен быть преобразован в %3D).

person geira    schedule 23.11.2016
comment
Этот ответ вводит в заблуждение, потому что он строго говорит о кодировании формы, о чем не спрашивает ОП и не было во включенном примере. Кодировка URL-адреса формы очень старая и используется при отправке данных через тег ‹form›, от которого мы отходим, а теперь переходим к AJAX. Использование & в качестве разделителя было старой досадной ошибкой, которая теперь сохраняется из соображений обратной совместимости. Использование точек с запятой — это путь вперед, если ваш веб-сервер поддерживает это. - person Zectbumo; 14.11.2017
comment
Если вы прочтете стандарты HTTP и URL, вы увидите, что они не определяют никакого синтаксиса для строки запроса, кроме экранирования. На самом деле два упомянутых документа являются единственными существующими спецификациями для параметров запроса. Хотя вы технически правы в том, что кодирование формы (которое описывается в обеих рекомендациях W3C) относится к запросам POST, для GET нет аналогичной спецификации, и поэтому реализации браузера последовали первому. Современные фреймворки (например, Mojolicious) также отказываются от поддержки разделителей с запятой, и пока все браузеры не будут переписаны, амперсанд никогда не исчезнет. - person geira; 15.11.2017
comment
Что касается перехода к AJAX, обратите внимание на текущий стандарт Swagger (также известный как OpenAPI). разрешает только параметры, разделенные амперсандами; точки с запятой разрешены только в качестве параметров пути или файла cookie. Если вы разрабатываете API, который противоречит спецификации Swagger, у вас есть проблема. - person geira; 15.11.2017
comment
Конечно, спецификации не определяют разделители. Мы сами должны принять разумное решение использовать ; для разделения наших параметров, чтобы нам не приходилось экранировать параметры, которые обычно встречаются в наших URL-адресах, помещенных в атрибуты html. Мы также можем выстрелить себе в ногу и использовать &, оставив экранирование в атрибутах HTML. Я не виню Сваггера. В конце концов, они хотят, чтобы их сервис работал на как можно большем количестве серверов, поэтому они выбрали самый слабый общий знаменатель. Итак, если ваш веб-сервер поддерживает точки с запятой и вы пишете свои собственные URL-адреса, будьте умнее остальных: используйте точки с запятой. - person Zectbumo; 17.11.2017
comment
Я застрял в проблеме совместимости браузера, где для моей ссылки на изображение s3 требуется параметр X-Amz-SignedHeaders: content-type;host, и он работает в chrome/firefox и последних браузерах Safari, но не работает в Microsoft Edge и IE 11, любое предложение о том, как я могу это исправить - person Savitoj Cheema; 12.02.2019
comment
Я хотел бы добавить, что ; является частью sub-delims в соответствии с RFC 3986, раздел 2.2, который является частью query согласно RFC 3986, раздел 3.4. А query определяет часть строки запроса в RFC 7230, раздел 5.3. 1. В RFC 3986 говорится, что подразделители должны использоваться приложениями для разделения частей, и когда кто-то хочет передать эти значения, он должен их urlencode. - person webknjaz; 07.06.2020

Пока ваш HTTP-сервер и ваше серверное приложение принимают точки с запятой в качестве разделителей, все должно быть в порядке. Я не вижу никаких недостатков. Как вы сказали, спецификация W3C на вашей стороне :

Мы рекомендуем разработчикам HTTP-серверов и, в частности, разработчикам CGI поддерживать использование ";" вместо «&», чтобы избавить авторов от необходимости экранировать символы «&» таким образом.

person Daniel Vassallo    schedule 14.08.2010
comment
вижу по крайней мере один недостаток - с точки зрения клиента, я не могу безопасно решить использовать ; вместо & в запросе (хорошо, я добавляю упоминание о клиентской точке зрения к вопросу) - person mykhal; 14.08.2010
comment
@mykhal: с точки зрения клиента ... вы имеете в виду, когда вы предоставляете API через веб-службу или что-то подобное? Потому что в противном случае я думаю, что конечным пользователям, использующим сайт через веб-браузер, все равно. Что касается первого, да, потребители веб-сервисов могут привыкнуть к использованию & и могут быть озадачены необычным соглашением. - person Daniel Vassallo; 14.08.2010
comment
@[Даниэль Вассалло] в общем. Кстати, я неявно обращался к той же самой цитате W3C, которую вы упоминаете в своем ответе, что, следовательно, меня не удовлетворяет ... неважно :) - person mykhal; 14.08.2010
comment
@mykhal: Да, я знал об этом :) ... Тем не менее, я не думаю, что есть какие-то проблемы на стороне разработки (кроме необходимости проверять, поддерживает ли ваш фреймворк и веб-сервер точки с запятой) ... Интересный вопрос , Кстати :) - person Daniel Vassallo; 14.08.2010
comment
Есть недостатки. Давая ; специальное дополнительное значение, изначально не указанное в RFC, вы принудительно ; для экранирования как в тексте ключа, так и в тексте значения. Например, ?q='one;two'&x=1. Вы ожидаете {"q": "'one;two'", "x": "1"}, но вполне можете получить: {"q": "'one", "two'": null, "x": "1"} или какое-то другое значение. Там много потенциальной двусмысленности. По сути, W3C глуп. - person Bob Aman; 11.04.2013
comment
За исключением того, @BobAman, вы не учитываете, что ваш случай в равной степени действителен для тех, кто думает; лучше (как и я). в обычном английском языке амперсанд встречается чаще, чем ; поэтому использование '&' в значении строки запроса и использование & в качестве разделителей более проблематично (уже), чем переключение на использование вместо этого точки с запятой. - person Shawn Kovac; 25.01.2016
comment
@BobAman Я должен не согласиться. Принуждение ; быть экранированным не хуже, чем текущее использование '&'. Нужно уже экранировать '&' как в тексте ключа, так и в тексте значения. Так почему же принудительное использование ';' является недостатком? быть экранированным, если вместо этого используется точка с запятой? Другими словами, независимо от того, используете ли вы тот или иной символ, вам всегда нужно экранировать символ, который вы выбрали в качестве разделителя. Я вижу разницу в том, что «&» чаще встречается в обычном английском языке, поэтому я думаю, что «&» уже является более проблематичным символом из-за его использования в английском языке. В принципе, W3c сделал правильный выбор. - person Edward; 25.01.2016
comment
@ Эдвард Прошло несколько лет, так что всегда стоит пересмотреть, но нет. W3C по-прежнему ошибался. Я написал самый популярный синтаксический анализатор URL-адресов для Ruby, поэтому я вижу много пограничных случаев синтаксического анализа URL-адресов, которые встречаются на моем столе, и я могу довольно категорично сказать, что на практике точки, в которых взаимодействуют две разные спецификации, являются самым большим потенциальным источником взаимодействия. проблемы. Вдвойне, когда это две разные спецификации от двух разных организаций, как в данном случае (IETF против W3C). Это один из них, где «+» является пробелом (согласно W3C), но «% 20» также является пробелом (согласно IETF). - person Bob Aman; 02.02.2016
comment
В случае сомнений IETF создает более разумные и менее проблематичные спецификации. Если в двух разных спецификациях указано делать две разные конфликтующие вещи, выберите то, что указано в спецификации IETF. - person Bob Aman; 02.02.2016
comment
@ShawnKovac Спецификации работают не так. Суть спецификации заключается в функциональной совместимости, не требующей от обеих сторон значительной внеплановой координации. Если вы предпочитаете «;», это круто, если вам нужно говорить только с самим собой. Но это скучно. Interop — вот почему Интернет победил. Саботировать его ради удобства на несколько символов 100% не стоит, особенно когда проблема решается банально с помощью инструментария. - person Bob Aman; 02.02.2016
comment
@BobAman: Несколько лет спустя я пересматриваю эту тему. Я согласен с тем, что «&» более популярен, поскольку вы выразили преимущество использования «&». Я считаю, что всем лучше использовать точку с запятой, чем амперсанд. Однако вы правы в том, что не все используют ';' и использование разделено. Я согласен, что две общие альтернативы создают еще одну проблему. Однако есть люди, которые просто хотят использовать то, что наиболее популярно, в надежде, что победит самый популярный. А есть и те, кто выбирает то, что кажется лучшим, если бы этим пользовались все. Вы у меня, кажется, разные предпочтения для таких. - person Shawn Kovac; 21.08.2019
comment
@BobAman: Кажется, вы предпочитаете использовать то, что наиболее популярно. Я определенно человек, который предпочитает мыслить нестандартно и использовать то, что имеет больше смысла, если бы все использовали мои методы. И я сильно отличаюсь от обычной практики. Я печатаю с раскладкой Дворжака. Я босиком бегуном. Я предпочитаю дюжинные числа десятичным, даже для учета времени в календаре. Но каждому свое. Вы, вероятно, думаете, что я слишком альтруистичен, и это нормально. Наш ответ: не срезайте углы. - person Shawn Kovac; 21.08.2019

Я согласен с Бобом Аманом. Спецификация W3C предназначена для упрощения использования гиперссылок привязки с URL-адресами, которые выглядят как запросы формы GET (например, http://www.host.com/?x=1&y=2). В этом контексте амперсанд конфликтует с системой ссылок на символьные сущности, которые все начинаются с амперсанда (например, "). Поэтому W3C рекомендует, чтобы веб-серверы разрешали использовать точку с запятой в качестве разделителя полей вместо амперсанда, чтобы упростить написание этих URL-адресов. Но это решение требует, чтобы авторы помнили, что амперсанд должен быть чем-то заменен, и что ; является таким же допустимым разделителем полей, даже несмотря на то, что веб-браузеры повсеместно используют амперсанд в URL-адресе при отправке форм. Это, пожалуй, сложнее, чем не забыть заменить амперсанд на & в этих ссылках, как это можно было бы сделать в другом месте документа.

Что еще хуже, пока все веб-серверы не разрешат использовать точки с запятой в качестве разделителей полей, авторы URL-адресов могут использовать этот ярлык только для некоторых хостов и должны использовать & для других. Им также придется изменить свой код позже, если данный хост перестанет разрешать разделители с запятой. Это, безусловно, сложнее, чем просто использовать &, который будет работать на каждом сервере вечно. Это, в свою очередь, устраняет любые стимулы для веб-серверов разрешать использование точек с запятой в качестве разделителей полей. Зачем беспокоиться, когда все уже меняют амперсанд на & вместо ;?

person Matthias Fripp    schedule 11.07.2014
comment
я говорю, что сложнее продолжать использовать только &, не разрешая оба. я говорю, позволяя людям, которые хотят более простой жизни, использовать ; сделает это намного проще для них, что стоит относительно немного больше осложнений, которые иногда некоторые сайты должны знать оба варианта. - person Shawn Kovac; 25.01.2016
comment
обработка QueryString с разделителем & более чем в два раза сложнее, чем переход на ; для разделения элементов QueryString. С использованием ; значительно уменьшает потенциальные ошибки для строк с неправильным кодированием HTML для использования '&'. - person Shawn Kovac; 25.01.2016
comment
Мне кажется, я слышал, как Матиас говорит, что использование '&' в качестве разделителей лучше просто потому, что они уже более популярны. И я говорю, что это хороший момент. И я не выступаю против этого. Я пытаюсь сообщить, что если мы все начнем использовать ';' напротив, в долгосрочной перспективе это проще для большинства людей. Я говорю, что ';' лучше для всех использовать, чем '&'. И я также говорю, что пока все не переключатся на одно или другое, нам просто придется иметь дело с одной группой, которая делает это по-другому, поэтому, если мы хотим надежный код, мы должны иметь возможность обрабатывать оба, независимо . - person Shawn Kovac; 21.08.2019

Короче говоря, HTML — это большой беспорядок (из-за его снисходительности), и использование точки с запятой помогает упростить это НАМНОГО. Я подсчитал, что если учесть сложности, которые я обнаружил, использование амперсанда в качестве разделителя делает весь процесс примерно в три раза сложнее, чем использование точки с запятой вместо разделителя!

Я программист .NET, и, насколько мне известно, .NET не по своей сути допускает ';' разделители, поэтому я написал свои собственные методы синтаксического анализа и обработки, потому что увидел огромную ценность в использовании точки с запятой, а не в и без того проблематичной системе использования амперсандов в качестве разделителей. К сожалению, очень уважаемые люди (например, @Bob Aman в другом ответе) не видят ценности в том, почему использование точки с запятой намного лучше и намного проще, чем использование амперсандов. Итак, теперь я делюсь несколькими моментами, чтобы, возможно, убедить других уважаемых разработчиков, которые еще не осознают ценность использования точки с запятой:

Использование строки запроса типа '?a=1&b=2' на HTML-странице является неправильным (без предварительного кодирования HTML), но в большинстве случаев это работает. Однако это связано только с тем, что большинство браузеров терпимы, и эта терпимость может привести к трудно обнаруживаемым ошибкам, когда, например, значение пары ключ-значение публикуется в URL-адресе HTML-страницы без надлежащего кодирования (непосредственно как '? a=1&b=2' в исходном коде HTML). Строка запроса типа «?who=me+&+you» тоже проблематична.

Мы, люди, можем иметь предубеждения и можем не соглашаться с нашими предубеждениями в течение всего дня, поэтому очень важно признавать свои предубеждения. Например, я согласен, что я просто думаю, что разделение с помощью ';' выглядит «чище». Я согласен с тем, что мое «более чистое» мнение является чисто предвзятым. И у другого разработчика может быть столь же противоположное и столь же обоснованное предубеждение. Таким образом, моя предвзятость в этом отношении не более верна, чем противоположная предвзятость.

Но, учитывая беспристрастную поддержку точки с запятой, облегчающей всем жизнь в долгосрочной перспективе, нельзя правильно оспаривать, когда принимается во внимание вся картина. Короче говоря, использование точек с запятой действительно упрощает жизнь всем, за одним исключением: небольшое препятствие, связанное с привыканием к чему-то новому. Это все. Всегда сложнее что-то изменить. Но сложность внесения изменений меркнет по сравнению с постоянными трудностями продолжения использования &.

С использованием ; поскольку разделитель QueryString делает его НАМНОГО проще. Разделители амперсанд более чем в два раза сложнее кодировать правильно, чем если бы использовались точки с запятой. (Я думаю) большинство реализаций не закодированы должным образом, поэтому большинство реализаций не в два раза сложнее. Но тогда отслеживание и исправление ошибок приводит к потере производительности. Здесь я указываю на 2 отдельных шага кодирования, необходимых для правильного кодирования QueryString, когда & является разделителем:

  • Шаг 1: URL-адрес кодирует как ключи, так и значения строки запроса.
  • Шаг 2: Объедините ключи и значения, такие как «a=1&b=2», после того, как они будут закодированы в URL из шага 1.
  • Шаг 3: Затем HTML кодирует всю QueryString в исходном HTML-коде страницы.

Таким образом, специальное кодирование должно быть выполнено дважды для правильной (безошибочной) кодировки URL, и не только это, но кодировки представляют собой два разных типа кодирования. Первая — это кодировка URL, а вторая — кодировка HTML (для исходного кода HTML). Если что-то из этого неверно, то я могу найти вам ошибку. Но шаг 3 отличается для XML. Для XML вместо этого требуется кодировка объекта символов XML (что почти идентично). Я хочу сказать, что последняя кодировка зависит от контекста URL-адреса, будь то веб-страница HTML или документация XML.

Теперь с гораздо более простыми разделителями с запятой процесс выглядит так, как и следовало ожидать:

  • 1: URL кодирует ключи и значения,
  • 2: объединить значения вместе. (Без кодирования для шага 3.)

Я думаю, что большинство веб-разработчиков пропускают шаг 3, потому что браузеры очень снисходительны. Но это приводит к ошибкам и дополнительным осложнениям при поиске этих ошибок или невозможности пользователям что-либо делать, если этих ошибок не было, или написании отчетов об ошибках и т. д.

Другая сложность при реальном использовании возникает при написании разметки XML-документации в моем исходном коде как на C#, так и на VB.NET. Поскольку & должен быть закодирован, это буквально тормозит мою производительность. Этот дополнительный шаг 3 также затрудняет чтение исходного кода. Таким образом, этот трудный для чтения недостаток относится не только к HTML и XML, но и к другим приложениям, таким как код C# и VB.NET, поскольку их документация использует XML-документацию. Таким образом, сложность кодирования шага № 3 распространяется и на другие приложения.

Таким образом, используя ; в качестве разделителя прост, потому что (правильный) процесс при использовании точки с запятой - это то, как обычно ожидается, что процесс будет выглядеть так: должен быть выполнен только один шаг кодирования.

Возможно, это было не слишком запутанно. Но вся путаница или трудности возникают из-за использования разделительного символа, который должен быть закодирован в HTML. Таким образом, «&» является виновником. И точка с запятой избавляет от всех этих сложностей.

(Я укажу, что описанный выше процесс из трех и двух шагов обычно соответствует тому, сколько шагов потребуется для большинства приложений. Однако для полностью надежного кода все 3 шага необходимы независимо от того, какой разделитель используется. Но по моему опыту, большинство реализаций небрежны и ненадежны. Поэтому использование точки с запятой в качестве разделителя строки запроса облегчило бы жизнь большему количеству людей с меньшим количеством ошибок веб-сайта и взаимодействия, если бы все приняли точку с запятой по умолчанию вместо амперсанда.)

person Shawn Kovac    schedule 25.01.2016
comment
Таким образом, в определенной степени руки W3C были связаны в силу наследования от синтаксиса ссылок на объекты SGML и того факта, что синтаксис URL был аналогичным образом уже определен в другом месте. Однако переопределение поведения спецификации за пределами этой спецификации является наихудшей практикой для эффективного взаимодействия. Допустим, я разработчик спецификации. Я прочитал спецификацию и реализовал ее точно и идеально. В идеале я должен иметь возможность взаимодействовать с любым другим, кто сделал то же самое. Но как только один из нас включит дополнительные правила, взаимодействия больше не будет. Вот почему W3C ошибается. - person Bob Aman; 02.02.2016
comment
Кроме того, FWIW, XML в комментариях к исходному коду тоже довольно глупый. Однако этого нет на W3C. - person Bob Aman; 02.02.2016
comment
@BobAman, вы утверждаете, что «как только один из нас включит дополнительные правила, взаимодействия больше не будет». Но это неправда. Это все равно, что сказать, что если ваш сервер использует POP3, а мой сервер использует только IMAP, то взаимодействия больше нет, поэтому тот, кто написал IMAP, был неправ. Чувак, это называется добавить к технологии лучшую замену. Решение проблемы с IMAP такое же, как и с ; разделитель в URL-адресах: помните об обоих и используйте тот, который использует сервер. Нет путаницы. Вы делаете это сложнее, чем есть на самом деле. Старые технологии устаревают по новым стандартам. Это одна из них. - person Shawn Kovac; 05.02.2016
comment
Итак, Боб, я спрашиваю вас, почему отсутствует функциональная совместимость? человек может использовать только разделитель, который использует сам сервер, независимо от того, какой символ использует веб-сервер. Красота ; заключается в том, что есть несколько преимуществ по сравнению с использованием амперсанда: амперсанд требует дополнительного кодирования, которое почти никогда не выполняется в реальности, что я объяснил в своем ответе. Так что я не вижу ни одного способа; уступает использованию амперсанда, за исключением того, что некоторые серверы отстают в реализации более нового лучшего варианта. меня никогда не удивляло, что так много людей отвергают что-то только потому, что оно новое. - person Shawn Kovac; 05.02.2016
comment
Вы, кажется, смущены тем, что влечет за собой взаимодействие. Органы по стандартизации обычно требуют как минимум двух взаимодействующих реализаций, написанных разными сторонами. Это не взаимодействие, если клиент и сервер написаны одними и теми же людьми. Выбор того же символа-разделителя, что и сервер, вообще не является взаимодействием. Весь смысл спецификации в том, что я должен точно знать, как интерпретировать часть данных на основе правил, заданных в спецификации. Если мне нужно знать, что вы поддерживаете или не поддерживаете другой символ-разделитель, это «вне диапазона» и на самом деле это больше не взаимодействие. - person Bob Aman; 09.02.2016
comment
@BobAman, я совершенно не согласен с вашим выводом. Следуя вашей логике, как насчет того, чтобы использовать этот который имеет ту же логику. Взаимодействие не является взаимодействием, если оно использует шестнадцатеричные цвета, потому что я должен знать, что другая сторона использует шестнадцатеричный формат вместо десятичного. Боб, все, вся информация является частью спецификации, независимо от того, используются ли в ней двоичные, шестнадцатеричные, десятичные или, что еще лучше, дюжинные числа, используются ли в разделителях URL лучший выбор точки с запятой или архаичных амперсандов, независимо от того, используется ли UTF-8 или другой набор символов. Все это является частью спецификаций взаимодействия. - person Shawn Kovac; 19.02.2016
comment
Но я понимаю вашу точку зрения, что когда вам нужно, чтобы 2 сервера взаимодействовали друг с другом, нам нужно знать, какой символ разделителя URL-адресов использует этот сервер, и это «не нужно делать». Но все тесты не должны выполняться в вашем теоретическом смысле. Реальность нашей ИТ-индустрии такова, что тщательное тестирование всегда необходимо. Если мы пропустим его, мы можем рассчитывать на то, что позже найдем ошибки. Тестирование этого разделителя между двумя серверами является практичным решением. Это не ошибка взаимодействия, а выбор между дюймами и сантиметрами при построении проекта. Просто разные "языки". - person Shawn Kovac; 19.02.2016
comment
Вся моя точка зрения заключается в том, что при выборе & или ; используется, точка с запятой имеет гораздо больше преимуществ. Но & имеет популярность, как десятичная была популярна до двоичной и шестнадцатеричной. Но были причины использовать каждый из них. Например, в CSS мы можем указывать цвета в десятичном или шестнадцатеричном формате. Это удобно. это дает нам больше возможностей. Разделитель Ampersand QueryString имеет ошибки, потому что большинство реализаций запрограммированы неправильно, и большинство людей не знают об этом! Но это укусит большинство из них позже. Используя амперсанд, НЕОБХОДИМО тщательно проверить! :( Разделитель точки с запятой требует меньше проверки для всех. - person Shawn Kovac; 19.02.2016
comment
Почему бы не использовать вопросительный знак не только для введения запроса, но и для разделения каждого присваивания в запросе? Это уменьшает количество символов, которые необходимо экранировать, если они должны появиться в назначении, на один, и упрощает синтаксический анализ запроса, когда это необходимо. - person David Spector; 09.10.2018
comment
@DavidSpector, я не могу сказать наверняка, но я предполагаю, что вопросительный знак используется чаще, чем точка с запятой. Нужен персонаж, который не является обычным. Реже используется ключ. Между амперсандом, точкой с запятой и вопросительным знаком я считаю, что точка с запятой меньше используется в английском тексте. Это основная причина, по которой точка с запятой приводит к меньшему количеству проблем. Но любую из трех можно использовать без какой-либо системы с ошибками, разработчики IF просто тщательно протестируют ее. Но разработчики просто не тестируют тщательно и в целом не внимательно. Таким образом, причина, по которой более редкий гольц лучше. - person Shawn Kovac; 21.08.2019
comment
Я перестал читать, когда дошел до второго появления слова вуд. Действительно? - person Nicholas Shanks; 12.11.2020