@Juribiyan

Как в Windows пакетно переименовать файлы с неверной кодировкой?

Есть папка с файлами, именованных кракозябрами. "Декодер" определил, что необходимо перевести кодировку из CP-1251 в UTF-8. Есть много способов сделать это в *nix, а как сделать это из-под Windows?
  • Вопрос задан
  • 4631 просмотр
Решения вопроса 1
@Juribiyan Автор вопроса
В общем, пришлось писать программу самому. На Node.js, поскольку знаю его лучше всего.
var glob = require("glob");
var argv = require('optimist').argv;
var encoding = require("encoding");
var fs = require('fs');

var ext = argv.ext || '*'
, to = argv.to || 'UTF-8'
, from = argv.from || 'WINDOWS-1251'
, loge = argv.log ? (argv.log == 'on' ? true : false) : false;
var outputDir= argv.dir || '_OUTPUT';

if(!fs.existsSync(outputDir)) fs.mkdir(outputDir);

// options is optional
glob("*."+ext, function (err, files) {
  if(!err) iter(files, function(name) {
  	var newName = encoding.convert(name, from, to);
  	fs.rename('./'+name, './'+outputDir+'/'+newName, function(err) {
  		if(err) console.log(err);
  		if(loge) console.log('Renamed from ' + name + ' to ' + newName);
  	});
  });
  else console.log('ERROR: ', err);
});

function iter(array, callback) {
	if(typeof array !== 'object') return callback(array);
		var i=0, len = array.length;
		for ( ; i < len ; i++ ) {
			callback(array[i]);
		}
}

Использование:
node rename --ext txt --dir OUTPUT --from WINDOWS-1251 --to UTF-8

(все аргументы опциональны).
Примечание: возможно, я перепутал, из какой кодировки в какую переводить. Может быть, надо наоборот переводить из UTF-8 в WINDOWS-1251. Это же с какой точки зрения посмотреть. Я руководствовался тем, что сказал "Декодер".
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Hereigo
@Hereigo
Пишу на C# + Asp.Net (MVC) + .Net Core
как вариант, сохраните этот код в текстовый файл, отредактируйте переменные, сохраните с расширением .BAT, и запустите
==================================================================================
/*
@echo off && cls
set WinDirNet=%WinDir%\Microsoft.NET\Framework
IF EXIST "%WinDirNet%\v2.0.50727\csc.exe" set csc="%WinDirNet%\v2.0.50727\csc.exe"
IF EXIST "%WinDirNet%\v3.5\csc.exe" set csc="%WinDirNet%\v3.5\csc.exe"
IF EXIST "%WinDirNet%\v4.0.30319\csc.exe" set csc="%WinDirNet%\v4.0.30319\csc.exe"
%csc% /nologo /out:"%~0.exe" %0
"%~0.exe"
del "%~0.exe"
exit
*/

// ПРОСТЕНЬКОЕ ИЗМЕНЕНИЕ КОДИРОВКИ ТЕКСТОВЫХ ФАЙЛОВ НА ЯЗЫКЕ C# :

namespace ConsoleApplication123
{
using System;
using System.IO;
using System.Text;
class Program
{
static void Main(string[] args)
{
// НАСТРОЙКА ПЕРЕМЕННЫХ :

// ПАПКА С ФАЙЛА ДЛЯ ПЕРЕКОДИРОВКИ :
string folder = @"C:\temp";

// РАСШИРЕНИЕ ФАЙЛОВ ДЛЯ ПЕРЕКОДИРОВКИ (с точкой) :
string fileExtention = "*.txt";

// ВХОДЯЩАЯ КОДИРОВКА
Encoding encodingIn = Encoding.GetEncoding("windows-1251");

// ВЫХОДЯЩАЯ КОДИРОВКА
Encoding encodingOut = Encoding.GetEncoding("utf-8");

// ВЫПОЛНЕНИЕ ПРОГРАММЫ :
FileInfo[] files = new DirectoryInfo(folder).GetFiles(fileExtention);
if (files.Length < 1)
{
Console.WriteLine("В папке " + folder + " нет файлов " + fileExtention);
}
else
{
for (int i = 0; i < files.Length; i++)
{
try
{
string outputDir = folder + @"\_OUTPUT\";
if (!Directory.Exists(outputDir)) Directory.CreateDirectory(outputDir);
FileStream fs = new FileStream(files[i].FullName, FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fs, encodingIn);
FileStream fsOut = new FileStream(outputDir + files[i].Name, FileMode.CreateNew, FileAccess.Write);
StreamWriter sw = new StreamWriter(fsOut, encodingOut);
String readLine;
while ((readLine = sr.ReadLine()) != null) sw.WriteLine(readLine);
sw.Close();
fsOut.Close();
sr.Close();
fs.Close();
}
catch (Exception ex)
{
Console.WriteLine("OBJECT : " + args[i].ToString());
Console.WriteLine();
Console.WriteLine("ERROR : " + ex.ToString());
Console.ReadKey();
}
}
}
//////////////////////////////////
System.Console.WriteLine();
System.Console.WriteLine();
System.Console.WriteLine("Завершено.");
System.Console.ReadKey();
}
}
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы