Автоматическая смена кодировки .txt файлов
Доброе время суток. Нужно написать батник, который бы менял кодировку текстовых файлов с UTF на ANSI. Подскажите пожалуйста как подобное можно реализовать.
|
AFAIK только UTF-16LE, если речь про UTF-8 без посторонних утилит не обойтись, варианты:
recode из комплекта UNIX портов:
Код:
recode -f utf8/crlf..cp1251 <1.txt >2.txt
TCODE Алексея Бойко:
Код:
tcode 1.txt /utf 2.txt /win
|
а можно как-то перекодировать слова в cmd ?
Просто я с помощью команды for добыл из файла нужное место, а оно на русском и в кодировке UTF-8, а мне потом его надо записать в файл в кодировке 1251.
|
Цитата:
Цитата amel27
recode -f utf8/crlf..cp1251 <1.txt >2.txt »
|
у меня на выходе получается файл 0 кб
|
amel27, tcode вместо русских букв на выходе дает вопросы, а recode файл весом 0 кб.
|
mitiya, __sa__nya, у меня вроде обе работают, :dont-know ...нужен пациент
не совсем в тему - вариант на VBS, вызвать из CMD не составит проблемы:
Код:
FileIn = "in.txt"
FileOut = "out.txt"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(FileOut, 2, vbTrue)
strText = FileDecode(FileIn, "utf-8")
objFile.WriteLine(strText)
Function FileDecode (strFile, strCP)
Set Stream = CreateObject("ADODB.Stream")
With Stream
.Type = 2
.Mode = 3
.CharSet = strCP
.Open
.LoadFromFile(strFile)
End With
FileDecode = Stream.Readtext()
Stream.Close
End Function
|
Вложений: 1
скрипт работает, спасибо. А вот recode ни в какую. Пациента прикрепляю.
|
amel27, скрипт не пробовал, но recode не работает, во вложении readme.txt - оригинал, readme_recoded - после обработки recode.
Скрипт попробовал, работает, но вот еще нужно, чтобы имя файла было не в него зашито, а ему передавалось батником, и чтобы файл-источник и файл-приемник был одним файлом, короче нужно так, чтобы из файла c UTF-8 кодировкой автоматом делался файл с ANSI-кодировкой. Что-нибудь такое: dir /B *.txt | recode.vbs.
Так возможно сделать?
|
__sa__nya,
просто замени первые строчки.
Код:
FileIn = Wscript.arguments.Item(0)
FileOut = Wscript.arguments.Item(1)
recode.vbs 1.txt 2.txt
|
mitiya, не проходит, мне нужна конструкция, указанная выше: dir /B *.txt | recode.vbs - т.е в папке находится батник, vbs- скрипт, и файл, кодировку которого нужно сменить, имя файла постоянно будет изменяться, первые строки изменял, выходит ошибка Windows Script Host: "Индекс выходит за пределы допустимого диапазона". Т.е файл-источник с UTF-кодировкой должен потом стать файлом с ANSI-кодировкой, количество файлов не должно стать больше.
|
__sa__nya,
перекодировать 1.txt в 2.txt , удалить 1.txt , переименовать 2.txt в 1.txt
не подходит ?
|
mitiya, __sa__nya, если в этих файлах удалить первые три псевдосимвола ( BOM), RECODE вроде работает... по ходу это наследие никсов... кстати, мануал по утилю: http://www.informatik.uni-hamburg.de...ecode_toc.html
__sa__nya, типа такого?.. с учетом замен двух строчек, как сказал mitiya
Код:
For /F "Delims=" %%i In ('DIR /B *.txt') Do (
cscript //Nologo recode.vbs "%%i" "%%~dpn.tmp"
copy /Y "%%~dpn.tmp" "%%i"
del "%%~dpn.tmp"
)
|
amel27, самое оно :), вроде работает, сейчас возьму файлов с десяток, буду проверять.
Еще вопрос: чтобы скрипт vbs отрабатывал, какая служба в системе должна быть запущена, он же на что-то опирается?
|
__sa__nya, WSH - это встроенный набор компонент, службы тут не причем:
- для VBS минимум Win2K, но лучше XP/2003 или обновить WSH до версии 5.6;
- для поддержки "ADODB.Stream" минимум XP SP2, иначе накатывать MDAC 2.8
|
а скомпилировать в exe vbs нельзя ? только действительно скомпилировать , а не так как с батниками, вся компиляция которых заключается просто в запихивание в ехе который распаковывает сам батник в темп и от туда запускает его.
|
mitiya, смысл?.. ИМХО это из разряда извращений, если очень хочется используй AutoIT... в него кста можно запихать и VBS-код
|
взято из http://forum.oszone.net/post-1156258-6.html
а как выставить принудительно кодировку 866 в получаемом файле в это скрипте?
Код:
FileIn = "info.xml"
FileOut = "info.txt"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(FileOut, 2, vbTrue)
strText = FileDecode(FileIn, "utf-8")
objFile.WriteLine(strText)
Function FileDecode (strFile, strCP)
Set Stream = CreateObject("ADODB.Stream")
With Stream
.Type = 2
.Mode = 3
.CharSet = strCP
.Open
.LoadFromFile(strFile)
End With
FileDecode = Stream.Readtext()
Stream.Close
End Function
|
Цитата:
Цитата anatolysn
а как выставить принудительно кодировку 866 в получаемом файле в это скрипте? »
|
WSH: пример конвертации текста из кодировки в кодировку — Windows Script Host, HTA (VBScript, JScript) — Коллекция скриптов и идей — Серый форум:
Цитата:
Цитата alexii
Доступные варианты кодировок на компьютере для использования в вышеприведённых скриптах находятся в реестре по адресу HKEY_CLASSES_ROOT\MIME\Database\Charset.
|
В данном случае сие может выглядеть, например, так:
Код:
Option Explicit
Const adTypeText = 2
Const adModeReadWrite = 3
Const adSaveCreateOverWrite = 2
Dim strSourceFile
Dim strDestFile
Dim strSourceCharset
Dim strDestCharset
Dim objFSO
Dim strContent
strSourceFile = "C:\Мои проекты\0153\0001.xml"
strDestFile = "C:\Мои проекты\0153\Result.txt"
strSourceCharset = "utf-8"
strDestCharset = "cp866"
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
If objFSO.FileExists(strSourceFile) Then
With WScript.CreateObject("ADODB.Stream")
.Type = adTypeText
.Mode = adModeReadWrite
.Charset = strSourceCharset
.Open
.LoadFromFile strSourceFile
strContent = .ReadText()
.Close
.Charset = strDestCharset
.Open
.WriteText strContent
.SaveToFile strDestFile, adSaveCreateOverWrite
.Close
End With
Else
WScript.Echo "Can't find source file [" & strSourceFile & "]."
WScript.Quit 1
End If
Set objFSO = Nothing
WScript.Quit 0
|
Код:
strSourceFile = "C:\test\*.log"
strDestFile = "C:\test\*.log"
Код:
strSourceFile = "C:\test\*.log"
strDestFile = "C:\test\dir2\*.log"
пакетный режим не работает когда нужно все файлы в одной папке с расширением log конвертировать в другую кодировку
на единичный файл работает проверил , гуд
система windows xp sp3
П.С.
Я не программист, ссылки на код не понимаю только юзать умею. :(
|
Цитата:
Цитата anatolysn
пакетный режим не работает »
|
Странно, да :lol: ?
Цитата:
Цитата anatolysn
нужно все файлы в одной папке с расширением log конвертировать в другую кодировку »
|
Вот с этого и нужно было начинать.
Код:
Option Explicit
Dim strSourceFolder
Dim objFile
strSourceFolder = "C:\Мои проекты\0153"
With WScript.CreateObject("Scripting.FileSystemObject")
If .FolderExists(strSourceFolder) Then
For Each objFile In .GetFolder(strSourceFolder).Files
If StrComp(.GetExtensionName(objFile.Name), "log", vbTextCompare) = 0 Then
ConvertFile objFile.Path, "utf-8", "cp866"
End If
Next
Else
WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
WScript.Quit 1
End If
End With
WScript.Quit 0
'=============================================================================
'=============================================================================
Sub ConvertFile(strFile, strSourceCharset, strDestCharset)
Const adTypeText = 2
Const adModeReadWrite = 3
Const adSaveCreateOverWrite = 2
Dim strContent
With WScript.CreateObject("ADODB.Stream")
.Type = adTypeText
.Mode = adModeReadWrite
.Charset = strSourceCharset
.Open
.LoadFromFile strFile
strContent = .ReadText()
.Close
.Charset = strDestCharset
.Open
.WriteText strContent
.SaveToFile strFile, adSaveCreateOverWrite
.Close
End With
End Sub
'=============================================================================
Путь к целевому каталогу и расширение файлов тупо заданы в коде, резервные копии не делаются.
|
Каюсь.
стоило написать мне, и невнимательно прочитать свой запрос
Цитата:
пакетный режим не работает когда нужно все файлы в одной папке с расширением log конвертировать в другую кодировку
|
вот что хотел сказать:
пакетный режим не работает когда нужно все файлы в одной папке с расширением log конвертировать в другую кодировку в другую папку
|
ну это вы уже могли и командой move допилить на крайний случай.
|
Код:
Option Explicit
Dim strSourceFolder
Dim strDestFolder
Dim objFile
strSourceFolder = "C:\Мои проекты\0153\Source"
strDestFolder = "C:\Мои проекты\0153\Destination"
With WScript.CreateObject("Scripting.FileSystemObject")
If .FolderExists(strSourceFolder) Then
If .FolderExists(strDestFolder) Then
For Each objFile In .GetFolder(strSourceFolder).Files
If StrComp(.GetExtensionName(objFile.Name), "log", vbTextCompare) = 0 Then
ConvertFile objFile.Path, .BuildPath(strDestFolder, objFile.Name), "utf-8", "cp866"
End If
Next
Else
WScript.Echo "Can't find destination folder [" & strDestFolder & "]."
WScript.Quit 2
End If
Else
WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
WScript.Quit 1
End If
End With
WScript.Quit 0
'=============================================================================
'=============================================================================
Sub ConvertFile(strSourceFile, strDestFile, strSourceCharset, strDestCharset)
Const adTypeText = 2
Const adModeReadWrite = 3
Const adSaveCreateOverWrite = 2
Dim strContent
With WScript.CreateObject("ADODB.Stream")
.Type = adTypeText
.Mode = adModeReadWrite
.Charset = strSourceCharset
.Open
.LoadFromFile strSourceFile
strContent = .ReadText()
.Close
.Charset = strDestCharset
.Open
.WriteText strContent
.SaveToFile strDestFile, adSaveCreateOverWrite
.Close
End With
End Sub
'=============================================================================
|
Время: 18:56.
© OSzone.net 2001-