В какой кодировке модуль Python3 выводит текст?
запускаю процесс "imageToText.py", который печатает результат: print("какой то русский текст")
а в консоли приложения получается текст в кокой то кодировке
internal static string[] GetImagesCaptions(IEnumerable<string> imagesPaths)
{
string path = @"C:\Users\Alexey\source\repos\PythonApplication2\GlobalEnv\imageToText.py";
string pythonPath = @"C:\Users\Alexey\AppData\Local\Programs\Python\Python310\python.exe";
string imagesRow = imagesPaths.Select(p => $" \"{p}\"").JoinToString();
ProcessStartInfo python = new()
{
FileName = pythonPath,
Arguments = "-W ignore " + path + imagesRow,
UseShellExecute = false,
RedirectStandardOutput = true,
//StandardOutputEncoding = ?
};
using Process? process = Process.Start(python);
ArgumentNullException.ThrowIfNull(process);
using StreamReader reader = process.StandardOutput;
return reader.ReadToEnd().Split(Environment.NewLine);
/**
"╟ръЁ√Єшх ЄрсышЎ√ ё ўшёыюь ы■фхщ ш ъюышўхёЄтюь ы■фхщ"
"└ЁрЇшЁютрээр ърЁЄр ьшЁр ёю ёЄЁрэрьш т ёшэхь ш ёшэхь ЎтхЄх"
""
*/
}
Ответы (3 шт):
Автор решения: Tolomika
→ Ссылка
Это не в какой-то кодировке. Из-за того, что вы явно не указали что за кодировка используется в читаемом файле произошла неправильная интерпретация байтов.
Вот как можно выводить корректно данные для кодировки UTF-8
:
internal static string[] GetImagesCaptions(IEnumerable<string> imagesPaths)
{
string path = @"C:\Users\Alexey\source\repos\PythonApplication2\GlobalEnv\imageToText.py";
string pythonPath = @"C:\Users\Alexey\AppData\Local\Programs\Python\Python310\python.exe";
string imagesRow = imagesPaths.Select(p => $" \"{p}\"").JoinToString();
ProcessStartInfo python = new()
{
FileName = pythonPath,
Arguments = "-W ignore " + path + imagesRow,
UseShellExecute = false,
RedirectStandardOutput = true,
StandardOutputEncoding = Encoding.UTF8 // Установка кодировки UTF-8
};
using Process? process = Process.Start(python);
ArgumentNullException.ThrowIfNull(process);
using StreamReader reader = process.StandardOutput;
return reader.ReadToEnd().Split(Environment.NewLine);
}
Автор решения: Headhuntez
→ Ссылка
Чтобы узнать кодировку, можно воспользоваться методом:
>>> import locale
>>> locale.getpreferredencoding()
'cp1251'
>>>
и задать такую же кодировку стандартного вывода:
StandardOutputEncoding = Encoding.GetEncoding("Windows-1251")
Автор решения: Qwertiy
→ Ссылка
Текст в однобайтовой кодировке, если предполагается кириллица, то 1251.
А консоль эти символы в 866 вывела - вот чушь и получилась...