2009-12-18 2 views
4

У меня есть файл: // ссылки с неанглийскими символами, которые являются UrlEncoded в UTF-8. Чтобы эти ссылки работали в браузере, я должен их перекодировать.Re-encode url from utf-8, закодированный в iso-8859-1, закодированный

file://development/H%C3%A5ndplukket.doc 

становится

file://development/H%e5ndplukket.doc 

У меня есть следующий код, который работает:

public string ReEncodeUrl(string url) 
{ 
    Encoding enc = Encoding.GetEncoding("iso-8859-1"); 
    string[] parts = url.Split('/'); 
    for (int i = 1; i < parts.Length; i++) 
    { 
     parts[i] = HttpUtility.UrlDecode(parts[i]); // Decode to string 
     parts[i] = HttpUtility.UrlEncode(parts[i], enc); // Re-encode to latin1 
     parts[i] = parts[i].Replace('+', ' '); // Change + to [space] 
    } 
    return string.Join("/", parts); 
} 

Есть уборщик способ сделать это?

+0

Фактически кодировка, используемая в кодировке URI, зависит от сервера. W3C рекомендует использовать UTF-8. Но ... когда вы используете URL-адрес файла: //, браузер является сервером, поэтому он зависит от браузера ... если вы планируете использовать его на незаземленной платформе (не ISO-8859-1), проверьте его. .. – helios

ответ

1

Я думаю, что это довольно чисто на самом деле. Он читается, и вы сказали, что он работает правильно. Пока реализация скрыта от потребителя, я бы не стал беспокоиться о том, чтобы сжать последнее улучшение.

Если вы делаете эту операцию чрезмерно (например, сотни исполнений за каждое событие), я бы подумал о том, чтобы выполнить реализацию из UrlEncode/UrlDecode и передать их друг другу, чтобы получить повышение производительности там, удалив необходимость в разделении строк/join, но тестирование должно было бы доказать это в любом случае и определенно не будет «чистым» :-)

+0

Я на самом деле соглашусь с вашим ответом на это, так как, похоже, не получается «ускорить» этот процесс. И, как вы говорите, это читаемо и выражает намерение. –

0

Хотя я не вижу реального способа его изменения, что бы изменить ситуацию, не следует ли заменять + в пространстве перед вами UrlEncode, чтобы он превратился в% 20?

+0

UrlEncode превратит пространство в + для кодировок latin1. Вот почему я заменяю его пространством. Возможно, вместо этого вместо этого заменил +%. –

0

общепризнанно некрасивым и на самом деле не улучшение, но может перекодировать все это (во избежание раскола/итерацию/присоединиться) затем .Привернуть («% 2f», «/»)

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

+0

Пространства делают файл: // ссылки работают в IE, чтобы открыть файл в нужном месте. Вероятно, я мог бы использовать% 20, как указано в моем предыдущем комментарии, но + должен идти. Это не сработает. –

+0

И он не будет более чистым, так как мне нужны замены для% 2f (/),% 3a (:) и + (пробел). –