Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Encoding и CMD, проблема с русским текстом 
:(
    Опции темы
codegenz
Дата 17.9.2009, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 17.9.2009

Репутация: нет
Всего: нет



Задача получить содержимое папки именно через командную строку. Все работает. Но при одном условии. В пути несодержится русских символов. Когда они появляются. Как на примере ниже, то в строке result пишется сообщение об ошибке.

Вопрос. Как заставить понимать русские символы при передачи их с C# в cmd ??
Код

string cmdline = "dir C:\\Documents and Settings\Admin\Мои документы\";
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.CreateNoWindow = true;
cmd.StartInfo.UseShellExecute = false;
cmd.Start();
cmd.StandardInput.WriteLine(cmdline);
cmd.StandardInput.Flush();
cmd.StandardInput.Close();

string result = cmd.StandardOutput.ReadToEnd();

PM MAIL   Вверх
Fortnox
Дата 17.9.2009, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 31.10.2008
Где: Ростов-на-Дону

Репутация: 14
Всего: 22



Все потому, потому что тип string в .NET в юникоде, а командная строка Windows по-умолчанию использует кодовую страницу 866 (DOS 866), которая не понимает юникод.

Решения следующие (которые я встречал):
1) При запуске процесса cmd.exe изменить его кодовую страницу, путем указания аргумента: "/k chcp кодовая_страница"
2) Перекодировать строки, которые возвращаются от cmd.exe
3) Ну а я обычно использую такой "финт ушам":
Код

            System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo("cmd.exe");
            psi.RedirectStandardInput = true;
            psi.RedirectStandardOutput = true;
            psi.StandardOutputEncoding = Encoding.GetEncoding(866);
            psi.UseShellExecute = false;
            psi.Arguments = "/c dir e:\\Документы\\";
            System.Diagnostics.Process proc = new System.Diagnostics.Process();
            proc.StartInfo = psi;
            proc.Start();
            System.IO.StreamReader sr = proc.StandardOutput;
            string result = sr.ReadToEnd();




Это сообщение отредактировал(а) Fortnox - 17.9.2009, 08:49
PM MAIL   Вверх
codegenz
Дата 17.9.2009, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 17.9.2009

Репутация: нет
Всего: нет



Приогромнейшее Вам спасибо. Это как раз то что я искал! 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0391 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.