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.

130 lines
4.6 KiB

9 years ago
---
title: UTF8 локаль в ArchLinux
tags: archlinux, unicode
---
Дизель выложил в свое время замечательную [ссылочку](http://linuxdv.org/forum/viewtopic.php?id=105) на форуме по поднятию 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](http://pupykins.googlepages.com/mc.html)
Автор mc-cru и автор порта в community - суть один человек, имя ему Сергей Пупыкин (надеюсь правильно написал фамилию) в том виде в котором идет mc-cru очень нелицеприятный. Что бы привести его в чувство, смержил utf8 патч с той версии что в репозитарии, плюс сделал пееркодировку в редакторе (но тут кроется бага... страшная, которую пока лень решать, при перекодировке в редакторе не работает поиск и замена).