|
|||||||
Как сделать в редакторе micro автоматическое определение кодировки?
Время создания: 12.08.2023 19:59
Текстовые метки: linux, micro, editor, редактор, определение, кодировка, charset
Раздел: Компьютер - Linux - Редакторы текста - Текстовый редактор micro
Запись: xintrea/mytetra_syncro/master/base/1691859582pms786t84t/text.html на raw.github.com
|
|||||||
|
|||||||
Если файл создан в какой-то кодировке, отличной от UTF-8, то редактор micro не знает об этом и показывает кракозябры. Вопрос: можно ли настроить micro так, чтобы он автоматически определял кодировку файла и работал в ней? Ответ: сам micro так настроить нельзя. Но можно создать обертку для micro, которая определит кодировку файла, создаст временный файл в котором сделана перекодировка в UTF-8, и откроет micro с этим временным файлом. После завершения работы редактора micro, эта обертка возмет отредактированный файл, переведет его из кодировки UTF-8 в исходную, и скопирует на место редактируемого файла. Для автоматического определения кодировки используется linux-утилита uchardet. Для конвертирования файлов в различные кодировки используется утилита iconv. Нижеприведенный скрипт, на самом деле, можно использовать не только с редактором micro, но и в совокупности с любым другим редактором, у которого нет автоматического детектирования кодировки текстового файла. Чтобы воспользоваться данным скриптом, надо просто вместо бинарника редактора micro запускать данный скрипт. Примечание: видимо, в данный скрипт надо еще добавить установку первоначального владельца и группы для итогового файла (а не только права), так как если файл принадлежит какому-либо пользователю, а открывается на редактирование под root, то в случае работы с другой кодировкой, поверх старого файла будет скопирован новый файл, а у него владелец будет уже root, а не обычный пользователь. И скорее всего, после этого действия, обычный пользователь уже не сможет его редактировать. /opt/script/microAuto.sh #!/bin/bash # В первом параметре $1 должно быть имя файла # Если первый параметр пустой (все пробелы в проверяемой строке удаляются) if [ -z "${1// /}" ] then echo "No filename in parameter" # Просто запускается редактор micro micro exit fi # Если файл не сущесвует if test ! -f "$1"; then echo "File not found"; exit fi # Автоопределение кодировки файла cp=`uchardet "$1"` # echo $cp # Если кодировка не определена или кодировка соответствует системной, # процедуру подмены перекодированного файла запускать не имеет смысла if [[ "$cp" == "ascii/unknown" || "$cp" == "UTF-8" ]] then micro "$1" exit 0 fi workDirName="/tmp/codePageAutoDetect" subDirName=`cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1` fileDirName=$workDirName/$subDirName shortFileName=`basename "$1"` fullFileName=$fileDirName/$shortFileName filePermission=`stat -c "%a" "$1"` # Создается временный каталог mkdir -p $fileDirName # Во временный каталог копируется редактируемый файл со своим именем cp "$1" "$fullFileName" # Файл во временном каталоге переконвертируется из своей кодировки в UTF-8 iconv -f $cp -t UTF-8 "$fullFileName" -o tmpfile && mv tmpfile "$fullFileName" # Запоминается время последнего изменения, чтобы после срабатывания редактора определять, было ли редактирование modifyTimeBefore=`LC_ALL=C stat "$fullFileName" | grep "^Modify:"` # echo $modifyTimeBefore # Открывается редактор micro "$fullFileName" modifyTimeAfter=`LC_ALL=C stat "$fullFileName" | grep "^Modify:"` # echo $modifyTimeAfter # Если время до редактирвания и после редактирования отличаются if test ! "$modifyTimeBefore" = "$modifyTimeAfter"; then # echo "Is modify" # Файл во временном каталоге переконвертируется из UTF-8 в свою кодировку iconv -f UTF-8 -t $cp "$fullFileName" -o tmpfile && mv tmpfile "$fullFileName" # Отредактированный файл переносится поверх исходного mv -f "$fullFileName" "$1" # Отредактированному файлу выставляются прежние права chmod $filePermission "$1" else # echo "Is not modify" rm -f "$fullFileName" fi # Удаляется временный каталог rmdir $fileDirName |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|