Кодировка файла

Jerard

Client
Регистрация
11.04.2013
Сообщения
506
Благодарностей
225
Баллы
43
Есть файл в кодировке windows-1251, нужно его преобразовать в UTF-8. Как это сделать? Через Notepad++ не катит, так как это файл подгружается во время выполнения проекта, потом удаляется.
 

silent

Client
Регистрация
05.04.2014
Сообщения
237
Благодарностей
85
Баллы
28
лови
Код:
var input = "тут были котики";
var win1251bytes = Encoding.Unicode.GetBytes(input);
var utf8Bytes = Encoding.Convert(
                Encoding.Unicode, Encoding.GetEncoding("UTF-8"), win1251bytes);
string s = System.Text.Encoding.Default.GetString(utf8Bytes);
return s;
 

silent

Client
Регистрация
05.04.2014
Сообщения
237
Благодарностей
85
Баллы
28
Код:
var text = project.Lists["text"];
for(int i=0; i < text.Count; i++)
    {
        var input = text[i];
        var win1251bytes = Encoding.Unicode.GetBytes(input);
        var utf8Bytes = Encoding.Convert(Encoding.Unicode, Encoding.GetEncoding("UTF-8"), win1251bytes);
        string s = System.Text.Encoding.Default.GetString(utf8Bytes);
        text.Add(s);
    }
для всего файла думаю примерно так должно было бы работать, но я шарп знаю всего пару дней, так что допиливай сам :-)
 

Jerard

Client
Регистрация
11.04.2013
Сообщения
506
Благодарностей
225
Баллы
43
А в какое место путь к файлу пишется?) Предположим путь лежит в переменной {-Variable.1-}
 

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
901
Баллы
113
Я хз работает или нет, но вроде работает, но лучше результаты писать или во второй список, или так
Код:
text[i]=s;
 

silent

Client
Регистрация
05.04.2014
Сообщения
237
Благодарностей
85
Баллы
28
Я хз работает или нет, но вроде работает, но лучше результаты писать или во второй список, или так
Код:
text[i]=s;
как раз с утра прогнал и нашёл, что не пишется в лист, а твой вариант как раз помог, жалко нельзя сообщения редактировать :-)
 

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
901
Баллы
113
эх... допилил)))
Код:
string dir = project.Directory;
string filename = project.Variables["filename"].Value;
string data = System.IO.File.ReadAllText(dir+"\\"+filename,Encoding.GetEncoding(1251));
byte[] asciib = Encoding.GetEncoding(1251).GetBytes(data);
byte[] utfb = Encoding.Convert(Encoding.GetEncoding(1251),Encoding.UTF8,asciib);
return System.Text.Encoding.UTF8.GetString(utfb);
 
  • Спасибо
Реакции: KirillOFF

silent

Client
Регистрация
05.04.2014
Сообщения
237
Благодарностей
85
Баллы
28
так вот оно как выглядеть должно было :-), пойду за книгами стало быть.
 

LmPopo

Client
Регистрация
06.12.2012
Сообщения
299
Благодарностей
136
Баллы
43
А можно как-то узнать кодировку файла? Если utf - работаем дальше, другая - конвертируем. :-)
 

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
901
Баллы
113
к сожалению простых способов нет, а те что есть слишком муторные я особо не вникал, но там все сводится к ковырянию байтов и сравнению похож ли результат на буквы из какой либо кодировки.
 

Shevassa

Client
Регистрация
24.01.2011
Сообщения
57
Благодарностей
30
Баллы
18
Делаю конвертацию с помощью этого С# сниппета, если файл не в утф 8, преобразует его, если нет, оставляет как есть. На выходе переменная с текстом в нужной кодировке. Следующим шагом запись в файл.
P.S до этого пользовался другим сниппетом, но он "убивал" кодировку файлов, которые изначально были UTF-8
Код:
BinaryReader instr = new BinaryReader(File.OpenRead(project.Variables["Переменная с путём до текстового файла"].Value));
byte[] data = instr.ReadBytes((int)instr.BaseStream.Length);
instr.Close();

// определяем BOM (EF BB BF)
if (data.Length > 2 && data[0] == 0xef && data[1] == 0xbb && data[2] == 0xbf) {
    if (data.Length != 3) return Encoding.UTF8.GetString(data, 3, data.Length - 3);
    else return "";
}

int i = 0;
while (i < data.Length - 1) {
    if (data[i] > 0x7f) { // не ANSI-символ
        if ((data[i] >> 5) == 6) {
            if ((i > data.Length - 2) || ((data[i + 1] >> 6) != 2))
                return Encoding.GetEncoding(1251).GetString(data);
            i++;
        } else if ((data[i] >> 4) == 14) {
            if ((i > data.Length - 3) || ((data[i + 1] >> 6) != 2) || ((data[i + 2] >> 6) != 2))
                return Encoding.GetEncoding(1251).GetString(data);
            i += 2;
        } else if ((data[i] >> 3) == 30) {
            if ((i > data.Length - 4) || ((data[i + 1] >> 6) != 2) || ((data[i + 2] >> 6) != 2) || ((data[i + 3] >> 6) != 2))
                return Encoding.GetEncoding(1251).GetString(data);
            i += 3;
        } else {
            return Encoding.GetEncoding(1251).GetString(data);
        }
    }
    i++;
}

return Encoding.UTF8.GetString(data);
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
Делаю конвертацию с помощью этого С# сниппета, если файл не в утф 8, преобразует его, если нет, оставляет как есть. На выходе переменная с текстом в нужной кодировке. Следующим шагом запись в файл.
P.S до этого пользовался другим сниппетом, но он "убивал" кодировку файлов, которые изначально были UTF-8
Код:
BinaryReader instr = new BinaryReader(File.OpenRead(project.Variables["Переменная с путём до текстового файла"].Value));
byte[] data = instr.ReadBytes((int)instr.BaseStream.Length);
instr.Close();

// определяем BOM (EF BB BF)
if (data.Length > 2 && data[0] == 0xef && data[1] == 0xbb && data[2] == 0xbf) {
    if (data.Length != 3) return Encoding.UTF8.GetString(data, 3, data.Length - 3);
    else return "";
}

int i = 0;
while (i < data.Length - 1) {
    if (data[i] > 0x7f) { // не ANSI-символ
        if ((data[i] >> 5) == 6) {
            if ((i > data.Length - 2) || ((data[i + 1] >> 6) != 2))
                return Encoding.GetEncoding(1251).GetString(data);
            i++;
        } else if ((data[i] >> 4) == 14) {
            if ((i > data.Length - 3) || ((data[i + 1] >> 6) != 2) || ((data[i + 2] >> 6) != 2))
                return Encoding.GetEncoding(1251).GetString(data);
            i += 2;
        } else if ((data[i] >> 3) == 30) {
            if ((i > data.Length - 4) || ((data[i + 1] >> 6) != 2) || ((data[i + 2] >> 6) != 2) || ((data[i + 3] >> 6) != 2))
                return Encoding.GetEncoding(1251).GetString(data);
            i += 3;
        } else {
            return Encoding.GetEncoding(1251).GetString(data);
        }
    }
    i++;
}

return Encoding.UTF8.GetString(data);
За три года что-то поменялось, или это все еще самое оптимальное решение?
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)