none
Чтение и сохранение русского текста в Блокнот. RRS feed

  • Вопрос

  • Здравствуйте. Извиняюсь если уже было, но впервые столкнулся с такой проблемой:


    Дан файл .txt в стандартной кодировке (не помню в какой там винда
    создаёт) с русскими буковками. Файл читается при помощи StreamReader:

    using (StreamReader sr = new StreamReader(@file_path_TextBox.Text, Encoding.Default)) 

    А как записать его обратно в файл, чтобы русские буковки не превращались в
    крокозябры?

    using (StreamWriter sw = new StreamWriter(@file_path_TextBox.Text + "_edited.txt", false)) {

    //тут идёт преобразование, в итоге получаем код символа int temp_ch;

    byte[] bytes = BitConverter.GetBytes(temp_ch); sw.Write(System.Text.Encoding.Default.GetChars(bytes)); }

    Но в итоге в файле вновь получается еретическое
    писание. Символы в файл пиштся по одному, если это важно. Как сделать, чтобы оно
    наконец таки нормально записало русский текст в .txt?

    Понимаю, что ответ лежит где-то на поверхности, но я уже запутался с кодировками, пытаясь понять что, как и в какой кодировке сохраняет. (>_<)


    MSDN AA User



    19 апреля 2012 г. 4:12

Ответы

  • Уфффффф. Проблема решена. Выкладываю коды потоков шифровки и дешифровки текстового документа. Косяк тут был один, но в чём он - не знаю как правильно описать.

    //тут шифрование методом замены using (StreamReader sr = new StreamReader(@file_path_TextBox.Text, Encoding.Default)) //открываем поток чтения { int j = 0; using (StreamWriter sw = new StreamWriter(@file_path_TextBox.Text + "_crypted.txt", false)) { while (sr.Peek() >= 0) { if (j >= key_word_passwordBox.Password.Length) j = 0; int temp_ch = (sr.Read() + key_word_passwordBox.Password[j]) % 65536; sw.Write((char)temp_ch); j++; } } } //тут дешифровка using (StreamReader sr = new StreamReader(@file_path_TextBox.Text)) { int j = 0; using (StreamWriter sw = new StreamWriter(@file_path_TextBox.Text + "_encrypted.txt", false, Encoding.Default)) { while (sr.Peek() >= 0) { if (j >= key_word_passwordBox.Password.Length) j = 0; int temp_ch = (65536 + (sr.Read() - key_word_passwordBox.Password[j])) % 65536; //алгоритм дешифрования sw.Write((char)temp_ch); j++; }

    }

    }



    MSDN AA User


    19 апреля 2012 г. 19:00

Все ответы

  • Вообще такая, например, запись в текстовый файл не должна вызывать проблем.

    using (StreamWriter sw = new StreamWriter(@"c:\edited.txt", false)) { string str = "Привет мир"; sw.Write(str); }

    "//тут идёт преобразование, в итоге получаем код символа int temp_ch;" - что за преобразования?
    19 апреля 2012 г. 5:43
    Модератор
  • Здравствуйте.

    А сам массив символов что вы получаете вы проверяли? Может уже в нем кроется проблема? Также в конструкторе StreamWriter можете задать кодировку, но в кодировке по умолчанию должно все нормально записываться. Может быть вам при преобразовании из массива байт в массив символов попробовать использовать Utf8 кодировку или Cp1251.

    И чем вы смотрите выходящий файл - обычным блокнотом? Можно попробовать установить Notepad++ и открыть в нем, будет ли там отображаться теккст нормально?


    Для связи [mail]

    19 апреля 2012 г. 5:45
  • Вот полный код потока чтения и потока записи. Это реализация шифрования при помощи матрицы Вижинера. С латинскими символами работает без проблем, открываю стандартным Блокнотом и необходимо сделать, чтобы стандартным блокнотом можно было посмотреть расшифрованный текст.

    Ниже приведены обработчики событий шифрования и дешифрования соответственно:

    private void crypt_button_Click(object sender, RoutedEventArgs e)
            {
                try
                {
                    if (File.Exists(@file_path_TextBox.Text + "_crypted.txt")) File.Delete(@file_path_TextBox.Text + "_crypted.txt");
    
                    if (replace_RadioButton.IsChecked == true)
                    {
                        //тут шифрование методом замены
                        using (StreamReader sr = new StreamReader(@file_path_TextBox.Text, Encoding.Default)) //открываем поток чтения
                        {
                            int j = 0;
                            using (StreamWriter sw = new StreamWriter(@file_path_TextBox.Text + "_crypted.txt", false))
                            {
                                while (sr.Peek() >= 0)
                                {
                                    if (j >= key_word_passwordBox.Password.Length) 
                                        j = 0;
    
                                    int temp_ch = (sr.Read() + key_word_passwordBox.Password[j]) % 65536;
    
                                    byte[] bytes = BitConverter.GetBytes(temp_ch);
                                    sw.Write(System.Text.Encoding.Default.GetChars(bytes)[0]);
                                    j++;
                                }
                            }
                        }
                        MessageBox.Show("Шифрование завершено", "^_^");
                    }
                    else
                    {
                        //тут шифрование методом подстановки
                    }
                }
    
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "(>_<)");
                    return;
                }
            }

    private void encrypt_button_Click(object sender, RoutedEventArgs e)
            {
                try
                {
                    using (StreamReader sr = new StreamReader(@file_path_TextBox.Text, Encoding.Default))
                    {
                        if (replace_RadioButton.IsChecked == true)
                        {
                            //расшифровка методом замены
                            int j = 0;
                            using (StreamWriter sw = new StreamWriter(@file_path_TextBox.Text + "_encrypted.txt", false))
                            {
                                while (sr.Peek() >= 0)
                                {
                                    if (j >= key_word_passwordBox.Password.Length)
                                        j = 0;
    
                                    int temp_ch = (65536 + (sr.Read() - key_word_passwordBox.Password[j])) % 65536; //алгоритм дешифрования
    
                                    //удостовериться втф...
                                    byte[] bytes = BitConverter.GetBytes(temp_ch);
                                    sw.Write(Encoding.ASCII.GetChars(bytes));
                                    j++;
                                }
                            }
                            MessageBox.Show("Расшифровка завершена", "^_^");
                        }
                        else
                        {
                            //расшифровка методом перестановки
                        }
                    }
                }
    
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "(>_<)");
                    return;
                }
            }

    Вот что тут не так?

    MSDN AA User

    19 апреля 2012 г. 13:09
  • Попробуйте заменить:

    sw.Write(Encoding.ASCII.GetChars(bytes));

    на

    sw.Write(Encoding.Default.GetChars(bytes));

    19 апреля 2012 г. 15:11
    Отвечающий
  • Удалось сделать следующее: если текст написать в Notepad++ в кодировке UTF-8 а после этого считать и переписать потоками с параметрами кодировки по-умолчанию и с делением на 65536 - то всё отлично. А вот в кодировке Encoding.Default - что-то не хочет русский язык использоваться.

    MSDN AA User

    19 апреля 2012 г. 18:11
  • Уфффффф. Проблема решена. Выкладываю коды потоков шифровки и дешифровки текстового документа. Косяк тут был один, но в чём он - не знаю как правильно описать.

    //тут шифрование методом замены using (StreamReader sr = new StreamReader(@file_path_TextBox.Text, Encoding.Default)) //открываем поток чтения { int j = 0; using (StreamWriter sw = new StreamWriter(@file_path_TextBox.Text + "_crypted.txt", false)) { while (sr.Peek() >= 0) { if (j >= key_word_passwordBox.Password.Length) j = 0; int temp_ch = (sr.Read() + key_word_passwordBox.Password[j]) % 65536; sw.Write((char)temp_ch); j++; } } } //тут дешифровка using (StreamReader sr = new StreamReader(@file_path_TextBox.Text)) { int j = 0; using (StreamWriter sw = new StreamWriter(@file_path_TextBox.Text + "_encrypted.txt", false, Encoding.Default)) { while (sr.Peek() >= 0) { if (j >= key_word_passwordBox.Password.Length) j = 0; int temp_ch = (65536 + (sr.Read() - key_word_passwordBox.Password[j])) % 65536; //алгоритм дешифрования sw.Write((char)temp_ch); j++; }

    }

    }



    MSDN AA User


    19 апреля 2012 г. 19:00
  • Спасибо, что выложили решение.


    Для связи [mail]

    20 апреля 2012 г. 6:54