MyTetra Share
Делитесь знаниями!
Как сделать в редакторе 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


 
MyTetra Share v.0.65
Яндекс индекс цитирования