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
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 патч с той версии что в репозитарии, плюс сделал пееркодировку в редакторе (но тут кроется бага... страшная, которую пока лень решать, при перекодировке в редакторе не работает поиск и замена).
|