You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

4.6 KiB

title tags
UTF8 локаль в ArchLinux archlinux, unicode

Дизель выложил в свое время замечательную ссылочку на форуме по поднятию UTF8 локали в Arch Linux

Здесь я хочу что бы все желающие выдавали свои дополнения, оформенные в виде статьи.

Итак, положим начало...


Имена файлов

На старой koi8-r системе было довольно приличное количество файлов в русскими именами, естественно в кодировке koi8-r. Что делать, в UTF локали с такими именами файлов работать несподручно...

На решение проблемы навел запуск такой команды:

LANG=ru_RU.KOI8-R ls | iconv -f koi8-r

Эта команда вывела список имен файлов с русскими именами как и положено, русскими буковками. Так родился скрипт:

#!/bin/bash

#
# Recode all file names in given codepage to UTF8
# on UTF8 system
#

CODE_FROM="KOI8-R"
recursive=0
scan_only=0

function parse_cmd_line()
{
    prev_arg=""
    need_next=0
    for i in "$@"
    do
	if [ $need_next -eq 0 ]; then
	    case $i in
	    "-f")
		prev_arg="-f"
    		need_next=1
	    ;;
	    "-r")
		recursive=1
	    ;;
	    "-s")
		scan_only=1
	    ;;
	    esac
	else
	    case $prev_arg in
	    "-f")
		CODE_FROM=`echo $i | tr '[:lower:]' '[:upper:]'`
	    ;;
	    esac
	    prev_arg=""
	    need_next=0
	fi
    done
}

function recode_file()
{

    old_name="$@"
    new_name=`echo $@ | iconv -f $CODE_FROM`
    stat1=$?
    mid_name=`echo $@ | iconv -f UTF8 2>/dev/null`
    stat2=$?

    if [ x"$old_name" != x"$new_name" -a $stat1 -eq 0 -a x"$mid_name" != x"$old_name" ]; then
	if [ $scan_only -eq 0 ]; then
	    echo "Recode: $old_name -> $new_name"
	    mv "$old_name" "$new_name"
	else
	    echo `pwd`"$@"
	fi
    fi
}

parse_cmd_line $@

oldIFS=$IFS
IFS=$'\n'
files=`ls -1 --color=none`
for i in $files
do
    if [ -d "$i" ]; then
	if [ $recursive -eq 1 ]; then
	    name=`basename $0`
	    if [ `dirname $0` == "." ]; then
		prefix=`pwd`
	    else
		prefix=`dirname $0`
	    fi
	    cd "$i"

	    $prefix/$name "$@"
	    
	    cd ..
	fi
    fi

    recode_file "$i"
done

Запускам сей скрипт из директории содержимое которой нужно привести к виду UTF8:

recodedir

Скрипт понимает ключи:

  • -r говорит что перебрать все каталоги рекурсивно, начиная с текущего
  • -s просканирует каталоги и выдаст список файлов которые нужно изменять
  • -f <кодировка> задает кодировку из которой перекодировать, по умолчанию KOI8-R

Кроме того, можно использовать готовую утилиту "convmv" из репозитория "extra". Умеет она намного больше, чем вышеописанный скрипт, но требует установленный perl в системе.

Midnight Commander

Есть два вариант, mc-utf8 из репозитария community либо вот этот образец: http://pupykins.googlepages.com/mc.html

Автор mc-cru и автор порта в community - суть один человек, имя ему Сергей Пупыкин (надеюсь правильно написал фамилию) в том виде в котором идет mc-cru очень нелицеприятный. Что бы привести его в чувство, смержил utf8 патч с той версии что в репозитарии, плюс сделал пееркодировку в редакторе (но тут кроется бага... страшная, которую пока лень решать, при перекодировке в редакторе не работает поиск и замена).