Кодирование URL с помощью C#

Код изначально написан как комментарий исходного кода ControlThrowable .

Точно так же, как вы упомянули, вы можете удалить строку, если у вас нет возможности создать пользовательское исключение, расширяющее ControlThrowable, хотя этот код должен был сказать вам, что не перехватывать и подавлять ControlThrowable. Если бы код был

try {
  // Body might throw arbitrarily
} catch {
  case c: ControlThrowable => throw c // propagate
  case t: Throwable        => log(t)  // log and suppress
}

, то было бы легче понять, что код пытается сказать.

К вашему сведению, в scala 2.12 есть ошибка, которую невозможно устранить ControlThrowable.

import scala.util.control.Breaks
import scala.util.control.ControlThrowable
val b = new Breaks

b.breakable {
  try {
    for (num <- 1 to 10) {
      num match {
        case 5 => throw new RuntimeException("5")
        case 6 => b.break
        case x => println(x)
      }
    }
  } catch {
     case c: Throwable => println(c)
  }
}

Этот код должен печатать числа до 10, потому что b.break производит ControlThrowable, и он подавляется до того, как b.breakable его получает. Но из-за ошибки он печатает до 5.

Таким образом, используя scala 2.12, ControlThrowable будет распространяться в любом случае. Это не требует линии case c: ControlThrowable => throw c // propagate. Но для целей миграции Вам не следует так писать.

Фактически, эта ошибка будет исправлена ​​в 2.13.x https://github.com/scala/scala/pull/7413

316
задан Stephen Kennedy 17 February 2018 в 04:03
поделиться

3 ответа

Редактирование: Обратите внимание, что этот ответ теперь устарел. См. ответ Siarhei Kuchuk ниже для лучшей фиксации

, UrlEncoding сделает то, что Вы предлагаете здесь. С C# Вы просто используете HttpUtility, как упомянуто.

Вы можете также Regex запрещенные символы и затем заменять, но это становится намного более сложным, поскольку у Вас должна будет быть некоторая форма конечного автомата (переключатель... случай, например) для замены правильными символами. С тех пор UrlEncode делает это впереди, это довольно легко.

Что касается Linux по сравнению с окнами, существуют некоторые символы, которые приемлемы в Linux, которые не находятся в Windows, но я не волновался бы об этом, поскольку имя папки может быть возвращено путем декодирования строки URL, использования UrlDecode, таким образом, Вы можете круглое прохождение изменения.

185
ответ дан Community 23 November 2019 в 01:04
поделиться

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

string url = HttpUtility.UrlEncode("http://www.google.com/search?q=Example");

уступит

http%3a%2f%2fwww.google.com%2fsearch%3fq%3dExample

, Это, очевидно, не собирается работать хорошо. Вместо этого необходимо закодировать ТОЛЬКО значение пары ключ/значение в строке запроса, как это:

string url = "http://www.google.com/search?q=" + HttpUtility.UrlEncode("Example");

, Надо надеяться, который помогает. Кроме того, как упомянутый teedyay, необходимо будет все еще удостовериться, что недопустимые символы имени файла удалены, или иначе файловой системе не понравится путь.

270
ответ дан Community 23 November 2019 в 01:04
поделиться

Кодирование URL легко в.NET. Используйте:

System.Web.HttpUtility.UrlEncode(string url)

, Если это будет декодироваться для получения имени папки, необходимо ли будет все еще исключить символы, которые не могут использоваться на имена папок (*?,/, и т.д.)

57
ответ дан teedyay 23 November 2019 в 01:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: