как быть с кодировкий загруженного файла

mantronix

Client
Регистрация
29.09.2010
Сообщения
185
Благодарностей
2
Баллы
18
Добрый вечер.
Загружаю excel файл на комп с сервера, далее беру его содержимое файла и кладу в переменную, в переменной содержимое файла в неправильной кодировке, подскажите пожалуйста как быть в данной ситуации? как мне поменять кодировку загружаемого excel файла и на какую с помощью зенно?
 

mantronix

Client
Регистрация
29.09.2010
Сообщения
185
Благодарностей
2
Баллы
18
никто не знает?(
 

Lexicon

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

darkdiver

Administrator
Команда форума
Регистрация
13.01.2009
Сообщения
2 285
Благодарностей
2 731
Баллы
113
Снипет переконвертирования файлов вот такой, пример проекта во вложении.

JavaScript:
// создаем объекты кодировок
var inAsciiEncoding = System.Text.Encoding.GetEncoding("windows-1251");
var outUTF8Encoding = System.Text.Encoding.UTF8;
// читаем оригинальный файл по байтам
var inAsciiBytes = System.IO.File.ReadAllBytes(project.Variables["pathToWin1251File"].Value);
// конвертируем байты в нужную кодировку
var outUTF8Bytes = System.Text.Encoding.Convert(inAsciiEncoding, outUTF8Encoding, inAsciiBytes);
// Записываем переконвертированные байты в файл
using (var stream = new System.IO.FileStream(project.Variables["pathToUTF8File"].Value, System.IO.FileMode.Create))
{
    using (var writer = new System.IO.BinaryWriter(stream, outUTF8Encoding))
    {
        writer.Write(outUTF8Encoding.GetPreamble());
        writer.Write(outUTF8Bytes);
    }
}
 

Вложения

mantronix

Client
Регистрация
29.09.2010
Сообщения
185
Благодарностей
2
Баллы
18
то что нужно спасибо
 

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
901
Баллы
113
А нельзя ли сниппет для обратной процедуры))) Строку в кодировке UTF сохранить в фаил ANSI)))
Что то нифига у меня не выходит)))
Да да))) не помешало бы что то стандартное реализовать и для зеннопостера))))) не одна тема была создана на тему как прочитать/сохранить фаил в кодировке, отличной от UTF-8.
Я конечно, понимаю, что софт нифига не только под россию сделан)) но вот буржуи тоже интересуются как им китайские иероглифы сохранить)))
 

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
901
Баллы
113
Вот она, волшебная сила вопроса)))
Сам спросил - сам ответил)
Может кому пригодится
пишет русские буковки в csv как надо)

Код:
var list = project.Lists["Список 3"];
var path = project.Variables["FilePath"].Value;
string all = null;
foreach (string data in list)
{
	all+=data+"\r\n";
}
System.Text.Encoding ANSI = Encoding.GetEncoding(1251);
System.Text.Encoding UTF8 = Encoding.UTF8;
byte[] utf8_bytes,ansi_bytes;

utf8_bytes = UTF8.GetBytes(all);
ansi_bytes = Encoding.Convert(UTF8, ANSI, utf8_bytes);
using (var stream = new System.IO.FileStream(path, System.IO.FileMode.Create))
{
    using (var writer = new System.IO.BinaryWriter(stream, System.Text.Encoding.ASCII))
    {
        writer.Write(ANSI.GetPreamble());
        writer.Write(ansi_bytes);
	writer.Dispose();
    }
}

return 0;
 

ZennoScript

Moderator
Регистрация
04.03.2011
Сообщения
4 452
Благодарностей
1 886
Баллы
113
var outUTF8Bytes = System.Text.Encoding.Convert(inAsciiEncoding, outUTF8Encoding, inAsciiBytes);

в этой строке просто нужно было местами поменять что во что конвертировать.
var outUTF8Bytes = System.Text.Encoding.Convert(outUTF8Encoding, inAsciiEncoding, inAsciiBytes);
Остальное можно было не трогать.
 

Lexicon

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

darkdiver

Administrator
Команда форума
Регистрация
13.01.2009
Сообщения
2 285
Благодарностей
2 731
Баллы
113
))) хорошо, что разобрались, 2 улучшения по коду
  1. складывать в цикле строки будет медленно, если строк достаточно много.
  2. writer.Dispose(); вызывать не надо, т.к. вы используете конструкцию using (var writer = .....) {} в данном случае Dispose вызывается автоматически.


JavaScript:
var list = project.Lists["Список 3"];
var path = project.Variables["FilePath"].Value;
var sb = new StringBuilder();
foreach (string data in list)
    sb.AppendLine(data);


System.Text.Encoding ANSI = Encoding.GetEncoding(1251);
System.Text.Encoding UTF8 = Encoding.UTF8;
byte[] utf8_bytes,ansi_bytes;


utf8_bytes = UTF8.GetBytes(sb.ToString());
ansi_bytes = Encoding.Convert(UTF8, ANSI, utf8_bytes);
using (var stream = new System.IO.FileStream(path, System.IO.FileMode.Create))
{
    using (var writer = new System.IO.BinaryWriter(stream, System.Text.Encoding.ASCII))
    {
        writer.Write(ANSI.GetPreamble());
        writer.Write(ansi_bytes);
    }
}
 

Kostass

Client
Регистрация
20.12.2010
Сообщения
144
Благодарностей
9
Баллы
18
А как изменить кодеровку текста который находиться в переменой ?
 

Lexicon

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

Antipolizei

Client
Регистрация
09.04.2014
Сообщения
7
Благодарностей
0
Баллы
1
Извиняюсь за тупой вопрос, а можно что-нибудь подобное для таблицы?) или как вообще выйти из ситуации, если нужно сохранять в csv, с посл. импортом на сайт в win 1252 ?)
 

Antipolizei

Client
Регистрация
09.04.2014
Сообщения
7
Благодарностей
0
Баллы
1
А, сорре, тупанул, не заметил файлик)
 

frion-seo

Client
Регистрация
27.02.2011
Сообщения
538
Благодарностей
471
Баллы
63
var outUTF8Bytes = System.Text.Encoding.Convert(inAsciiEncoding, outUTF8Encoding, inAsciiBytes);

в этой строке просто нужно было местами поменять что во что конвертировать.
var outUTF8Bytes = System.Text.Encoding.Convert(outUTF8Encoding, inAsciiEncoding, inAsciiBytes);
Остальное можно было не трогать.
блин не помогает что-то .... крокозябры получаются
перекодировать пробую html файл....
 
Последнее редактирование модератором:

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113
А зачем его перекодировать? Что в нем изначально не так?
 
  • Спасибо
Реакции: frion-seo

frion-seo

Client
Регистрация
27.02.2011
Сообщения
538
Благодарностей
471
Баллы
63
дело в том что двиг в который он монтируется выводит все в ansi...
 

darkdiver

Administrator
Команда форума
Регистрация
13.01.2009
Сообщения
2 285
Благодарностей
2 731
Баллы
113
выкладывайте пример с файлом
+ из какой кодировки в какую переконвертировать.
 
  • Спасибо
Реакции: frion-seo

frion-seo

Client
Регистрация
27.02.2011
Сообщения
538
Благодарностей
471
Баллы
63

darkdiver

Administrator
Команда форума
Регистрация
13.01.2009
Сообщения
2 285
Благодарностей
2 731
Баллы
113
C#:
// путь к исходному файлу
var pathSource = project.Variables["FilePathSource"].Value;
// путь к сконвертированному файлу
var pathDest = project.Variables["FilePathDest"].Value;

System.Text.Encoding ANSI = Encoding.GetEncoding(1251);
System.Text.Encoding UTF8 = Encoding.UTF8;
byte[] utf8_bytes,ansi_bytes;

utf8_bytes = UTF8.GetBytes(System.IO.File.ReadAllText(pathSource, UTF8));
ansi_bytes = Encoding.Convert(UTF8, ANSI, utf8_bytes);
using (var stream = new System.IO.FileStream(pathDest, System.IO.FileMode.Create))
{
    using (var writer = new System.IO.BinaryWriter(stream, System.Text.Encoding.ASCII))
    {
        writer.Write(ansi_bytes);
    }
}
скорее всего что вы смотрите в notepad++ или в браузере, там да крякозябры, он видит что, это html и читает тэг
HTML:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
т.к. кодировка уже не utf-8 возникают проблемы.
выбираете кодировку ANSI, тогда вам все нормально отобразится.

 
  • Спасибо
Реакции: YozH и frion-seo

frion-seo

Client
Регистрация
27.02.2011
Сообщения
538
Благодарностей
471
Баллы
63

frion-seo

Client
Регистрация
27.02.2011
Сообщения
538
Благодарностей
471
Баллы
63
Не катит всеравно.. то-ли лыжи не едут..
то в 1255 сконвертирует то в смешанную ansi и utf сразу
 

frion-seo

Client
Регистрация
27.02.2011
Сообщения
538
Благодарностей
471
Баллы
63
Для кодировки из UTF8 в ANSI отлично заработал!
Код:
var list = project.Lists["Список 3"];
var path = project.Variables["FilePath"].Value;
var sb = new StringBuilder();
foreach (string data in list)
    sb.AppendLine(data);
System.Text.Encoding ANSI = Encoding.GetEncoding(1251);
System.Text.Encoding UTF8 = Encoding.UTF8;
byte[] utf8_bytes,ansi_bytes;
utf8_bytes = UTF8.GetBytes(sb.ToString());
ansi_bytes = Encoding.Convert(UTF8, ANSI, utf8_bytes);
using (var stream = new System.IO.FileStream(path, System.IO.FileMode.Create))
{
    using (var writer = new System.IO.BinaryWriter(stream, System.Text.Encoding.ASCII))
    {
        writer.Write(ANSI.GetPreamble());
        writer.Write(ansi_bytes);
    }
}
 
Регистрация
03.12.2012
Сообщения
187
Благодарностей
90
Баллы
28
Да добавьте вы уже в зенно настройку для выбора кодировки. Задолбала это кодировка
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113
автоматом переконвертировать крайне опасно, т.к. в этот же файл может писать другая программа, и тогда начнется каша. Как следствие - большее количество проблем.
Сделаем уведомление при добавлении файла к спискам таблицам, оповещающее что файл имеет неверную кодировку.
 
  • Спасибо
Реакции: Wide и darkdiver

Wide

Client
Регистрация
04.02.2013
Сообщения
946
Благодарностей
258
Баллы
63
Парни как в Utf-8 перекодировать? есть куча файлов в хз какой кодировке, нужно в утф-8. если можно пример с переменной.
Код:
var list = project.Lists["Список 3"];
var path = project.Variables["FilePath"].Value;
var sb = new StringBuilder();
foreach (string data in list)
    sb.AppendLine(data);
System.Text.Encoding ANSI = Encoding.GetEncoding(1251);
System.Text.Encoding UTF8 = Encoding.UTF8;
byte[] utf8_bytes,ansi_bytes;
utf8_bytes = UTF8.GetBytes(sb.ToString());
ansi_bytes = Encoding.Convert(UTF8, ANSI, utf8_bytes);
using (var stream = new System.IO.FileStream(path, System.IO.FileMode.Create))
{
    using (var writer = new System.IO.BinaryWriter(stream, System.Text.Encoding.ASCII))
    {
        writer.Write(ANSI.GetPreamble());
        writer.Write(ansi_bytes);
    }
}
 

Miner

Client
Регистрация
30.04.2015
Сообщения
67
Благодарностей
10
Баллы
8
var outUTF8Bytes = System.Text.Encoding.Convert(inAsciiEncoding, outUTF8Encoding, inAsciiBytes);

в этой строке просто нужно было местами поменять что во что конвертировать.
var outUTF8Bytes = System.Text.Encoding.Convert(outUTF8Encoding, inAsciiEncoding, inAsciiBytes);
Остальное можно было не трогать.
У меня что то не получается таким способом.
Снипет переконвертирования файлов вот такой, пример проекта во вложении.

JavaScript:
// создаем объекты кодировок
var inAsciiEncoding = System.Text.Encoding.GetEncoding("windows-1251");
var outUTF8Encoding = System.Text.Encoding.UTF8;
// читаем оригинальный файл по байтам
var inAsciiBytes = System.IO.File.ReadAllBytes(project.Variables["pathToWin1251File"].Value);
// конвертируем байты в нужную кодировку
var outUTF8Bytes = System.Text.Encoding.Convert(inAsciiEncoding, outUTF8Encoding, inAsciiBytes);
// Записываем переконвертированные байты в файл
using (var stream = new System.IO.FileStream(project.Variables["pathToUTF8File"].Value, System.IO.FileMode.Create))
{
    using (var writer = new System.IO.BinaryWriter(stream, outUTF8Encoding))
    {
        writer.Write(outUTF8Encoding.GetPreamble());
        writer.Write(outUTF8Bytes);
    }
}
Подскажите.Вот я перекодировал windows-1251 в utf-8 сделал определеные поправки в файле.Теперь хочу обратно перекодировать в windows-1251 .Как данным снипетом это сделать обратно?Пробовал как написал ZennoScript что то у меня не вышло
var outUTF8Bytes = System.Text.Encoding.Convert(inAsciiEncoding, outUTF8Encoding, inAsciiBytes);

в этой строке просто нужно было местами поменять что во что конвертировать.
var outUTF8Bytes = System.Text.Encoding.Convert(outUTF8Encoding, inAsciiEncoding, inAsciiBytes);
Остальное можно было не трогать.
 

Ikigai

Client
Регистрация
13.12.2016
Сообщения
276
Благодарностей
27
Баллы
28
Код:
// путь к исходному файлу
var pathSource = project.Variables["FilePathSource"].Value;
// путь к сконвертированному файлу
var pathDest = project.Variables["FilePathDest"].Value;
System.Text.Encoding ANSI = Encoding.GetEncoding(1251);
System.Text.Encoding UTF8 = Encoding.UTF8;
byte[] utf8_bytes,ansi_bytes;
utf8_bytes = UTF8.GetBytes(System.IO.File.ReadAllText(pathSource, UTF8));
ansi_bytes = Encoding.Convert(UTF8, ANSI, utf8_bytes);
using (var stream = new System.IO.FileStream(pathDest, System.IO.FileMode.Create))
{
    using (var writer = new System.IO.BinaryWriter(stream, System.Text.Encoding.ASCII))
    {
        writer.Write(ansi_bytes);
    }
}
Бротишки , а есть решение где вместо project.Variables["FilePathSource"].Value будут брать данные из локальной переменной с информацией внутри (project.Variables["vPeremennoiText"].Value) ?
 

anarbus

Client
Регистрация
16.07.2019
Сообщения
548
Благодарностей
18
Баллы
18
Снипет переконвертирования файлов вот такой, пример проекта во вложении.

JavaScript:
// создаем объекты кодировок
var inAsciiEncoding = System.Text.Encoding.GetEncoding("windows-1251");
var outUTF8Encoding = System.Text.Encoding.UTF8;
// читаем оригинальный файл по байтам
var inAsciiBytes = System.IO.File.ReadAllBytes(project.Variables["pathToWin1251File"].Value);
// конвертируем байты в нужную кодировку
var outUTF8Bytes = System.Text.Encoding.Convert(inAsciiEncoding, outUTF8Encoding, inAsciiBytes);
// Записываем переконвертированные байты в файл
using (var stream = new System.IO.FileStream(project.Variables["pathToUTF8File"].Value, System.IO.FileMode.Create))
{
    using (var writer = new System.IO.BinaryWriter(stream, outUTF8Encoding))
    {
        writer.Write(outUTF8Encoding.GetPreamble());
        writer.Write(outUTF8Bytes);
    }
}
Спасибо, очень помог!) Один нюанс, пример кода в сообщении для C#, а не JavaScript. Изначально его кинул в блок JavaScript и нечего не работало)
 

phillplacebo

Client
Регистрация
04.02.2020
Сообщения
25
Благодарностей
1
Баллы
3
Здравствуйте. Подскажите пожалуйста - я проделываю такой цикл:

Торрент-файл с помощью вышеизложенного (из этой темы) С# кода конвертирую в utf8 с расширением .тхт --- этот файл тхт кладу в переменную - произвожу замену строки --- сохраняю данные из переменной в .тхт файл --- конвертирую его с помощью С# кода обратно в anci (windows-1252) с расширением .торрент --- торрент ругается, мол инвалид файл =( проделываю операцию замены с помощью notepad ++ - всё отлично, всё работает. Как реализовать в зенке это? Спасибо
 
Последнее редактирование:

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