Изменение кодировки текста

193
02 марта 2018, 14:06

Имеется конструкция, которая производит чтение данных либо с текстового файла, либо с клавиатуры. Возникло два вопроса:

  1. Что надо изменить, чтобы при чтении из файла корректно читался русский язык?

  2. Возможно, сможете помочь. Данная конструкция является частью программы по стеганографии. Если встраивается в аудио английский текст, то извлечение этого текста из аудио происходит корректно. Если же встраивается текст на русском языке, то происходит извлечение только лишь ровно половины спрятанного текста. В чем может быть проблема?

Код чтения с файла/с клавиатуры:

private Stream GetMessageStream()
{
    BinaryWriter messageWriter = new BinaryWriter(new MemoryStream());
    if (rdoMsgFile.Checked)
    {
        //чтение из файла
        var fs = new FileStream(txtMsgFile.Text, FileMode.Open);
        int fileLength = (int)fs.Length;
        messageWriter.Write(fileLength);
        byte[] buffer = new byte[fs.Length];
        fs.Read(buffer, 0, fileLength);
        messageWriter.Write(buffer);
        fs.Close();
    }
    else
    {
        // чтение с клавиатуры
        messageWriter.Write(txtMessage.Text.Length);
        messageWriter.Write(Encoding.UTF8.GetBytes(txtMessage.Text));
    }
    messageWriter.Seek(0, SeekOrigin.Begin);
    return messageWriter.BaseStream;
}
Answer 1
  1. Нет такого понятия — текстовый файл без кодировки. Текстовый файл обязательно имеет какую-то кодировку. Указывайте кодировку при открытии. Нет, надёжного метода узнать кодировку, не зная её, нет.

  2. Вы пишете в messageWriter длину текста в символах, а потом кладёте туда байты. Вероятно, проблема в этом: длина в символах не равна длине в байтах.

Кстати, как-то слишком сложно работаете с файлом. Я бы на вашем месте просто использовал

byte[] buffer = File.ReadAllBytes(txtMsgFile.Text);
messageWriter.Write(buffer.Length);
messageWriter.Write(buffer);

Но поскольку вам нужно перекодировать файл, скорее всего, корректнее будет так:

string text = File.ReadAllText(txtMsgFile.Text, encoding); // <-- encoding важно
byte[] buffer = Encoding.UTF8.GetBytes(text);

И вообще весь код выглядел бы тогда просто так:

string text = rdoMsgFile.Checked ?
    File.ReadAllText(txtMsgFile.Text, encoding) : txtMessage.Text;
byte[] buffer = Encoding.UTF8.GetBytes(text);
messageWriter.Write(buffer.Length);
messageWriter.Write(buffer);
READ ALSO
C#. Как заставить форму перемещаться удалив у нее рамку?

C#. Как заставить форму перемещаться удалив у нее рамку?

Добрый деньПодскажите как заставить форму перемещаться удалив у нее рамку? Тоесть у меня у MainForm выключен ControlBox и BorderStyle - None И форма не двигается...

174
Запуск и работы формы только при запущенном процессе

Запуск и работы формы только при запущенном процессе

Как можно сделать так, чтобы форма запускалась и работала только при запущенном процессе?

192
Как определить что программа запущена в первый раз?

Как определить что программа запущена в первый раз?

Как определить что программа запущена в первый раз? Без создания папок или файлов настроекЭти способы я знаю

168
ASP.NET Core 2: CORS-ошибка

ASP.NET Core 2: CORS-ошибка

Есть проект, который опубликован как контейнер на Amazon ECS

198