C # string.Split () Соответствует обеим слешам? - PullRequest
3 голосов
/ 05 апреля 2010

У меня есть веб-приложение .NET 3.5, написанное на C #, которое переписывает URL, который включает путь к файлу, и я столкнулся с проблемой. Когда я звоню string.Split('/'), это соответствует символам '/' и '\'. Это ... должно случиться? Я предполагал, что он заметит, что значения ASCII отличаются, и пропустит это, но, похоже, я ошибаюсь.

// url = 'someserver.com/user/token/files\subdir\file.jpg
string[] buffer = url.Split('/');

Приведенный выше код дает string[] с 6 элементами в нем ... что кажется нелогичным. Есть ли способ заставить Split() совпадать ТОЛЬКО с косой чертой? Сейчас мне повезло, поскольку косые черты в конце URL-адреса, я могу просто объединить остальные элементы в string[], но это большая работа для того, что мы делаем, а не отличное решение основной проблемы.

Кто-нибудь сталкивался с этим раньше? Есть простой ответ? Я ценю это!

Подробнее код:

url = HttpContext.Current.Request.Path.Replace("http://", "");
string[] buffer = url.Split('/');

Оказывается, Request.Path и Request.RawUrl меняют мои слэши, что смешно. Итак, самое время изучить это и выяснить, как получить URL-адрес от функции, которая не нарушает мое форматирование. Спасибо всем за игру с моим безумием, извините, это был вводящий в заблуждение вопрос!

Ответы [ 6 ]

7 голосов
/ 05 апреля 2010

Когда я пытаюсь сделать следующее:

string url = @"someserver.com/user/token/files\subdir\file.jpg";
string[] buffer = url.Split('/');
Console.WriteLine(buffer.Length);

... Я получаю 4. Отправьте больше кода.

1 голос
/ 05 апреля 2010

Что-то еще происходит, вставьте больше кода.

string str = "a\\b/c\\d";
string[] ts = str.Split('/');
foreach (string t in ts)
{
    Console.WriteLine(t);
}

выходы

a\b
c\d

как и должно быть. Я предполагаю, что вы конвертируете / в \ куда-то.

0 голосов
/ 05 апреля 2010

эти две функции, вероятно, преобразуют \ в /, потому что \ не является допустимым символом в URL (см. Какие символы делают URL недействительным? ). Браузер (НЕ C #, как вы понимаете) предполагает, что когда вы используете этот недопустимый символ, вы имеете в виду /, поэтому он «исправляет» его для вас. Если вы хотите \ в своем URL, вам нужно сначала его кодировать.

Сами браузеры действительно вносят изменения в запрос, даже если он негласно. Чтобы убедиться в этом, просто включите fiddler и посмотрите на URL-адреса, которые действительно отправляются, когда вы переходите на такой URL-адрес. IE и Chrome на самом деле изменяют \ в / в поле URL в самом браузере, FireFox - нет, но запрос в любом случае выполняется таким образом.

0 голосов
/ 05 апреля 2010

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

Это всего лишь предположение, конечно.

Лучшим способом решения этой проблемы может быть изменение приложения для кодирования пути другим способом (например, "% 5C" для обратной косой черты?).

0 голосов
/ 05 апреля 2010

Обновление:
Как насчет этого:

Regex.Split(url, "/");
0 голосов
/ 05 апреля 2010

Вы можете использовать регулярное выражение, чтобы преобразовать все \ слэши в временный символ, разделить на /, а затем снова преобразовать временные символы в \. Боль в заднице, но один вариант.

...