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;
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);
}
как раз с утра прогнал и нашёл, что не пишется в лист, а твой вариант как раз помог, жалко нельзя сообщения редактироватьЯ хз работает или нет, но вроде работает, но лучше результаты писать или во второй список, или так
Код:text[i]=s;
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);
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);
За три года что-то поменялось, или это все еще самое оптимальное решение?Делаю конвертацию с помощью этого С# сниппета, если файл не в утф 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);