Лингвофорум

Общий раздел => Наука и техника => Компьютеры => Тема начата: Bhudh от февраля 3, 2014, 06:00

Название: Пакетное перекодирование файлов
Отправлено: Bhudh от февраля 3, 2014, 06:00
Дано: кучка htm-файлов в кодировке windows-1252, содержащих символы, выходящие за границы ASCII, операционная система Windows XP.
Требуется: кучка html-файлов в кодировке utf-8, содержащих символы Unicode.
Решение: ???

Простая перекодировка из win в utf бесполезна: вместо «blæce, blæcðu», видимого в windows-1252, появляется «blжce, blжcÑ€u».
То есть надо сначала перевести текст в его визуальное представление, а затем это представление перевести в Unicode.
Что делать? Есть ли решение через командную строку, например?
Название: Пакетное перекодирование файлов
Отправлено: Hellerick от февраля 3, 2014, 06:38
Цитата: Bhudh от февраля  3, 2014, 06:00
Простая перекодировка из win в utf бесполезна: вместо «blæce, blæcðu», видимого в windows-1252, появляется «blжce, blжcÑ€u».

Т.е. задача сводится к тому, чтобы в начале каждого файла поставить byte-order-mark?
Название: Пакетное перекодирование файлов
Отправлено: Hellerick от февраля 3, 2014, 06:40
Ах да, у вас же, наверное, и в самом HTML кодировка как-то указана?
Название: Пакетное перекодирование файлов
Отправлено: Bhudh от февраля 3, 2014, 06:44
Цитата: Hellerick от февраля  3, 2014, 06:38Т.е. задача сводится к тому, чтобы в начале каждого файла поставить byte-order-mark?
Нет. BOM как раз нежелателен, это же HTML. А сами файлы в кодировке ANSI/Windows-1252.

Цитата: Hellerick от февраля  3, 2014, 06:40в самом HTML кодировка как-то указана?
К сожалению, нет. Тэг <meta> отсутствует в принципе.
Название: Пакетное перекодирование файлов
Отправлено: Hellerick от февраля 3, 2014, 06:56
Насколько я понимаю, формально вы задачу уже решили этой вашей «простой перекодировкой».

Вопрос не в том, как файлы перекодировать, а как их потом правильно прочитать. А это зависит от того, чем вы их читаете, и как сами файлы изнутри выглядят.

Цитата: Bhudh от февраля  3, 2014, 06:44
Цитата: Hellerick от февраля  3, 2014, 06:38Т.е. задача сводится к тому, чтобы в начале каждого файла поставить byte-order-mark?
Нет. BOM как раз нежелателен, это же HTML. А сами файлы в кодировке ANSI/Windows-1252.

Цитата: Hellerick от февраля  3, 2014, 06:40в самом HTML кодировка как-то указана?
К сожалению, нет. Тэг <meta> отсутствует в принципе.

Можно SED'ом принудительно расствить.
Название: Пакетное перекодирование файлов
Отправлено: Тайльнемер от февраля 3, 2014, 07:05
Цитата: Bhudh от февраля  3, 2014, 06:00
Простая перекодировка из win в utf бесполезна: вместо «blæce, blæcðu», видимого в windows-1252, появляется «blжce, blжcÑ€u».
В win-1252 'æ' и 'ð' — это E6 и F0, соответственно.
В UTF-8 'æ' и 'ð' — это C3,A6 и C3,B0.
В win-1252 C3,A6 и C3,B0 — это 'æ' и 'ð', а не 'ж' и 'Ñ€', как у вас.

Откуда взялись 'ж' и 'Ñ€'?
Очевидно, вы читаете файл в кодировке windows-2151 (кириллица).
В win-1251 E6 и F0 — это 'ж' и 'р'.
В UTF-8 'ж' и 'р' — это D0,B6 и D1,80.
В win-1252 D0,B6 и D1,80 — это 'ж' и 'Ñ€'.

То есть, пол-беды в том, что вы перекодируете из win-1251 в UTF-8, а не из win-1252.
Вторые пол-беды, что полученный файл вы читаете как win-1252, а не как UTF-8.
Название: Пакетное перекодирование файлов
Отправлено: Bhudh от февраля 3, 2014, 07:05
Цитата: Hellerick от февраля  3, 2014, 06:56формально вы задачу уже решили этой вашей «простой перекодировкой»
Не решил. Мне нужно пакетное решение, а перекодировать я могу только по одному файлу в Notepad++ в 2 действия:
Название: Пакетное перекодирование файлов
Отправлено: Bhudh от февраля 3, 2014, 07:07
Цитата: Тайльнемер от февраля  3, 2014, 07:05То есть, пол-беды в том, что вы перекодируете из win-1251 в UTF-8, а не из win-1252.
Вторые пол-беды, что полученный файл вы читаете как win-1252, а не как UTF-8.
С этими полбедами уже разобрался.
Win-1251 по дефолту ставит Notepad++ для ANSI-файлов.
Название: Пакетное перекодирование файлов
Отправлено: Bhudh от февраля 3, 2014, 07:09
Цитата: Тайльнемер от февраля  3, 2014, 07:05В win-1252 'æ' и 'ð' — это E6 и F0, соответственно.
В UTF-8 'æ' и 'ð' — это C3,A6 и C3,B0.
Вот в том и состоит задача, чтобы win-1252-шные E6 и F0 перевести в UTF-8-шные C3,A6 и C3,B0. И все остальные тоже.
Название: Пакетное перекодирование файлов
Отправлено: Hellerick от февраля 3, 2014, 07:10
В тертьем питоне я бы написал такую программку:

Цитироватьfilelist=r'''
D:\MyFolder\File1.txt
D:\MyFolder\File2.txt
D:\MyFolder\File3.txt
'''

def convert_1252_65008(file):
    with open(file, encoding='windows-1252') as filein:
        fileout = open(file+'.utf8', encoding='UTF-8', mode='w')
        fileout.write(filein.read())
        fileout.close()

filelist = filelist.split('\n')
for i in filelist:
    if i!='': convert_1252_65008(i)

Она бы мне всё перекодировала.
И тэги, если надо, я бы расставил питоном — но надо видеть файл, чтобы знать, как это лучше сделать.
Название: Пакетное перекодирование файлов
Отправлено: Bhudh от февраля 3, 2014, 07:13
А без pythonʼа и sedʼа никак?‥
Название: Пакетное перекодирование файлов
Отправлено: Hellerick от февраля 3, 2014, 07:52
Если устроит Unicode-16, то можно сделать *.vbs, которые, наверное, сработает, если установлен MS Office.

ЦитироватьSet fso = CreateObject("Scripting.FileSystemObject")
Set stream = CreateObject("ADODB.Stream")
stream.Open
stream.Type = 2 'text
stream.Charset = "windows-1252"
stream.LoadFromFile "File.txt"
fso.OpenTextFile("File.Unicode.txt", 2, True, True).Write stream.ReadText
stream.Close
Название: Пакетное перекодирование файлов
Отправлено: Bhudh от февраля 3, 2014, 08:01
Не уверен, что моя опера нормально поймёт UTF-16.
Уж лучше sed-ом, тем более что я скачал и поставил версию для винды. Только не понимаю в нём ни хрена. :-\
Название: Пакетное перекодирование файлов
Отправлено: Тайльнемер от февраля 3, 2014, 08:50
PowerShell'ом не владею, но у меня получилось так:

Get-ChildItem "D:\Folder\*.txt" | Foreach-Object {
$inputBytes = Get-Content -encoding Byte $_
$text = [System.Text.Encoding]::GetEncoding(1252).GetString($inputBytes)
$outputBytes = [System.Text.Encoding]::Utf8.GetBytes($text)
Set-Content -encoding Byte $_ $outputBytes
}
Название: Пакетное перекодирование файлов
Отправлено: Bhudh от февраля 3, 2014, 09:02
Эмм... И куды мне в XP этот пауэршелл совать⁈ Файло .ps1 система чо-й-то не понимает... :what:
Название: Пакетное перекодирование файлов
Отправлено: Hellerick от февраля 3, 2014, 09:35
Цитата: Bhudh от февраля  3, 2014, 08:01
Не уверен, что моя опера нормально поймёт UTF-16.
Уж лучше sed-ом, тем более что я скачал и поставил версию для винды. Только не понимаю в нём ни хрена. :-\

Вот я состряпал скрипт для SSED'а (у меня он именно так называется, чем он отличается от SED я плохо разбираюсь) для конвертации из windows-1252 в HTML'овские обозначения символов (типа &#x0430;).

Кладете файл 1252-UTF8.sed рядом с SED'ом, там же создаете bat-файл, в котором пишете что-то типа:

Цитироватьsed -R -f 1252-UTF8.sed "D:\MyFolder\MyFile.htm" >"D:\MyFolder\MyFile.unicode.htm"

Дай бог, сработает.
Название: Пакетное перекодирование файлов
Отправлено: Hellerick от февраля 3, 2014, 09:41
Файл по-дурацки назвал. Ничего от UTF-8 же в нем не осталось. Надо было написать 1252-to-html.sed.
Название: Пакетное перекодирование файлов
Отправлено: Bhudh от февраля 3, 2014, 09:52
Масок не понимает. Мне ж нужно не MyFile.htm, а *.htm...
Название: Пакетное перекодирование файлов
Отправлено: antic от февраля 3, 2014, 10:07
А что, трудно найти программу для пакетной перекодировки? Например, HTML Changer
Название: Пакетное перекодирование файлов
Отправлено: Тайльнемер от февраля 3, 2014, 10:12
Цитата: Bhudh от февраля  3, 2014, 09:02
И куды мне в XP этот пауэршелл совать⁈
Ой, я забыл, что XP.

Ну для XP нагуглился пакет обновления с PowerShell'ом (http://www.microsoft.com/en-us/download/details.aspx?id=16818).
Проверил на виртуалке с XP — работает.
Название: Пакетное перекодирование файлов
Отправлено: Bhudh от февраля 3, 2014, 10:14
HTML Changer, насколько я понял, работает как «найти-заменить». А таблицу «что найти-на что заменить» надо делать ручками. Как-то для смены кодировки не особо подходит...


Попробовал запустить тайльнемеровский код в PowerShell, упихнув его в файл .ps1.
Увы:
Цитата: The term 'pack.ps1' is not recognized as a cmdlet, function, operable program, or script file. Verify the term and try again.
Ышшу в мануальчике команду запуска скриптов...
Название: Пакетное перекодирование файлов
Отправлено: Тайльнемер от февраля 3, 2014, 10:15
Я файл скрипта не создавал.
После установки пакета нажал Win+R, набрал "powershell", скопипастил скрипт в окно консоли, нажал 2 раза Enter.
Название: Пакетное перекодирование файлов
Отправлено: Hellerick от февраля 3, 2014, 10:34
Цитата: Bhudh от февраля  3, 2014, 09:52
Масок не понимает. Мне ж нужно не MyFile.htm, а *.htm...

А тоталКоммандер у вас список файлов выдать не может?
Название: Пакетное перекодирование файлов
Отправлено: Bhudh от февраля 3, 2014, 10:37
Цитата: Тайльнемер от февраля  3, 2014, 10:15Я файл скрипта не создавал.
После установки пакета нажал Win+R, набрал "powershell", скопипастил скрипт в окно консоли, нажал 2 раза Enter.
Неважно. У меня запустился скриптом (хотя странновато, конечно, юзать cmd для запуска ps :green:), но: результат не тот, что надо.
Вместо перекодировки файлов PowerShell вольготно расположился в консоли, заменив собой cmd.

Сейчас пробую запустить скрипт из консоли самого PS. Пока жрёт память и проц...
Название: Пакетное перекодирование файлов
Отправлено: Bhudh от февраля 3, 2014, 10:38
Цитата: Hellerick от февраля  3, 2014, 10:34А тоталКоммандер у вас список файлов выдать не может?
Не пользуюсь TC.
Название: Пакетное перекодирование файлов
Отправлено: Hellerick от февраля 3, 2014, 10:42
Цитата: Bhudh от февраля  3, 2014, 10:38
Цитата: Hellerick от февраля  3, 2014, 10:34А тоталКоммандер у вас список файлов выдать не может?
Не пользуюсь TC.

:uzhos:
Да шо же там за компутер такой. Ничиво нету.
Название: Пакетное перекодирование файлов
Отправлено: Bhudh от февраля 3, 2014, 10:46
Всё тут есть. Но не пользуюсь.
Блин, этот скрипт полминуты файл в 35 KB обрабатывает :fp:. А в папке их 144!
Название: Пакетное перекодирование файлов
Отправлено: Bhudh от февраля 3, 2014, 10:56
(http://puu.sh/6Il8b.png) (http://puu.sh/6Il8w.png)

:wall: Какого чёрта в безBOMном оно так отображается?!
Название: Пакетное перекодирование файлов
Отправлено: Bhudh от февраля 3, 2014, 11:00
Пока обработал 60 файлов за 25 минут. ОМГ.
Название: Пакетное перекодирование файлов
Отправлено: amdf от февраля 3, 2014, 11:19
Ставите iconv, версию для Windows.

Дальше. Набор пакетных файлов:

all.cmd

for /R %%i in (.) do call txt.cmd %%i


iconv2.cmd

iconv -c -f cp866 -t UTF-8 %1 > win.%1
del %1
rename win.%1 %1


txt.cmd

set cd2=%cd%
cd %1
for %%j in (*.txt) do call %cd2%\iconv2.cmd %%j
cd %cd2%


Кладёте папку с файлами туда, где скрипты. Запускаете all.cmd. В iconv2.cmd указать нужную исходную кодировку вместо 866.
Название: Пакетное перекодирование файлов
Отправлено: Bhudh от февраля 3, 2014, 11:24
Уже перекодировал. За 43 минуты.
Но всё равно: для простой, казалось бы, задачи, для набившей всем оскомину проблемы с кодировками просто НЕТ нормального инструмента и приходится руками писать самопальные скрипты и батники, как в каких-нибудь 80-х‼
ПОЧЕМУ???
Название: Пакетное перекодирование файлов
Отправлено: antic от февраля 3, 2014, 12:07
Цитата: Bhudh от февраля  3, 2014, 10:14
HTML Changer, насколько я понял, работает как «найти-заменить». А таблицу «что найти-на что заменить» надо делать ручками. Как-то для смены кодировки не особо подходит...
Вы неправильно понимаете. Точнее, не до конца понимаете. Точнее, не полностью, только частично.
У этой программы есть два режима: удаление, замена, вставка кусков текста и перекодировка страницы.
Для изменения кодировок нужно сделать два этапа работы: произвести собственно перекодировку и произвести замену тега с указанием кодировки.
Всё вместе занимает около трёх минут рабочего времени оператора!
Вы вместо этого 43 минуты мучились, да ещё, наверное, до этого экспериментировали черт знает сколько времени, и на форуме висели.

Название: Пакетное перекодирование файлов
Отправлено: Bhudh от февраля 3, 2014, 12:13
Цитата: antic от февраля  3, 2014, 12:07Для изменения кодировок нужно сделать два этапа работы: произвести собственно перекодировку и произвести замену тега с указанием кодировки.
А теперь ложка дёгтя: в настройках программы просто нет кодировки windows-1252.
Там только кириллические кодировки, из одной которой в другую и предлагается перекодировать.
Так как программа делалась для русскоязычного пользователя.

(http://puu.sh/6InyF.png)
Название: Пакетное перекодирование файлов
Отправлено: antic от февраля 3, 2014, 12:28
Ну, на вас не угодишь. Попробуйте поискать более новую версию, может быть там есть
Название: Пакетное перекодирование файлов
Отправлено: amdf от февраля 3, 2014, 12:31
Цитата: Bhudh от февраля  3, 2014, 11:24
Уже перекодировал. За 43 минуты.
Но всё равно: для простой, казалось бы, задачи, для набившей всем оскомину проблемы с кодировками просто НЕТ нормального инструмента и приходится руками писать самопальные скрипты и батники, как в каких-нибудь 80-х‼
ПОЧЕМУ???
Потому что путь Unix учит нас делать так. Кто неспособен написать скрипт или воспользоваться консольным инструментом, великолепно выполняющем свою узкую задачу, тот будет довольствоваться "удобными" программами, осуществляющими перекодирование за 43 минуты, и ещё большее количество минут искать их.
Название: Пакетное перекодирование файлов
Отправлено: Тайльнемер от февраля 3, 2014, 12:44
Цитата: Bhudh от февраля  3, 2014, 10:46
Блин, этот скрипт полминуты файл в 35 KB обрабатывает :fp:. А в папке их 144!
Вы про пауэршелловский скрипт?
Название: Пакетное перекодирование файлов
Отправлено: Hellerick от февраля 3, 2014, 13:04
Цитата: Bhudh от февраля  3, 2014, 11:24
ПОЧЕМУ???

Это правильно.

Можно на каждую элементарную операцию иметь по программе, а потом хранить весь этот зоопарк, надеясь, что однажды удастся ими воспользоваться, а можно иметь пару-тройку универсальных инструментов и уметь применять их. Второе перспективнее.
Название: Пакетное перекодирование файлов
Отправлено: Bhudh от февраля 3, 2014, 13:16
Цитата: amdf от февраля  3, 2014, 12:31тот будет довольствоваться "удобными" программами, осуществляющими перекодирование за 43 минуты
Цитата: Тайльнемер от февраля  3, 2014, 12:44Вы про пауэршелловский скрипт?
Да, я именно про пауэршелловский скрипт, а не про "удобную" программу.
Название: Пакетное перекодирование файлов
Отправлено: Bhudh от февраля 3, 2014, 13:18
Цитата: Hellerick от февраля  3, 2014, 13:04а можно иметь пару-тройку универсальных инструментов
Только у каждого универсального инструмента оказывается свой собственный ни на что не похожий универсальный язык и будь любезен учи их все: bash, sed, cmd, powershell...
Название: Пакетное перекодирование файлов
Отправлено: Hellerick от февраля 3, 2014, 13:50
Цитата: Bhudh от февраля  3, 2014, 13:18
Только у каждого универсального инструмента оказывается свой собственный ни на что не похожий универсальный язык и будь любезен учи их все: bash, sed, cmd, powershell...

Большая часть знаний по SED'у потом оказывается полезной в питоне.  :)
Название: Пакетное перекодирование файлов
Отправлено: Bhudh от февраля 3, 2014, 16:44
Ну это если потом начать учить питон.
Название: Пакетное перекодирование файлов
Отправлено: Rwseg от февраля 3, 2014, 18:58
http://sourceforge.net/projects/cp-converter/
Попробуйте.
Название: Пакетное перекодирование файлов
Отправлено: Bhudh от февраля 3, 2014, 19:54
О-о-о, вот это замечательная вещь! Спасибо!
Название: Пакетное перекодирование файлов
Отправлено: Rwseg от февраля 3, 2014, 20:03
Цитата: Bhudh от февраля  3, 2014, 19:54
вот это замечательная вещь!
Сработало?
Offtop
Цитата: Bhudh от февраля  3, 2014, 19:54
Спасибо!
Привет Воронежу! :UU:
Название: Пакетное перекодирование файлов
Отправлено: Bhudh от февраля 3, 2014, 20:21
Цитата: Rwseg от февраля  3, 2014, 20:03Сработало?
Мгновенно работает! То, что доктор прописал.

Offtop
:UU:
Название: Пакетное перекодирование файлов
Отправлено: Python от февраля 4, 2014, 16:56
Перекодировку можно сделать с помощью iconv (юниксовая утилита, есть портированные версии для windows):
iconv -f windows-1252 -t utf-8 <ansifile.htm >utf8file.htm
Требуется также добавить тег meta:
sed "s|<head>|<head><meta  http-equiv='Content-Type' content='text/html; charset=UTF-8' />|i" <utf8.htm >uf8.html

Все вместе в цикле (для конвертирования всех файлов htm в текущей папке с выводом в файлы с расширением html) будет выглядеть так:
for %i in (*.htm) do iconv -f windows-1252 -t utf-8 <%i | sed "s|<head>|<head><meta  http-equiv='Content-Type' content='text/html; charset=UTF-8' />|i" >%il
(При использовании этой команды в батнике, % нужно везде заменить на %% )