Помогите разобраться с кодировкой. Хочу декодировать IBM866. Начальный текст
("“бв ®ўЄ бўп§Ё б tel...\n\nЋиЁЎЄ б«г¦Ўл г¤ «Ґ®Ј® ¤®бвгЇ 797 - Џ®¤Є«о票Ґ Є бҐаўҐаг г¤ «Ґ®Ј® ¤®бвгЇ Ґ гбв ®ў«Ґ®, в Є Є Є Ґ ©¤Ґ ¬®¤Ґ¬.\n\n—в®Ўл ўлўҐб⨠ᢥ¤ҐЁп ® ¤ ®© ®иЁЎЄҐ:\n\tўўҐ¤ЁвҐ 'hh netcfg.chm' Ё ў ‘Їа ўЄҐ\n\tўлЎҐаЁвҐ а §¤Ґ« а §аҐиҐЁп Їа®Ў«Ґ¬, § ⥬ б®®ЎйҐЁ© ®Ў ®иЁЎЄ е Ё ©¤ЁвҐ 797.\n").
После выполнения кода вместо русских символов абракадабра.
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo = new System.Diagnostics.ProcessStartInfo(PathP, Param);
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.UseShellExecute = false;
p.Start();
StringBuilder q = new StringBuilder();
while (!p.HasExited)
{
q.Append(p.StandardOutput.ReadToEnd());
}
string r = q.ToString();
Encoding srcEncodingFormat = Encoding.GetEncoding("IBM866");
Encoding dstEncodingFormat = Encoding.GetEncoding(1251);
byte[] originalByteString = srcEncodingFormat.GetBytes(r);
byte[] convertedByteString = Encoding.Convert(srcEncodingFormat,
dstEncodingFormat, originalByteString);
string finalString = dstEncodingFormat.GetString(convertedByteString);
Program.log.Info(" ID (" + ID + ") |" + "Answer: " + finalString);
У вас лишняя операция. После srcEncodingFormat.GetBytes(r)
вы получаете исходные байты, которые нужно просто прочитать в нужной кодировке. Соответственно промежуточный Encoding.Convert
не нужен.
Получается как-то так:
Encoding wrongEncoding = p.StandardOutput.CurrentEncoding;
Encoding realEncoding = <тут кодировка, в которой байты на самом деле>;
byte[] originalBytes = wrongEncoding.GetBytes(r);
string result = realEncoding .GetString(originalBytes);
У меня, например, для
Encoding wrongEncoding = Encoding.GetEncoding(1251);
Encoding realEncoding = Encoding.GetEncoding(866);
получается
ст новк связи с tel...
Ошибк службы уд ленного доступ 797 - Подключение к серверу уд ленного доступ не уст новлено, т к к к не н йден модем.
Чтобы вывести сведения о д нной ошибке:
введите 'hh netcfg.chm' и в Спр вке
выберите р здел р зрешения проблем, з тем сообщений об ошибк х и н йдите 797.
Судя по всему, консольное приложение пишет в поток в кодировке CP866 (DOS), а p.StandardOutput
считает, что эти символы в кодировке CP1251 (ANSI).
Возможно, более правильным решением было бы вовсе не читать из StandardOutput
, а получить StandardOutput.BaseStream
, и «надеть» на него StreamReader
с правильной кодировкой. Вы видите, что при перегоне между кодировками теряются символы.
Например, вот такой код:
var p = new Process()
{
StartInfo = new ProcessStartInfo(
Environment.ExpandEnvironmentVariables("%COMSPEC%"),
"/c dir " + Environment.GetFolderPath(Environment.SpecialFolder.Windows))
{
RedirectStandardOutput = true,
UseShellExecute = false
}
};
p.Start();
var stream = p.StandardOutput.BaseStream;
using (var reader = new StreamReader(stream, Encoding.GetEncoding(866)))
{
string r = reader.ReadToEnd();
Console.WriteLine(r);
}
выдаёт:
Том в устройстве C имеет метку CODE
Серийный номер тома: 1061-1668
Содержимое папки C:\WINDOWS
12.03.2018 20:44 <DIR> .
12.03.2018 20:44 <DIR> ..
29.09.2017 14:46 <DIR> addins
22.10.2017 10:32 <DIR> appcompat
16.03.2018 02:21 <DIR> apppatch
23.03.2018 21:43 <DIR> AppReadiness
и т. д.
Откуда получить кодовую страницу 866 программным путём? Для этого нужно знать системную локаль. Её можно, кажется, добыть, запомнив CultureInfo.CurrentCulture
в начале программы
var systemCI = CultureInfo.CurrentUICulture;
или через P/Invoke:
int systemlcid = GetSystemDefaultLCID();
var systemCI = CultureInfo.GetCultureInfo(systemlcid);
GetSystemDefaultLCID
определяется как
[DllImport("kernel32.dll")]
static extern int GetSystemDefaultLCID();
Имея локаль, можно получить кодовую страницу так:
var oemCodePage = systemCI.TextInfo.OEMCodePage;
var oemEncoding = Encoding.GetEncoding(oemCodePage);
Немного не догоняюВот в GroupBy описано, что я могу подать на вход функцию System
В процессе разработки иногда сталкивался что изначально был выбран размер для объектов на сцене, приходилось scale у трансформы уменьшать...
Не могу найти как можно изменять размер изображения picturebox через textbox, необходимо чтоб изменялась только картинка по размеру а не сам элементКто-нибудь...
Не могу никак разобраться, в чем проблемаПочему не работает?