You are here

Автоматический рекурсивный перекодировщик

У многих из нас скопилось множество текстовых файлов и листингов программ в разных кодировках.
Под Windows проблем почти не возникает, умные редакторы сами открывают, как надо. Не везде так радужно. Народный редактор mcedit переключает кодировки вручную. Великолепный инструмент кодера Geany часто определяет кодировку неверно. Ну и вообще, бардак надо устранять.
Существуют скрипты, перекодирующие поток. У них есть недостаток — для каждого файла надо указывать кодировку персонально. В общем, мне это надоело, и я написал автомат определитель-перекодировщик. Скрипт обрабатывает файлы в текущей и низлежащих директориях. Четыре кодировки на выбор. По аналогии, можете прикрутить любую другую. 

файл transcoder

#!/bin/sh
#For content
#permission must be 755!
#/path/to/script/transcoder.sh
#sh transcoder.sh KOI8-R
#Можно положить в Path /usr/local/bin/transcoder и вызывать transcoder KOI8-R
#Эта версия удаляет переносы DOS, не останавливается при невозможности перекодировать символ
 
 
#Получаем параметр из строки
TARGET_ENCODING=$*
#Скидываем в дефолт
IS_CP1251=0
IS_UTF_8=0
IS_UTF_8=0
IS_KOI8_R=0
IS_CP866=0
IS_UTF_16LE=0
DO_IT=0
SAVEIFS=$IFS
#Устанавливаем разделитель строк
IFS='
'
if [ "${TARGET_ENCODING}" = "CP1251" ]; then
	IS_CP1251=1
	echo CP1251 $IS_CP1251
	DO_IT=1
fi
if [ "${TARGET_ENCODING}" = "UTF-8" ]; then
	IS_UTF_8=1
	echo UTF_8 $IS_UTF_8
	DO_IT=1
fi
if [ "${TARGET_ENCODING}" = "KOI8-R" ]; then
	IS_KOI8_R=1
	echo IS_KOI8_R $IS_KOI8_R
	DO_IT=1
fi
if [ "${TARGET_ENCODING}" = "CP866" ]; then
	IS_CP866=1
	echo IS_CP866 $IS_CP866
	DO_IT=1
fi
if [ "${TARGET_ENCODING}" = "UTF-16LE" ]; then
	IS_UTF_16LE=1
	echo IS_UTF_16LE $IS_UTF_16LE
	DO_IT=1
fi
 
if [ "${DO_IT}" = 0 ]; then
	echo "Please specify the target encoding."
	echo "List of available encodings:UTF-8, CP1251, KOI8-R, CP866, UTF-16LE"
	echo "Usage: transcoder <target encoding>"
	echo "e.g.: transcoder UTF-8"
fi
 
#Если "добро" (кодировка указана явно)
if [ "${DO_IT}" = 1 ]; then
#Заносим список низлежащих файлов в массив
FILES_LIST=`find . -type f  -name '*.ht*' -o -name '*.txt' -o -name '*.php'  -o -name '*.sh' -o -name '*.csv'  -o -name '*.dat'`
	for FILE in ${FILES_LIST}; do
		echo $FILE
		#echo `enca $FILE`
		#echo `enca $FILE | grep "line terminators"`
		#echo `enca $FILE | grep "MS-Windows code page 1251"`
		if [ "${IS_CP1251}" = 0 ]; then
			CODEPAGE=`enca $FILE | grep "MS-Windows code page 1251"`
			echo $CODEPAGE
			if [ "${CODEPAGE}" = "MS-Windows code page 1251" ]; then
				iconv -c -f CP1251 -t ${TARGET_ENCODING} "$FILE" | sed -e 's/'"`printf '\015'`"'$//' > tmp
				mv -f tmp "$FILE"
			fi
		fi
		if [ "${IS_UTF_8}" = 0 ]; then
			CODEPAGE=`enca $FILE | grep "Universal transformation format 8 bits"`
			echo $CODEPAGE
			if [ "${CODEPAGE}" = "Universal transformation format 8 bits; UTF-8" ]; then
				iconv -c -f UTF-8 -t ${TARGET_ENCODING} "$FILE" | sed -e 's/'"`printf '\015'`"'$//' > tmp
				mv -f tmp "$FILE"
			fi
		fi
		if [ "${IS_KOI8_R}" = 0 ]; then
			CODEPAGE=`enca $FILE | grep "KOI8-R Cyrillic"`
			echo $CODEPAGE
			if [ "${CODEPAGE}" = "KOI8-R Cyrillic" ]; then
				iconv -c -f KOI8-R -t ${TARGET_ENCODING} "$FILE" | sed -e 's/'"`printf '\015'`"'$//' > tmp
				mv -f tmp "$FILE"
			fi
		fi
		if [ "${IS_CP866}" = 0 ]; then
			CODEPAGE=`enca $FILE | grep "IBM/MS code page 866"`
			echo $CODEPAGE
			if [ "${CODEPAGE}" = "IBM/MS code page 866" ]; then
				iconv -c -f CP866 -t ${TARGET_ENCODING} "$FILE" | sed -e 's/'"`printf '\015'`"'$//'  > tmp
				mv -f tmp "$FILE"
			fi
		fi
		if [ "${IS_UTF_16LE}" = 0 ]; then
			CODEPAGE=`enca $FILE | grep "Universal character set 2 bytes; UCS-2; BMP"`
			echo $CODEPAGE
			if [ "${CODEPAGE}" = "Universal character set 2 bytes; UCS-2; BMP" ]; then
				iconv -c -f UTF-16LE -t ${TARGET_ENCODING} "$FILE" | sed -e 's/'"`printf '\015'`"'$//'  > tmp
				mv -f tmp "$FILE"
			fi
		fi
	done
fi
IFS=$SAVEIFS

Внимание! При перекодировке возможна потеря некоторых символов! Делать бэкап!
Великолепная enca работает лучше встроенных распознавателей многих редакторов!

 

Рубрика: 

Comments

Add new comment

CAPTCHA
Ответьте на простой вопрос, посмотрим, нужны ли нам ваши комментарии…
Image CAPTCHA
Enter the characters shown in the image.