c# конвертация кодировки

143
25 декабря 2021, 22:10

Требуется программа которая будет текст из 1252 переводить в 1251.

   var bytes = Encoding.GetEncoding(1252).GetBytes(textBox1.Text);
   textBox2.Text = Encoding.GetEncoding(1251).GetString(bytes);

Отлично справляется. Но хотелось бы без копи паста просто выбирать файл. Делаю по аналогии.

        string file_data = System.IO.File.ReadAllText(path);
        var bytes = Encoding.GetEncoding(1252).GetBytes(file_data);
        string file_data_in_1251 = Encoding.GetEncoding(1251).GetString(bytes);
        System.IO.File.WriteAllText(path + "_1251", file_data_in_1251);

И получают на выходе файл с ?????.

Попытка добавить

 string file_data = System.IO.File.ReadAllText(path, Encoding.GetEncoding(1252));

И

System.IO.File.WriteAllText(path + "_1251", file_data_in_1251, Encoding.GetEncoding(1251));

Толку не дала. Чяднт?

yte[] allData = File.ReadAllBytes(path);
    string file_data_in_1251 = Encoding.GetEncoding(1251).GetString(allData);
    System.IO.File.WriteAllText(path + "_1251", file_data_in_1251, Encoding.GetEncoding(1251));

Так часть файлов отрабатывает часть нет :(. При этом не рабочие файлы нормально конвертируются через изначальный вариант.

Последовательности байтов очень сильно отличаются от варианта получения из текста и из файла. Текст:

    [0] 32  byte
    [1] 60  byte
    [2] 32  byte
    [3] 116 byte
    [4] 97  byte
    [5] 103 byte
    [6] 32  byte
    [7] 107 byte
    [8] 32  byte
    [9] 61  byte

Файл:

    [0] 32  byte
    [1] 60  byte
    [2] 116 byte
    [3] 97  byte
    [4] 103 byte
    [5] 32  byte
    [6] 107 byte
    [7] 61  byte
    [8] 39  byte
    [9] 78  byte
Answer 1

Один из этих вариантов отработает. Вариант 1 читаем побайтово:

byte[] allData = File.ReadAllBytes(path);
string file_data_in_1251 = Encoding.GetEncoding(1251).GetString(allData);
System.IO.File.WriteAllText(path + "_1251", file_data_in_1251, Encoding.GetEncoding(1251));

Вариант 2 читаем построчно суём в массив - объединяем массив в строку - получаем из строки байты - переводим в строку с другой кодировкой.

System.IO.StreamReader file = new System.IO.StreamReader(path);
string line;
string lin2;
int counter = 0;
while ((line = file.ReadLine()) != null)
{
    counter++;
}
file.Close();
System.IO.StreamReader file2 = new System.IO.StreamReader(path);
string[] file_by_lines = new string[counter+5];
for(int i =0; i < counter; i++)
{
    lin2 = file2.ReadLine();
    if (!string.IsNullOrEmpty(lin2))
    {
        file_by_lines[i] = lin2;
    }
}
file2.Close();
string file_by_line = string.Concat(file_by_lines);
var b = Encoding.GetEncoding(1252).GetBytes(file_by_line);
string s = Encoding.GetEncoding(1251).GetString(b);
System.IO.File.WriteAllText(path + "_1251_variant1", s, Encoding.GetEncoding(1251));
READ ALSO
ADO.NET SCOPE_IDENTITY() Возвращает NULL

ADO.NET SCOPE_IDENTITY() Возвращает NULL

Что-то всё работало, а потом поломався! Данными база заполненаВсё работало

81
Смена сцены приводит к искажению виджета

Смена сцены приводит к искажению виджета

Когда выбираю в меню виджет интеграции с картами он выглядит так:

79
C# WPF Window открыть, после закрытия

C# WPF Window открыть, после закрытия

Есть класс производый от Window, который закрывается при помощи методаClose()

85
Проблема с выводом текста

Проблема с выводом текста

Ситуация следующая есть jsonФайл лежит в Assets/Json/file

90