2013-06-13 9 views
0

У меня есть процесс, который создает файлы ярлыков Windows (.url). Файлы кодируются в UTF-8. Файлы содержат раздел [InternetShortcut], где указан URL =. В этом случае это URL-адреса файлов: ///, которые позволяют людям открывать пути в локальной сети. URL-адреса - это все пути UNC.Ярлыки Windows и символы Unicode в URL-адресе

Обычно процесс работает нормально. Но когда UNC-путь содержит символы Unicode, такие как «í» из примера кода ниже, Windows не может «найти» URL-адрес, когда конечный пользователь пытается открыть ярлык Интернета из проводника Windows:

Образец файл следующим образом:

[InternetShortcut] 
URL=file:///\\lt-splourde\d$\POC\Montería Test\ 
IconIndex=1 

Когда я открываю файл .url пример выше с помощью текстового редактора, я вижу путь с соответствующими символами Unicode. Но когда я пытаюсь открыть файл из Проводника Windows, чтобы получить доступ к пути, Windows сообщает, что он не может получить доступ к этому пути, и, похоже, он искажает символы Unicode.

Исходный код, который создает эти ярлыки следующим образом:

private void CreateShortcutAsUrl(string uncRootPath, string name, string path, int projectId) 
{ 
    path = path + (path.EndsWith(@"\") ? "" : @"\"); 

    using (StreamWriter writer = new StreamWriter(
     String.Format(@"{0}\{1}\{2}.url", uncRootPath, 
      ShortcutsDirectory, new FileServerController().SanitizeNameForDirectory(name)), 
      false, Encoding.UTF8)) 
    { 
     writer.WriteLine(@"[InternetShortcut]"); 
     writer.WriteLine(@"URL=file:///" + path); 
     writer.Flush(); 
    } 
} 

Кто-нибудь знает решение для этого вопроса?

Спасибо!

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

+0

было бы лучше, если бы процесс, который записывает URL-адреса использует [ 'InternetCanonicalizeUrl'] (HTTP:. //msdn.micr osoft.com/en-us/library/windows/desktop/aa384342(v=vs.85).aspx). Это ваш процесс? У вас есть исходный код? –

+0

Привет, Роджер, у меня есть источник. Я напишу выше –

ответ

1

Попробуйте .NET эквивалент InternetCanonicalizeUrl, который System.Uri.EscapeUriString, так что-то вроде этого (предполагая, что ваш URI в szOriginalString

String szEscapedString = System.Uri.EscapeUriString(szOriginalString); 

Тогда напишите szEscapedString как URI вместо оригинала

+0

Привет, Роджер, спасибо за предложение. Я попытался пересмотреть линию следующим образом, но та же проблема все еще происходит. Считаете ли вы, что эта реализация кажется правильной? writer.WriteLine (@ "URL =" + System.Uri.EscapeUriString ("file: ///" + path)); –

+0

@ShanPlourde да, что выглядит правильно, он должен дать вам URL-адрес: ///% 5C% 5Clt-splourde% 5Cd $% 5CPOC% 5CMonter% C3% ADa% 20Test% 5C', но, как вы говорите, это переводит по-разному когда он пытается получить к нему доступ. Я снова подумаю :-( –

+0

@ShanPlourde на самом деле просто протестирован снова и написано с 'Encoding.UnicodeEncoding' * does *, похоже, работает. Можете ли вы попробовать? Так что просто измените кодировку и забудьте о бит' EscapeUriString'. –