ZenWay - Linux сегодня!
  • Главная
  • Форум
  • Контакты
  • Архив
  • Гостевая книга
×
Поиск по сайту
ГлавнаяHужное/полезноеИзучаем LinuxДополнительные материалыКодировки

Кодировки

Дополнительные материалы, Изучаем Linux, Hужное/полезноеПросмотров: 15376Комментарии: 919 декабря 2009 г.
Console / Python / Приятные мелочи / Простая утилита / Учебные материалы

До сих пор время от времени сталкиваюсь с проблемами отображения текста в следствии зоопарка кодировок. Все проблемы решаются поиском в интернете и перебором различных способов, пока не находишь нужного результата! Мне это надоело и я решил собрать в oдном мecтe проверенные решения...

Начнём с кодировок в названиях файлов

Если нам нужно перекодировать раздел с виндовыми файлами в правильную кодировку, то необходимо выполнить следующее:

convmv -r -f cp1251 -t utf-8 --notest

Без параметра --notest процесс пройдёт лишь в тестовом режиме. С этим же параметром все изменения будут записаны на файловую систему. Сам convmv должен быть предварительно установлен.

Иногда бывают ситуации, когда нужно избавиться от названий файлов, в которых присутствует кириллица. Тут тоже всё просто. Создаём файл со следующим содержанием и выполняем его:

#!/bin/bash
# Перекодирует рекурсивно в текущем каталоге имена
# файлов и каталогов в транслит.

shopt -s nullglob

for NAME in *.mp3 ; do
  TRS=`echo $NAME | sed "y/абвгдезийклмнопрстуфхцы/abvgdezijklmnoprstufxcy/"`
  TRS=`echo $TRS  | sed "y/АБВГДЕЗИЙКЛМНОПРСТУФХЦЫ/ABVGDEZIJKLMNOPRSTUFXCY/"`
  TRS=${TRS//ч/ch};
  TRS=${TRS//Ч/CH} TRS=${TRS//ш/sh};
  TRS=${TRS//Ш/SH} TRS=${TRS//ё/jo};
  TRS=${TRS//Ё/JO} TRS=${TRS//ж/zh};
  TRS=${TRS//Ж/ZH} TRS=${TRS//щ/sh\'};
  TRS=${TRS//Щ/SH\'} TRS=${TRS//э/je};
  TRS=${TRS//Э/JE} TRS=${TRS//ю/ju};
  TRS=${TRS//Ю/JU} TRS=${TRS//я/ja};
  TRS=${TRS//Я/JA} TRS=${TRS//ъ/\`};
  TRS=${TRS//ъ\`} TRS=${TRS//ь/\'};
  TRS=${TRS//Ь/\'}
  if [[ `file -b "$NAME"` == directory ]]; then
    mv -v "$NAME" "$TRS"
    cd "$TRS"
    "$0"
    cd ..
  else
    mv -v "$NAME" "$TRS"
  fi
done

Всё просто.

А вот ещё задача. Ну просто огромная куча текстовых файлов в какой-то кодировке. Допустим, в той же cp1251. А нам нужно всё это добро конвертировать во всё ту же незаменимую UTF-8. Из всего найденного мне понравился такой подход:

time find /www/server/ -name "*.html" -exec iconv -f=CP1251 -t=UTF-8 {} -o {} \; -exec echo {} \;

или

find . | while read i; do iconv -f WINDOWS-1251 -t UTF-8 "$i" >tmp; mv tmp "$i"; done

Будут конвертированы все файлы во всех вложенных директориях. Только учтите, что и бинарные файлы (например, картинки) тоже будут "конвертированы", то есть повреждены. Поэтому, если у вас всё вперемешку, то нужно из поиска их исключить. Как? После "find . | " дописать что-то вроде:

grep -v png | grep -v jpg | grep -v gif | 

То есть, начало будет такое:

find . | grep -v png | grep -v jpg | grep -v gif | while read i; do ......

Или, если конвертировать в юникод нужно только php-файлы, то достаточно сделать так:

find . -name '*.php' | while read i; do iconv -f WINDOWS-1251 -t UTF-8 "$i" \
 >tmp; mv tmp "$i"; done

Где такое могло понадобится? А, например, старый сайт был создан ещё тогда, когда многие про юникод ничего не знали. Следовательно, конвертирование - это ещё не всё. Нужно найти все упоминание корня всех проблем - windows-1251. Ну, тут проще простого:

grep -ir windows-1251 .

Точка в конце означает, что искать команда будет с текущей директории. Опции же -ir помогают нам вывести на экран все значения не зависимо от регистра, притом поиск будет рекурсивным (во всех вложенных директориях).

Увидели результат. Допустим, у нас искомое было в файлах типа *.php. Хорошо, тогда мы в них и произведём замену:

find . -name ".php" -exec sed -i 's/windows-1251/UTF-8/g' {} \;

Теперь ещё раз проверяем, достигли ли мы успеха:

grep -ir windows-1251 .

Всё, в этом случае больше ничего не должно вывестись на экран. Только, если не будут найдены совпадения в других файлах, которые не *.php. Тогда придётся повторить операцию и с ними. После чего можно тестировать свой старый сайт =)

Что ещё часто нам режет глаза обилием иероглифов? Конечно же теги в mp3-файлах. До сих пор находятся умельцы, которые их сохраняют в cp1251. Кривые руки таких творцов не выпрямишь, зато ошибки оных легко исправить! Устанавливаем пакет python-mutagen и приступаем к преобразованию:

find -iname '*.mp3' -print0 | xargs -0 mid3iconv -eCP1251 --remove-v1

Ещё вариант, но не использующий xargs:

find . -iname “*.mp3″ -exec mid3iconv -e CP1251 -d –remove-v1 {} ;

Вырезаются все теги id3v1, прописанные в cp1251 кодировке.

Есть ещё некий Tag2Utf cyrillic mp3-tags decoder - это скрипт на Python, который рекурсивно сканирует директорию, в которой запущен, и конвертирует все теги содержащие cp1251 и koi8-r в UTF-8. Для работы требует python-eyed3.

Для работы с тегами есть хорошая графическая программа EasyTag. Как с ней работать, разобраться несложно ;)

Автор: vovans
Еще записи по теме
F.lix (xflux / f.lux indicator applet)
F.lix (xflux / f.lux indicator applet)
Devilspie / gDevilspie
Devilspie / gDevilspie
QT V4L2 test Utility
QT V4L2 test Utility
md5deep / hashdeep
md5deep / hashdeep
wavemon
wavemon
OCS-Store
OCS-Store

Комментариев: 9 RSS

1su6s19-01-2010 14:49

Конструкцию

find . | grep -v png | grep -v jpg | grep -v gif
можно оптимизировать, задав условия еще на этапе выполнения find:

find .  ! \( -name \*jpg -o -name \*png -o -name \*gif \) 

2vovans19-01-2010 15:00

спасибо за поправку! :) хотя, уже знаю )) прочитал комментарии на ЛОР. Вот-вот собирался внести это в статью или комментарий написать :)

Ещё раз спасибо!

3vovans26-02-2010 23:32

ещё, бывает, исходники некоторые несознательные товарищи распространают в виде zip-архивов. Распаковываем такой архив и получаем нужный набор файлов с правами на выполнение... Как убрать рекурсивно у всех файлов бит на выполнение, но так, чтобы это не затронуло вложенные директории?

find . -type f -exec chmod a-x {} \;
find /путь -type f -exec chmod a-x {} \;

4vovans31-03-2010 17:48

сегодня обратилась сотрудница. Потеряла файл, который редактировала когда-то днём :) дело происходило в XFCE, в котором беда с поиском :) Так вот, проще всего было найти файл так:

find $HOME -mtime 0

в хомяке будут найдены все файлы, которые модифицировались последние сутки! ;)

5vovans27-11-2010 22:53

Есть ещё одна интересная задача, не имеющая отношения к кодировкам, но как пример использования find. Для игры Seven Kingdoms: Ancient Adversaries понадобилось все файлы ресурсов перегнать из верхнего в нижний регистры. Всё просто :)

find ./ -print | while read x ; do mv $x $(echo $x | tr 'A-Z' 'a-z'); done

6Игорь24-12-2011 14:23

Кодировки в названиях файлах можно менять и так:

устанавливаем nautilus-filename-repairer

//code.google.com/p/repairer/

//packages.ubuntu.com/ru/maverick/nautilus-filename-repairer

Перезапускаем наутилус и .. Красота!

7vovans21-09-2012 00:59

Понадобилось сегодня следущее. Есть куча файлов html. Пару сотен их. Надо сделать что-то вроде карты сайта. То есть, из списка с названиями файлов сделать набор ссылок. Список сделать легко:

ls -1

Каждое название файла будет в отдельной строке. Осталось этот список обработать. Ну, тут sed нам поможет )

ls *htm* -1 | sed 's#\([a-z]*\).*#&#g'

И получаем что-то вроде:

TMP962170103.htm
TMP963389970.htm
TMP966494650.htm
TMPhj9cd9w5lw.htm
TMPwaiwu57uht.htm

Огромная дока по sed:

//www.grymoire.com/Unix/Sed.html

помогла уже с первых страниц ))) Более объёмный материал едва ли ещё можно найти.

8Алексей27-12-2015 03:53

Спасибо.

Повесьте на сайт контекстную рекламу, чтобы спасибы были более ощутимы :)

9Владимир09-12-2016 04:24

Спасибо за Tag2Utf cyrillic mp3-tags decoder. Очень помог. Работает просто и без всяких проблем. А то пришлось бы действительно удалять все нечитаемые теги или править вручную. Или править по одному файлу, что тоже не очень...

Оставьте комментарий!

Используйте нормальные имена.

Вы можете войти под своим логином или зарегистрироваться на сайте.

(обязательно)

Рубрики
  • Hовости
  • Изучаем Linux
  • Обзоры Linux ПО
    • Hужное/полезное
    • Аудио и видео ПО
    • Графика
    • Офисное ПО
    • Интернет ПО
    • Образовательные
    • Игры
    • Администрирование
    • Системные утилиты
    • Прочие
    • Shareware / Demo
  • Дистрибутивы
  • Дополнительные материалы
Последние комментарии
AbiWord
  • Святой_Мученик_Linux » Некорректно отображает картинки в майкросовтовски х файлах doc. Картинки позиционируются одна на другую, поверх текста. В...
  • vs » К сожалению, AbiWord давно протух и толку от него ровно 0. Даже больше вреда. Сейчас...
tarsnap
  • Анонимус » В тексте опечатка "для использования для использования"
DarGUI / KDar
  • WinGamer » Можно ли забекапить всю систему windows этим архиватором?
cfiles
  • Дмитрий » так эт самое, а как например переименовать папку?
Profanity
  • zon » проше научится свой клиент написать чем разобратся куда что клацать для отправки получения месаг.
  • vovans » Тут не нужно ничего "клацать". Достаточно пару раз на хоткеи посмотреть.
noteshrink
  • Аноним » Теперь есть плюсовая (не пайтон) версия: //github. com/ ImageProcessing - ElectronicPublications /noteshrink-c/ releases
Page dewarp
  • Аноним » Теперь есть плюсовая (не пайтон) версия: //github. com/ ImageProcessing - ElectronicPublications /pagedewarp/ releases
Strawberry Music Player
  • Rododendron » А как добавить радиостанции в плеер? Нигде найти не могу.
Форум
[18/11/2022 11:54:52]
vscode and c/c++
[31/08/2022 12:25:53]
Tor Browser
[26/08/2022 07:57:14]
Музыкальный калейдоскоп
[22/05/2022 15:45:40]
Стратегии RTS
[30/03/2022 09:05:20]
Заметки с синхронизацией
[01/03/2022 20:15:05]
Говорильня (дискуссионный клуб)
[13/02/2022 11:44:28]
[РЕШЕНО] права на запись в примонтированный образ диска (raw.img)
[07/02/2022 13:22:01]
Конвертировать текст набаранный в неправильной раскладке
[04/02/2022 20:35:22]
Редактор тегов
Облако меток
2D338 3D241 ALSA68 ASCII120 Android1 Arch Linux38 Audio416 Backup80 Benchmark78 Bluetooth2 C++969 CD48 Console1318 DJ-система17 DVD47 Debian28 DjVu22 Enlightenment19 FFmpeg191 FLTK29 FPS40 FREE155 FTP18 FVWM21 Fluxbox40 GIMP24 GNU26 GPS22 GTK1302 GUI801 Gambas11 Games686 Gentoo3 Gnome349 Gstreamer133 HDD122 HDR7 HTML62 Hex-редактор14 ICQ17 IP-сети25 IP-телефон22 IRC31 ISO39 IceWM22 ImageMagick56 JACK99 Jabber35 Java308 JavaScript115 KDE209 LAN29 LXDE37 LaTeX66 Live-CD70 Live-DVD55 Live-USB53 Lua61 MATE32 MEncoder31 MIDI91 MMORPG12 Mail42 Markdown53 Mono53 Mplayer75 MySQL2 OSS9 Open Source14 OpenGL301 Openbox89 P2P51 PDF133 PHP12 Pascal17 Perl102 Phonon27 PulseAudio17 Python759 QT894 RAW34 RPG101 RSS53 RTS42 Roguelike70 Ruby19 Rust15 SDL312 SVG39 Screencast32 Screenshot61 Script78 Slackware66 TOR17 TOX3 Tk39 Torrent67 Ubuntu69 VLC16 Vala64 Web629 WebKit72 WebUI34 WiFi47 Window Maker16 Wine8 XMPP35 Xfce70 Xine14 YouTube80 video4linux27 wxWidgets108 Автоматизация31 Администрирование335 Анонимная сеть47 Антивирус14 Апплет120 Аркада235 Архиватор11 Астрономия36 Аудио конвертер70 Аудио редактор50 Аудиоплеер184 Безопасность243 Бизнес-приложение4 Браузер87 Бродилка203 Бухгалтерия11 Веб-камера36 Видео148
© Zen Way, 2023. Работает на MaxSite CMS | Время: 0.1205 | SQL: 15 | Память: 8.74MB | Вход