Дано: кучка 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.
Что делать? Есть ли решение через командную строку, например?
Цитата: Bhudh от февраля 3, 2014, 06:00
Простая перекодировка из win в utf бесполезна: вместо «blæce, blæcðu», видимого в windows-1252, появляется «blжce, blжcÑ€u».
Т.е. задача сводится к тому, чтобы в начале каждого файла поставить byte-order-mark?
Ах да, у вас же, наверное, и в самом HTML кодировка как-то указана?
Цитата: Hellerick от февраля 3, 2014, 06:38Т.е. задача сводится к тому, чтобы в начале каждого файла поставить byte-order-mark?
Нет. BOM как раз нежелателен, это же HTML. А сами файлы в кодировке ANSI/Windows-1252.
Цитата: Hellerick от февраля 3, 2014, 06:40в самом HTML кодировка как-то указана?
К сожалению, нет. Тэг
<meta> отсутствует в принципе.
Насколько я понимаю, формально вы задачу уже решили этой вашей «простой перекодировкой».
Вопрос не в том, как файлы перекодировать, а как их потом правильно прочитать. А это зависит от того, чем вы их читаете, и как сами файлы изнутри выглядят.
Цитата: 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'ом принудительно расствить.
Цитата: 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-215
1 (кириллица).
В win-125
1 E6 и F0 — это 'ж' и 'р'.
В UTF-8 'ж' и 'р' — это D0,B6 и D1,80.
В win-1252 D0,B6 и D1,80 — это 'ж' и 'Ñ€'.
То есть, по
л-беды в том, что вы перекодируете из win-1251 в UTF-8, а не из win-1252.
Вторые пол-беды, что полученный файл вы читаете как win-1252, а не как UTF-8.
Цитата: Hellerick от февраля 3, 2014, 06:56формально вы задачу уже решили этой вашей «простой перекодировкой»
Не решил. Мне нужно пакетное решение, а перекодировать я могу только по одному файлу в Notepad++ в 2 действия:
- Выставить правильную ANSI-кодировку (поменять автоматически выставляемую windows-1251 на windows-1252);
- Кодировать в UTF-8.
Цитата: Тайльнемер от февраля 3, 2014, 07:05То есть, пол-беды в том, что вы перекодируете из win-1251 в UTF-8, а не из win-1252.
Вторые пол-беды, что полученный файл вы читаете как win-1252, а не как UTF-8.
С этими полбедами уже разобрался.
Win-1251 по дефолту ставит Notepad++ для ANSI-файлов.
Цитата: Тайльнемер от февраля 3, 2014, 07:05В win-1252 'æ' и 'ð' — это E6 и F0, соответственно.
В UTF-8 'æ' и 'ð' — это C3,A6 и C3,B0.
Вот в том и состоит задача, чтобы win-1252-шные E6 и F0 перевести в UTF-8-шные C3,A6 и C3,B0. И все остальные тоже.
В тертьем питоне я бы написал такую программку:
Цитировать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)
Она бы мне всё перекодировала.
И тэги, если надо, я бы расставил питоном — но надо видеть файл, чтобы знать, как это лучше сделать.
А без pythonʼа и sedʼа никак?‥
Если устроит 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
Не уверен, что моя опера нормально поймёт UTF-16.
Уж лучше sed-ом, тем более что я скачал и поставил версию для винды. Только не понимаю в нём ни хрена. :-\
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
}
Эмм... И куды мне в XP этот пауэршелл совать⁈ Файло .ps1 система чо-й-то не понимает... :what:
Цитата: Bhudh от февраля 3, 2014, 08:01
Не уверен, что моя опера нормально поймёт UTF-16.
Уж лучше sed-ом, тем более что я скачал и поставил версию для винды. Только не понимаю в нём ни хрена. :-\
Вот я состряпал скрипт для SSED'а (у меня он именно так называется, чем он отличается от SED я плохо разбираюсь) для конвертации из windows-1252 в HTML'овские обозначения символов (типа
а).
Кладете файл 1252-UTF8.sed рядом с SED'ом, там же создаете bat-файл, в котором пишете что-то типа:
Цитироватьsed -R -f 1252-UTF8.sed "D:\MyFolder\MyFile.htm" >"D:\MyFolder\MyFile.unicode.htm"
Дай бог, сработает.
Файл по-дурацки назвал. Ничего от UTF-8 же в нем не осталось. Надо было написать 1252-to-html.sed.
Масок не понимает. Мне ж нужно не MyFile.htm, а *.htm...
А что, трудно найти программу для пакетной перекодировки? Например, HTML Changer
Цитата: Bhudh от февраля 3, 2014, 09:02
И куды мне в XP этот пауэршелл совать⁈
Ой, я забыл, что XP.
Ну для XP нагуглился пакет обновления с PowerShell'ом (http://www.microsoft.com/en-us/download/details.aspx?id=16818).
Проверил на виртуалке с XP — работает.
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.
Ышшу в мануальчике команду запуска скриптов...
Я файл скрипта не создавал.
После установки пакета нажал Win+R, набрал "powershell", скопипастил скрипт в окно консоли, нажал 2 раза Enter.
Цитата: Bhudh от февраля 3, 2014, 09:52
Масок не понимает. Мне ж нужно не MyFile.htm, а *.htm...
А тоталКоммандер у вас список файлов выдать не может?
Цитата: Тайльнемер от февраля 3, 2014, 10:15Я файл скрипта не создавал.
После установки пакета нажал Win+R, набрал "powershell", скопипастил скрипт в окно консоли, нажал 2 раза Enter.
Неважно. У меня запустился скриптом (хотя странновато, конечно, юзать cmd для запуска ps :green:), но: результат не тот, что надо.
Вместо перекодировки файлов PowerShell вольготно расположился в консоли, заменив собой cmd.
Сейчас пробую запустить скрипт из консоли самого PS. Пока жрёт память и проц...
Цитата: Hellerick от февраля 3, 2014, 10:34А тоталКоммандер у вас список файлов выдать не может?
Не пользуюсь TC.
Цитата: Bhudh от февраля 3, 2014, 10:38
Цитата: Hellerick от февраля 3, 2014, 10:34А тоталКоммандер у вас список файлов выдать не может?
Не пользуюсь TC.
:uzhos:
Да шо же там за компутер такой. Ничиво нету.
Всё тут есть. Но не пользуюсь.
Блин, этот скрипт полминуты файл в 35 KB обрабатывает :fp:. А в папке их 144!
(http://puu.sh/6Il8b.png) (http://puu.sh/6Il8w.png)
:wall: Какого чёрта в безBOMном оно так отображается?!
Пока обработал 60 файлов за 25 минут. ОМГ.
Ставите 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.
Уже перекодировал. За 43 минуты.
Но всё равно: для простой, казалось бы, задачи, для набившей всем оскомину проблемы с кодировками просто НЕТ нормального инструмента и приходится руками писать самопальные скрипты и батники, как в каких-нибудь 80-х‼
ПОЧЕМУ???
Цитата: Bhudh от февраля 3, 2014, 10:14
HTML Changer, насколько я понял, работает как «найти-заменить». А таблицу «что найти-на что заменить» надо делать ручками. Как-то для смены кодировки не особо подходит...
Вы неправильно понимаете. Точнее, не до конца понимаете. Точнее, не полностью, только частично.
У этой программы есть два режима: удаление, замена, вставка кусков текста и перекодировка страницы.
Для изменения кодировок нужно сделать два этапа работы: произвести собственно перекодировку и произвести замену тега с указанием кодировки.
Всё вместе занимает около трёх минут рабочего времени оператора!
Вы вместо этого 43 минуты мучились, да ещё, наверное, до этого экспериментировали черт знает сколько времени, и на форуме висели.
Цитата: antic от февраля 3, 2014, 12:07Для изменения кодировок нужно сделать два этапа работы: произвести собственно перекодировку и произвести замену тега с указанием кодировки.
А теперь ложка дёгтя: в настройках программы просто
нет кодировки windows-1252.
Там только кириллические кодировки, из одной которой в другую и предлагается перекодировать.
Так как программа делалась для русскоязычного пользователя.
(http://puu.sh/6InyF.png)
Ну, на вас не угодишь. Попробуйте поискать более новую версию, может быть там есть
Цитата: Bhudh от февраля 3, 2014, 11:24
Уже перекодировал. За 43 минуты.
Но всё равно: для простой, казалось бы, задачи, для набившей всем оскомину проблемы с кодировками просто НЕТ нормального инструмента и приходится руками писать самопальные скрипты и батники, как в каких-нибудь 80-х‼
ПОЧЕМУ???
Потому что путь Unix учит нас делать так. Кто неспособен написать скрипт или воспользоваться консольным инструментом, великолепно выполняющем свою узкую задачу, тот будет довольствоваться "удобными" программами, осуществляющими перекодирование за 43 минуты, и ещё большее количество минут искать их.
Цитата: Bhudh от февраля 3, 2014, 10:46
Блин, этот скрипт полминуты файл в 35 KB обрабатывает :fp:. А в папке их 144!
Вы про пауэршелловский скрипт?
Цитата: Bhudh от февраля 3, 2014, 11:24
ПОЧЕМУ???
Это правильно.
Можно на каждую элементарную операцию иметь по программе, а потом хранить весь этот зоопарк, надеясь, что однажды удастся ими воспользоваться, а можно иметь пару-тройку универсальных инструментов и уметь применять их. Второе перспективнее.
Цитата: amdf от февраля 3, 2014, 12:31тот будет довольствоваться "удобными" программами, осуществляющими перекодирование за 43 минуты
Цитата: Тайльнемер от февраля 3, 2014, 12:44Вы про пауэршелловский скрипт?
Да, я именно про пауэршелловский скрипт, а не про "удобную" программу.
Цитата: Hellerick от февраля 3, 2014, 13:04а можно иметь пару-тройку универсальных инструментов
Только у каждого универсального инструмента оказывается свой собственный ни на что не похожий универсальный язык и будь любезен учи их все: bash, sed, cmd, powershell...
Цитата: Bhudh от февраля 3, 2014, 13:18
Только у каждого универсального инструмента оказывается свой собственный ни на что не похожий универсальный язык и будь любезен учи их все: bash, sed, cmd, powershell...
Большая часть знаний по SED'у потом оказывается полезной в питоне. :)
Ну это если потом начать учить питон.
http://sourceforge.net/projects/cp-converter/
Попробуйте.
О-о-о, вот это замечательная вещь! Спасибо!
Цитата: Rwseg от февраля 3, 2014, 20:03Сработало?
Мгновенно работает! То, что доктор прописал.
:UU:
Перекодировку можно сделать с помощью 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
(При использовании этой команды в батнике, % нужно везде заменить на %% )