Показать полную графическую версию : [решено] Автоматическая смена кодировки .txt файлов
__sa__nya
29-06-2009, 13:28
Доброе время суток. Нужно написать батник, который бы менял кодировку текстовых файлов с UTF на ANSI. Подскажите пожалуйста как подобное можно реализовать.
AFAIK только UTF-16LE, если речь про UTF-8 без посторонних утилит не обойтись, варианты:
recode (http://sourceforge.net/project/showfiles.php?group_id=9328&package_id=9393) из комплекта UNIX портов:
recode -f utf8/crlf..cp1251 <1.txt >2.txt
TCODE (http://alexboiko.chat.ru/prod.html#tcode) Алексея Бойко:
tcode 1.txt /utf 2.txt /win
а можно как-то перекодировать слова в cmd ?
Просто я с помощью команды for добыл из файла нужное место, а оно на русском и в кодировке UTF-8, а мне потом его надо записать в файл в кодировке 1251.
recode -f utf8/crlf..cp1251 <1.txt >2.txt »
у меня на выходе получается файл 0 кб
__sa__nya
01-07-2009, 07:34
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
скрипт работает, спасибо. А вот recode ни в какую. Пациента прикрепляю.
__sa__nya
02-07-2009, 07:32
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
__sa__nya
02-07-2009, 10:12
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 (http://en.wikipedia.org/wiki/Byte_Order_Mark)), RECODE вроде работает... по ходу это наследие никсов... кстати, мануал по утилю: http://www.informatik.uni-hamburg.de/RZ/software/gnu/utilities/recode_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"
)
__sa__nya
02-07-2009, 12:46
amel27, самое оно :), вроде работает, сейчас возьму файлов с десяток, буду проверять.
Еще вопрос: чтобы скрипт vbs отрабатывал, какая служба в системе должна быть запущена, он же на что-то опирается?
__sa__nya, WSH - это встроенный набор компонент, службы тут не причем:
- для VBS минимум Win2K, но лучше XP/2003 или обновить WSH до версии 5.6;
- для поддержки "ADODB.Stream" минимум XP SP2, иначе накатывать MDAC 2.8
а скомпилировать в exe vbs нельзя ? только действительно скомпилировать , а не так как с батниками, вся компиляция которых заключается просто в запихивание в ехе который распаковывает сам батник в темп и от туда запускает его.
mitiya, смысл?.. ИМХО это из разряда извращений, если очень хочется используй AutoIT (http://forum.oszone.net/forum-103.html)... в него кста можно запихать и VBS-код
anatolysn
05-05-2018, 01:07
взято из 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
а как выставить принудительно кодировку 866 в получаемом файле в это скрипте? »
WSH: пример конвертации текста из кодировки в кодировку — Windows Script Host, HTA (VBScript, JScript) — Коллекция скриптов и идей — Серый форум (http://forum.script-coding.com/viewtopic.php?id=997):
Доступные варианты кодировок на компьютере для использования в вышеприведённых скриптах находятся в реестре по адресу 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
anatolysn
05-05-2018, 15:35
strSourceFile = "C:\test\*.log"
strDestFile = "C:\test\*.log"
strSourceFile = "C:\test\*.log"
strDestFile = "C:\test\dir2\*.log"
пакетный режим не работает когда нужно все файлы в одной папке с расширением log конвертировать в другую кодировку
на единичный файл работает проверил , гуд
система windows xp sp3
П.С.
Я не программист, ссылки на код не понимаю только юзать умею. :(
пакетный режим не работает »
Странно, да :lol: ?
нужно все файлы в одной папке с расширением 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
'=============================================================================
Путь к целевому каталогу и расширение файлов тупо заданы в коде, резервные копии не делаются.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.