Главное меню
Мы солидарны с Украиной. Узнайте здесь, как можно поддержать Украину.

Пакетное перекодирование файлов

Автор Bhudh, февраля 3, 2014, 06:00

0 Пользователи и 1 гость просматривают эту тему.

Bhudh

Дано: кучка 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.
Что делать? Есть ли решение через командную строку, например?
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Hellerick

Цитата: Bhudh от февраля  3, 2014, 06:00
Простая перекодировка из win в utf бесполезна: вместо «blæce, blæcðu», видимого в windows-1252, появляется «blжce, blжcÑ€u».

Т.е. задача сводится к тому, чтобы в начале каждого файла поставить byte-order-mark?

Hellerick

Ах да, у вас же, наверное, и в самом HTML кодировка как-то указана?

Bhudh

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

Цитата: Hellerick от февраля  3, 2014, 06:40в самом HTML кодировка как-то указана?
К сожалению, нет. Тэг <meta> отсутствует в принципе.
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Hellerick

Насколько я понимаю, формально вы задачу уже решили этой вашей «простой перекодировкой».

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

Цитата: 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-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

Цитата: Hellerick от февраля  3, 2014, 06:56формально вы задачу уже решили этой вашей «простой перекодировкой»
Не решил. Мне нужно пакетное решение, а перекодировать я могу только по одному файлу в Notepad++ в 2 действия:
  • Выставить правильную ANSI-кодировку (поменять автоматически выставляемую windows-1251 на windows-1252);
  • Кодировать в UTF-8.
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Bhudh

Цитата: Тайльнемер от февраля  3, 2014, 07:05То есть, пол-беды в том, что вы перекодируете из win-1251 в UTF-8, а не из win-1252.
Вторые пол-беды, что полученный файл вы читаете как win-1252, а не как UTF-8.
С этими полбедами уже разобрался.
Win-1251 по дефолту ставит Notepad++ для ANSI-файлов.
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Bhudh

Цитата: Тайльнемер от февраля  3, 2014, 07:05В win-1252 'æ' и 'ð' — это E6 и F0, соответственно.
В UTF-8 'æ' и 'ð' — это C3,A6 и C3,B0.
Вот в том и состоит задача, чтобы win-1252-шные E6 и F0 перевести в UTF-8-шные C3,A6 и C3,B0. И все остальные тоже.
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Hellerick

В тертьем питоне я бы написал такую программку:

Цитировать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

Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Hellerick

Если устроит 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

Не уверен, что моя опера нормально поймёт UTF-16.
Уж лучше sed-ом, тем более что я скачал и поставил версию для винды. Только не понимаю в нём ни хрена. :-\
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Тайльнемер

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

Эмм... И куды мне в XP этот пауэршелл совать⁈ Файло .ps1 система чо-й-то не понимает... :what:
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Hellerick

Цитата: 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

Файл по-дурацки назвал. Ничего от UTF-8 же в нем не осталось. Надо было написать 1252-to-html.sed.

Bhudh

Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

antic

А что, трудно найти программу для пакетной перекодировки? Например, HTML Changer
— Боже мой, боже мой, чем вы вынуждены заниматься! Но я спрашиваю вас, кто-то все-таки летит ведь к звёздам! Где-то строят мезонные реакторы! Где-то создают новую педагогику! Боже мой, совсем недавно я понял, что мы даже не захолустье, мы — заповедник! В глазах всего мира мы — заповедник глупости, невежества и порнократии.
АБС «Хищные вещи века»

Тайльнемер

Цитата: Bhudh от февраля  3, 2014, 09:02
И куды мне в XP этот пауэршелл совать⁈
Ой, я забыл, что XP.

Ну для XP нагуглился пакет обновления с PowerShell'ом.
Проверил на виртуалке с XP — работает.

Bhudh

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.
Ышшу в мануальчике команду запуска скриптов...
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Тайльнемер

Я файл скрипта не создавал.
После установки пакета нажал Win+R, набрал "powershell", скопипастил скрипт в окно консоли, нажал 2 раза Enter.

Hellerick

Цитата: Bhudh от февраля  3, 2014, 09:52
Масок не понимает. Мне ж нужно не MyFile.htm, а *.htm...

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

Bhudh

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

Сейчас пробую запустить скрипт из консоли самого PS. Пока жрёт память и проц...
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Bhudh

Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Быстрый ответ

Обратите внимание: данное сообщение не будет отображаться, пока модератор не одобрит его.

Имя:
Имейл:
Проверка:
Оставьте это поле пустым:
Наберите символы, которые изображены на картинке
Прослушать / Запросить другое изображение

Наберите символы, которые изображены на картинке:

√36:
ALT+S — отправить
ALT+P — предварительный просмотр