Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
VPS/VDS серверы. 30 локаций на выбор

Серверы VPS/VDS с большим диском

Хорошие условия для реселлеров

4VPS.SU - VPS в 17-ти странах

2Gbit/s безлимит

Современное железо!

Бесплатный конструктор сайтов и Landing Page

Хостинг с DDoS защитой от 2.5$ + Бесплатный SSL и Домен

SSD VPS в Нидерландах под различные задачи от 2.6$

✅ Дешевый VPS-хостинг на AMD EPYC: 1vCore, 3GB DDR4, 15GB NVMe всего за €3,50!

🔥 Anti-DDoS защита 12 Тбит/с!

2. Русификация

Что нужно сделать, чтобы в текстовом режиме можно было читать и писать по-русски?

Для этого вы должны получить права суперпользователя (root), либо зарегистрировавшись в системе как root, либо выполнив команду su.

Для начала необходимо выполнить несколько подготовительных действий.

Переместитесь в директорию /etc и найдите там файл profile. Это файл, который выполняется при регистрации любого пользователя в системе. Загрузите любой редактор (мне, например, очень нравится joe) и добавьте в этот файл следующие строки:

      export LANG=ru_RU.KOI8-R
      export PAGER=less
      export LESSCHARSET=koi8-r

Переменная LANG говорит системе о региональных установках. Переменная PAGER определяет программу, которая будет показывать вам текст при вызове man (по умолчанию установлено more, но less более мощная программа, позволяющая использовать для перемещения по тексту стрелки, клавиши PgUp, PgDn, а также поиск образца в тексте и т.д). Переменная LESSCHARSET нужна программе less для корректного вывода русских букв в кодировке KOI-8.

Это еще не все. Найдите в этом же каталоге файл environment, и исправте его содержимое на:

    LANG=ru_RU.KOI8-R

Это делается для того, чтобы при работе с X Window русская локализация не потерялась.

Но и это еще не все. Перейдите в домашний каталог пользователя root (он так и называется /root), найдите там файл .bashrc и уберите оттуда строчку

    export LANG=C

Иначе потом, когда вы зайдете в систему пользовтелем root, вы будете долго удивляться почему не работает локализация. Дружно скажем спасибо за этот "подарок" maintainer'у пакета bash.

Поскольку в Debian 2.1 русской локали ru_RU.KOI8-R нет, то нам придется сделать ее самим:

     localedef -f KOI8-R -i ru_RU ru_RU.KOI8-R

Поскольку программа localedef написана кривовато, то нам придется за ней кое-что поправить.

Переместитесь в каталог /usr/share/locale и найдите там каталог ru_RU.koi8r. Переименуйте его в ru_RU.KOI8-R командой:

    mv ru_RU.koi8r ru_RU.KOI8-R

А вот теперь приступим собственно к русификации. Я предоставляю вам два способа. Какой из них считать идеологически правильным я не знаю. Выбирайте любой, который вам понравится, так как в конечном счете они делают одно и тоже.

Способ 1.

Вашему вниманию предлагается маленький сценарий, который должен быть помещен в /etc/init.d под именем russian и который является необходимой частью русификации текстового режима:

#--------------------------------------------------------------------------
#                                 russian
#--------------------------------------------------------------------------
# Set leds and META for terminals
for t in 1 2 3 4
do
   setleds -num /dev/null
done
# Load russian fonts
echo -e "                       \033[1;34;47m      Loading Russian Font      \033[36;40m"
setfont Cyr_a8x16 >/dev/null 2>/dev/null
# Load russian keys
echo -e "                       \033[1;37;44m      Loading Russian Keys      \033[36;40m"
loadkeys ru1.map >/dev/null 2>/dev/null
# Map screen
echo -e "                       \033[1;33;41m      Loading  Map  Screen      \033[36;40m"
mapscrn koi2alt > /dev/null 2>/dev/null
# Enable mapping on tty
for t in 1 2 3 4
do
   echo -e "\033(K" >/dev/tty$t
   echo -e "                    \033[0;30;42m  Enable mapping on \033[0;31;42m /dev/tty$t  \033[0;36;40m"
done
#-------------------------------end of file---------------------------------

Не могу не упомянуть ценное замечание Максима Лобашова. Оно заключается в том, что данный выше сценарий рассчитан на русификацию только первых четрых консолей. Однако обычно при установке дистрибутива устанавливается шесть консолей. И таким образом две оставшиеся русифицированы не будут. Однако это можно легко поправить - добавьте цифры в строке с for например так:

        for t in 1 2 3 4 5 6
и проблемы решаться.

После установки сценария вы должны сделать ссылки на этот файл из каталогов, содержащих сценарии, выполняемые при установке уровня запуска (run level) системы командой init. Это каталоги /etc/rc*.d. Многопользовательскому режиму работы системы соответствует каталог /etc/rc2.d. Когда вы переместитесь туда, то увидите, что в нем уже есть множество ссылок, каждая из которых имеет имя, начинающееся с буквы ``S'', за которой следует цифра. Ссылки указывают на исполняемые файлы в каталоге /etc/init.d. Вам нужно создать ссылку на /etc/init.d/russian, при этом для нашего случая нужно выбрать номер после ``S'', который бы был постарше. У меня например это 88 (файлы выполняются по старшинству - более малые номера выполняются раньше). Итак делаем ссылку, находясь в каталоге /etc/rc2.d:

         ln -sf /etc/init.d/russian S88russian

Чтобы этот сценарий выполнился вам нужно перегрузить машину, или перезапустить систему в многопользовательском режиме. Впрочем, как мне заметили можно обойтись и без этого: просто набрав

         /etc/init.d/russian

Однако в этом случае вы должны сделать это из shell'а (например из bash). Вы не должны находится в Midnight Commander'е или в терминале xterm в X Window. Кроме этого, после запуска данной выше программы вы должны разрегистрироваться в системе (команда exit в shell'е), чтобы при следующей регистрации (login) отработали файлы /etc/profile и .inputrc.

Перегрузить машину можно тремя способами:

  1. нажать клавиши Ctrl-Alt-Del (на некоторых машинах не работает)
  2. ввести команду reboot
  3. ввести команду shutdown -g0 и после сообщения "System halted" нажать reset (самый правильный способ).

Перезапустить систему в многопользовательском режиме можно введя команду

       init S

которая перегрузит систему в однопользовательский режим, и после выдачи сообщения

       Give root password for maintenance
       (or type Control-D for normal startup):

нужно нажать Ctrl-D, что приведет к загрузке системы в многопользовательском режиме.

После перезагрузки,до выдачи приглашения к регистрации в системе (login) вы должны увидеть изображение российского флага на каждом из цветов которого будет запись о загрузке определенного сервиса. Если этого не будет, то посмотрите внимательно все ли вы сделали как было указано выше. Если изображение появилось, то после регистрации в системе при нажатии на правый Alt вы сможете вводить русские буквы.

Способ 2. Однажды мне написал человек, который утверждал, что мой способ идеологически неправильный и я должен все переделать вот так, как рассказывает он. Мне немного не понравился тон его письма и я ответил ему, что тот способ, который я предлагаю вполне нормален и прекрасно все делает. На что он заметил, что рано или поздно этот способ устареет, а значит и мой FAQ. Последнее мне еще больше не понравилось и я предложил ему написать свой FAQ. Более ничего я об этом человеке не слышал. В связи с продажей машины я даже потерял его адрес. Однако его слова я запомнил и специально для тех, кто будет считать первый способ идеологически устаревшим (хотя здесь можно спорить долго) я прилагаю второй способ, воссозданный со слов (ибо его сценарий потерялся вместе с адресом):

Итак: вам понадобится сценарий следующего вида:

#!/bin/sh
# Set leds and META for terminals
for t in 1 2 3 4 5 6
do
   setleds -num /dev/null
done
if [ -r /etc/kbd/config ] ; then
    . /etc/kbd/config
fi
SETFONT="/usr/bin/setfont"
SETKEYS="/bin/loadkeys"
SETTRANS="/usr/bin/mapscrn"
VCSTIME="/usr/sbin/vcstime"
# start vcstime
if [ "${DO_VCSTIME}" = "yes" -a -x ${VCSTIME} ] ; then
    echo -n Starting clock on text console: `basename ${VCSTIME}`
    ${VCSTIME} &
    echo .
fi
echo -e "                       \033[1;34;47m      Loading Russian Font      \033[36;40m"
if [ x$CONSOLE_FONT != x -a -x ${SETFONT} ] ; then
    ${SETFONT} ${CONSOLE_FONT} 2>/dev/null
fi
echo -e "                       \033[1;37;44m      Loading Russian Keys      \033[36;40m"
if [ x$CONSOLE_MAP != x -a -x ${SETKEYS} ] ; then
    ${SETKEYS} ${CONSOLE_MAP} 2>/dev/null
fi
echo -e "                       \033[1;33;41m      Loading  Map  Screen      \033[36;40m"
if [ x$CONSOLE_TRANS != x -a -x ${SETTRANS} ] ; then
    ${SETTRANS} ${CONSOLE_TRANS} 2>/dev/null
fi
for t in 1 2 3 4 5 6
do
   echo -e "\033(K" >/dev/tty$t
   echo -e "                    \033[0;30;42m  Enable mapping on \033[0;31;42m /dev/tty$t  \033[0;36;40m"
done

Этот сценарий вам нужно записать под именем /etc/rc.boot/kbd поверх старого /etc/rc.boot/kbd.

Далее вам нужно исправить файл /etc/kbd/config, чтобы он выглядел так

CONSOLE_FONT=Cyr_a8x16
CONSOLE_MAP=ru1.map
CONSOLE_TRANS=koi2alt

Теперь вы можете либо перегрузить машину (теперь перезапуском многопотельзовательского режима вы не отделаетесь), либо опять-таки из shell'а просто ввести команду:

         /etc/rc.boot/kbd

и далее разрегистрироваться (командой exit) и зарегистрироваться снова (login).

Как сделать так, чтобы в моем mc (Midnight Commander) были видны русские буквы и чтобы я мог их там набирать, а то лезет всякая ерунда?

Сначала нужно включить работу с восемью битами. Для этого нажмите F9 затем выберите Option, далее Display bits и наконец Full 8 bit. Там же проставьте Full 8 bit input. Не забудьте потом сохранить эту конфигурацию. Это все.

Замечу однако, что для просмотра файлов с русским текстом, имеющих в качестве расширения цифры или ``.man'' этого мало. Вместо русского текста в таких случаях вы можете увидеть мусор. Это связано с тем, что такие файлы трактуются mc как файлы, содержащие гипертекст, на языке groff. Для просмотра таких файлов mc вызывает форматер текста с этого языка: nroff, с параметром -Tascii. Наша с вами беда состоит в том, что в этом ascii русских букв нет. Нужно сделать следующее. Переместиться в каталог /etc/mc и в файле mc.ext с помощью редактора заменить все строки -Tascii на -Tlatin1.

Как получить возможность вводить и читать русские буквы в X Window?

Ну что же, можно сказать дождались. Ура. Наконец-то, теперь можно настроить Xkb, благодаря тому, что сервера X Window, входящие в комплект Debian 2.1 поддерживают русскую локализацию.

Однако, необходимо заметить, что до сих пор, многие приложения не умеют работать с русскими буквами, введенными посредством Xkb с правильной раскладкой клавиатуры. С другой стороны, некоторые приложения отказываются работать с русскими буквами, введенными посредством Xmodmap без участия Xkb. Ситуация довольно не простая, но к счастью, при использовании Xkb возможен обходной маневр, о чем будет рассказано ниже.

Тем, кто не хочет настраивать Xkb и предпочитает работать старым способом, рекомендую обратится к FAQ для Debian версии 2.0 и посмотреть настройку через Xmodmap.

Далее рассказывается о настройке Xkb.

Внимание! Xkb не будет работать, если вы не сделали локализацию текстового режима, как описано выше.

Когда будете пользоваться программой XF86Setup, вам предложат установить русскую клавиатуру. Сделайте это и не забудьте выбрать способ переключения по вашему вкусу.

Перед первым запуском вы должны убедиться, что вы установили русские шрифты (пакет xfntcyr), а также устанвили и настроили какой-нибудь менеджер окон (например fvwm). Кроме того нужно внести правки в файл /etc/X11/XF86Config. Убедитесь, что один из FontPath указывает на каталог с русскими шрифтами (обычно это /usr/X11R6/lib/X11/fonts/cyrillic).

Теперь можно запускать X Window вашим любимым способом. Чтобы проверить, что получилось запустите Xterm или Rxvt с параметром -fn <полное_имя_русского_шрифта> (В полном имени не должно быть никаких ``*'', все должно быть задано. См. файл font.dir в каталоге /usr/X11R6/lib/X11/fonts/cyrillic). После того как окно появится, введите для пробы несколько английских букв, а затем переключитесь на русские буквы (тем способом, который вы выбрали в программе XF86Setup) и вводите русские буквы. Если ничего не вводится значит вы что-то не доделали, проверьте. Если вместо русских букв выводятся греческие значит вы задали неправильный шрифт для терминала в параметре -fn.

Последнее, что остается сделать - это решить проблему с теми "нехорошими" программами, которые отказываются понимать русские буквы, введенные через Xkb.

Об опыте настройки Xkb и затачивании некоторых программ под работу с Xkb можно почитать на страничке Алексея Выскубова.

Здесь можно почитать статью О настройке локализации и Xkb от IPLabs Linux Team.

Сам я пользуюсь методом, предложенным IPLabs Linux Team. Он заключается в замене русской раскладки клавиатуры, идущей в дистрибутиве на раскладку ruhackms. В этой раскладке Xkb подсовываются русские буквы под видом английских. Установить эту раскладку можно так:

  1. Файл ruhackms кладем в каталог /usr/lib/X11/xkb/symbols
  2. В файле /etc/X11/XF86Config в секции Keyboard убираем строку, которая начинается со слова XkbLayout и на ее место пишем строку:
        XkbLayout "ruhackms"

Следует заметить, что раскладка ruhackms несовсем корректно работает с клавиатурами в 104 и более клавиш. При наличии такой клавиатуры вместо символа "/" всегда ".", а также есть проблем со вводом цифр, которые заменяются на символы знаков препинания. Однако, я совершенно случайно обнаружил, что все приходит в норму, если вызвать команду setxkbmap без параметров. Если у вас возникает вышеописанная проблема, то настройте ваш оконный менеджер так, чтобы при старте он вызывал эту команду.

Как заставить писать по русски мой любимый редактор joe?

Что сказать вам хорошего? Все было хорошо в Debian'е 1.3, когда там был joe собранный с termcap'ом. Но вот появился Debian 2.0 и в нем joe собран с terminfo, а значит на местный termcap в /etc/joe сам joe не обращает внимание и как следствие этого переопределить клавиши в joerc так как хочется невозможно (по крайней мере у меня не получилось).

По этому все что мне остается сделать - это предоставить вам файл joerc, в котором включена возможность ввода русских букв и переведена на русский язык вся помощь.

Захотел прочитать текстовый файл на русском языке, который я сделал в DOS'е, а там русских букв нет, вместо них почему-то псевдографика. Каким образом можно прочитать текстовые файлы из DOS'а?

В операционной системе DOS используется альтернативная кодировка русских букв. В UNIX'ах и в Linux используется кодировка KOI-8. Для того чтобы работать с тестовыми файлами на русском языке в Linux можно либо настроить Linux так, чтобы он работал в альтернативной кодировке как DOS, а можно перекодировать файл из альтернативной кодировки в KOI-8.

Первый способ я рассматривать не буду, поскольку обычно так не принято в кругу людей, работающих в UNIX'ах - это дурной тон, хотя возможно кое-кто со мной и не согласится.

Что касается второго способа, то предлагаю вашему вниманию два перекодировщика, написанные на shell'е с использованием стандартных команд системы. Автор этих перекодировщиков мне не известен

файл altkoi8

#!/bin/sh
# -----------------------------------------------------------------
#  altkoi8 - перекодировщик из альтернативной кодировки в KOI-8
# -----------------------------------------------------------------
tr \
'\240''\241''\242''\243''\244''\245''\246''\247''\250'\
'\251''\252''\253''\254''\255''\256''\257''\340''\341'\
'\342''\343''\344''\345''\346''\347''\350''\351''\352'\
'\353''\354''\355''\356''\357''\200''\201''\202''\203'\
'\204''\205''\206''\207''\210''\211''\212''\213''\214'\
'\215''\216''\217''\220''\221''\222''\223''\224''\225'\
'\226''\227''\230''\231''\232''\233''\234''\235''\236''\237''\304' \
'\301''\302''\327''\307''\304''\305''\326''\332''\311'\
'\312''\313''\314''\315''\316''\317''\320''\322''\323'\
'\324''\325''\306''\310''\303''\336''\333''\335''\337'\
'\331''\330''\334''\300''\321''\341''\342''\367''\347'\
'\344''\345''\366''\372''\351''\352''\353''\354''\355'\
'\356''\357''\360''\362''\363''\364''\365''\346''\350'\
'\343''\376''\373''\375''\377''\371''\370''\374''\340''\361''_'  |
tr -d '\r' #вот эта фигня предназначена исключительно для того,
           #чтобы полностью подогнать формат доса к unix - это
           #аналог флага -t в команде mcopy,mwrite,mread.

файл koi8alt

#!/bin/sh
# -----------------------------------------------------------------
#  koi8alt - перекодировщик из KOI-8 в альтенативную кодировку
# -----------------------------------------------------------------
tr \
'\301''\302''\327''\307''\304''\305''\326''\332''\311''\312''\313'\
'\314''\315''\316''\317''\320''\322''\323''\324''\325''\306''\310'\
'\303''\336''\333''\335''\337''\331''\330''\334''\300''\321''\341'\
'\342''\367''\347''\344''\345''\366''\372''\351''\352''\353''\354'\
'\355''\356''\357''\360''\362''\363''\364''\365''\346''\350''\343'\
'\376''\373''\375''\377''\371''\370''\374''\340''\361'  \
'\240''\241''\242''\243''\244''\245''\246''\247''\250''\251''\252'\
'\253''\254''\255''\256''\257''\340''\341''\342''\343''\344''\345'\
'\346''\347''\350''\351''\352''\353''\354''\355''\356''\357''\200'\
'\201''\202''\203''\204''\205''\206''\207''\210''\211''\212''\213'\
'\214''\215''\216''\217''\220''\221''\222''\223''\224''\225''\226'\
'\227''\230''\231''\232''\233''\234''\235''\236''\237'  |
sed -e s/$/
/ #подстановка cr в конец строки для глупого позорного
               #msdos - сильно замедляет работу программы, но ничего
               #другого с ходу не придумал. осторожнее с символом
               #
 - нет у меня толкового описания sed - приходится так.
               #еще раз - у меня red показывает курсор со звездой внутри и
               #букву M

Сразу оговорюсь. В настоящее время имеются 2 или 3 "стандарта" KOI-8. Расположение русских букв в них совпадает, но отличается расположение символов псевдографики. Так что если у вас при перекодировке возникнут проблемы с псевдографикой, то...

Видя живой интерес начинающих к перекодировщикам я помещаю здесь еще два: из Win1251 в Koi8-r и обратно, написанных мной по мотивам двух предыдущих

файл winkoi8

#!/bin/sh
# -----------------------------------------------------------------------
# Перекодировщик из cp1251 в koi8. Copyright(c) Victor G.Vislobokov 1999
# -----------------------------------------------------------------------
tr \
'\300''\301''\302''\303''\304''\305''\306''\307''\310''\311''\312''\313'\
'\314''\315''\316''\317''\320''\321''\322''\323''\324''\325''\326''\327'\
'\330''\331''\332''\333''\334''\335''\336''\337''\340''\341''\342''\343'\
'\344''\345''\346''\347''\350''\351''\352''\353''\354''\355''\356''\357'\
'\360''\361''\362''\363''\364''\365''\366''\367''\370''\371''\372''\373'\
'\374''\375''\376''\377' \
'\341''\342'\
'\367''\347''\344''\345''\366''\372''\351''\352''\353''\354''\355''\356'\
'\357''\360''\362''\363''\364''\365''\346''\350''\343''\376''\373''\375'\
'\377''\371''\370''\374''\340''\361''\301''\302''\327''\307''\304''\305'\
'\326''\332''\311''\312''\313''\314''\315''\316''\317''\320''\322''\323'\
'\324''\325''\306''\310''\303''\336''\333''\335''\337''\331''\330''\334'\
'\300''\321' |
tr -d '\r'

файл koi8win

#!/bin/sh
# -----------------------------------------------------------------------
# Перекодировщик из koi8 в cp1251. Copyright(c) Victor G.Vislobokov 1999
# -----------------------------------------------------------------------
tr \
'\341''\342'\
'\367''\347''\344''\345''\366''\372''\351''\352''\353''\354''\355''\356'\
'\357''\360''\362''\363''\364''\365''\346''\350''\343''\376''\373''\375'\
'\377''\371''\370''\374''\340''\361''\301''\302''\327''\307''\304''\305'\
'\326''\332''\311''\312''\313''\314''\315''\316''\317''\320''\322''\323'\
'\324''\325''\306''\310''\303''\336''\333''\335''\337''\331''\330''\334'\
'\300''\321' \
'\300''\301''\302''\303''\304''\305''\306''\307''\310''\311''\312''\313'\
'\314''\315''\316''\317''\320''\321''\322''\323''\324''\325''\326''\327'\
'\330''\331''\332''\333''\334''\335''\336''\337''\340''\341''\342''\343'\
'\344''\345''\346''\347''\350''\351''\352''\353''\354''\355''\356''\357'\
'\360''\361''\362''\363''\364''\365''\366''\367''\370''\371''\372''\373'\
'\374''\375''\376''\377' |
sed -e s/$/
/

Наконец, тем, кто хочет иметь быстрый и классный перекодировщик с поддержкой кучи различных кодировок, рекомендую скомпилировать его из файла на языке С, следующего содержания:

/**  recode.c  **/
#include
#include
#include
typedef unsigned char uchar;
uchar ai[] = {176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
              192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
              208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
              136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,
              152,153,154,129,156,157,158,159,160,161,162,163,164,165,166,167,
              168,169,170,171,172,173,174,175,240,241,242,243,244,245,246,247,
              224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
              130,132,135,134,128,133,131,155,248,249,250,251,252,253,254,255};
uchar ak[] = {225,226,247,231,228,229,246,250,233,234,235,236,237,238,239,240,
              242,243,244,245,230,232,227,254,251,253,255,249,248,252,224,241,
              193,194,215,199,196,197,214,218,201,202,203,204,205,206,207,208,
              136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,
              152,153,154,129,156,157,158,159,160,161,162,163,164,165,166,167,
              168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,
              210,211,212,213,198,200,195,222,219,221,223,217,216,220,192,209,
              130,132,135,134,128,133,131,155,184,185,186,187,188,189,190,191};
uchar aw[] = {192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
              208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
              224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
              136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,
              152,153,154,129,156,157,158,159,160,161,162,163,164,165,166,167,
              168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,
              240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,
              130,132,135,134,128,133,131,155,184,185,186,187,188,189,190,191};
uchar ia[] = {244,195,240,246,241,245,243,242,176,177,178,179,180,181,182,183,
              184,185,186,187,188,189,190,191,192,193,194,247,196,197,198,199,
              200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,
              128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
              144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
              160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
              224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
              216,217,218,219,220,221,222,223,248,249,250,251,252,253,254,255};
uchar ik[] = {128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
              144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
              160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
              225,226,247,231,228,229,246,250,233,234,235,236,237,238,239,240,
              242,243,244,245,230,232,227,254,251,253,255,249,248,252,224,241,
              193,194,215,199,196,197,214,218,201,202,203,204,205,206,207,208,
              210,211,212,213,198,200,195,222,219,221,223,217,216,220,192,209,
              176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191};
uchar iw[] = {128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
              144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
              160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
              192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
              208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
              224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
              240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,
              176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191};
uchar ka[] = {244,195,240,246,241,245,243,242,176,177,178,179,180,181,182,183,
              184,185,186,187,188,189,190,191,192,193,194,247,196,197,198,199,
              200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,
              216,217,218,219,220,221,222,223,248,249,250,251,252,253,254,255,
              238,160,161,230,164,165,228,163,229,168,169,170,171,172,173,174,
              175,239,224,225,226,227,166,162,236,235,167,232,237,233,231,234,
              158,128,129,150,132,133,148,131,149,136,137,138,139,140,141,142,
              143,159,144,145,146,147,134,130,156,155,135,152,157,153,151,154};
uchar ki[] = {128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
              144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
              160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
              240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,
              238,208,209,230,212,213,228,211,229,216,217,218,219,220,221,222,
              223,239,224,225,226,227,214,210,236,235,215,232,237,233,231,234,
              206,176,177,198,180,181,196,179,197,184,185,186,187,188,189,190,
              191,207,192,193,194,195,182,178,204,203,183,200,205,201,199,202};
uchar kw[] = {128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
              144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
              160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
              176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
              254,224,225,246,228,229,244,227,245,232,233,234,235,236,237,238,
              239,255,240,241,242,243,230,226,252,251,231,248,253,249,247,250,
              222,192,193,214,196,197,212,195,213,200,201,202,203,204,205,206,
              207,223,208,209,210,211,198,194,220,219,199,216,221,217,215,218};
uchar wa[] = {244,195,240,246,241,245,243,242,176,177,178,179,180,181,182,183,
              184,185,186,187,188,189,190,191,192,193,194,247,196,197,198,199,
              200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,
              216,217,218,219,220,221,222,223,248,249,250,251,252,253,254,255,
              128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
              144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
              160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
              224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239};
uchar wi[] = {128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
              144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
              160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
              240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,
              176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
              192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
              208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
              224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239};
uchar wk[] = {128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
              144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
              160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
              176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
              225,226,247,231,228,229,246,250,233,234,235,236,237,238,239,240,
              242,243,244,245,230,232,227,254,251,253,255,249,248,252,224,241,
              193,194,215,199,196,197,214,218,201,202,203,204,205,206,207,208,
              210,211,212,213,198,200,195,222,219,221,223,217,216,220,192,209};
/**********************************************************/
main(argc, argv)
char **argv;
int argc;
{
FILE *in, *out;
struct stat buf;
uchar *table, c;
char temp[1024];
int i;
if(argc < 2 || argc > 4)
   usage(argv[0]);
if(!strcmp(argv[1], "-ai"))
   table = ai;
else if(!strcmp(argv[1], "-ak"))
   table = ak;
else if(!strcmp(argv[1], "-aw"))
   table = aw;
else if(!strcmp(argv[1], "-ia"))
   table = ia;
else if(!strcmp(argv[1], "-ik"))
   table = ik;
else if(!strcmp(argv[1], "-iw"))
   table = iw;
else if(!strcmp(argv[1], "-ka"))
   table = ka;
else if(!strcmp(argv[1], "-ki"))
   table = ki;
else if(!strcmp(argv[1], "-kw"))
   table = kw;
else if(!strcmp(argv[1], "-wa"))
   table = wa;
else if(!strcmp(argv[1], "-wi"))
   table = wi;
else if(!strcmp(argv[1], "-wk"))
   table = wk;
else
   usage(argv[0]);
in = 0;
out = 0;
if(argc == 2 || (argc == 3 && !strcmp(argv[2], "-")))
   {
   in = stdin;
   out = stdout;
   }
else if(argc == 4)
   {
   if(!strcmp(argv[2], "-"))
      in = stdin;
   if(!strcmp(argv[3], "-"))
      out = stdout;
   }
if(argc > 2)
   {
   if(!in)
      {
      if(stat(argv[2], &buf) < 0)
         {
         printf("%s: cannot open input file '%s'.\n", argv[0], argv[2]);
         exit(1);
         }
      in = fopen(argv[2], "r");
      if(!in)
         {
         printf("%s: cannot open input file '%s'.\n", argv[0], argv[2]);
         exit(1);
         }
      }
   if(!out)
      {
      if(argc == 3)
         sprintf(temp, "%s.%d", argv[0], getpid());
      else
         strcpy(temp, argv[3]);
      out = fopen(temp, "w");
      if(!out)
         {
         printf("%s: cannot open %s file '%s'.\n", argv[0],
                ((argc == 3) ? "temporary" : "output"), temp);
         fclose(in);
         exit(1);
         }
      }
   }
if(!in)
   {
   printf("%s: cannot open standard input.\n", argv[0]);
   exit(1);
   }
if(!out)
   {
   printf("%s: cannot open standard output.\n", argv[0]);
   fclose(in);
   exit(1);
   }
while((i = getc(in)) != -1)
   {
   i &= 0377;
   if(i & 0200)
      i = table[i & 0177];
   putc(i, out);
   }
fclose(in);
fclose(out);
if(argc == 3 && strcmp(argv[2], "-"))
   {
   unlink(argv[2]);
   link(temp, argv[2]);
   unlink(temp);
   }
}
/**********************************************************/
usage(name)
char *name;
{
fprintf(stderr, "Usage: %s -{ai|ak|aw|ia|ik|iw|ka|ki|kw|wa|wi|wk} ", name);
fprintf(stderr, "[input_file [output_file]]\n       Parameters are:\n");
fprintf(stderr, "       -ai         - from Alternative to ISO,\n");
fprintf(stderr, "       -ak         - from Alternative to Koi8,\n");
fprintf(stderr, "       -aw         - from Alternative to Windows,\n");
fprintf(stderr, "       -ia         - from ISO to Alternative,\n");
fprintf(stderr, "       -ik         - from ISO to Koi8,\n");
fprintf(stderr, "       -iw         - from ISO to Windows,\n");
fprintf(stderr, "       -ka         - from Koi8 to Alternative,\n");
fprintf(stderr, "       -ki         - from Koi8 to ISO,\n");
fprintf(stderr, "       -kw         - from Koi8 to Windows,\n");
fprintf(stderr, "       -wa         - from Windows to Alternative,\n");
fprintf(stderr, "       -wi         - from Windows to ISO;\n");
fprintf(stderr, "       -wk         - from Windows to Koi8;\n");
fprintf(stderr, "       input_file  - name of input file, ");
fprintf(stderr, "may be \"-\" as standard input;\n");
fprintf(stderr, "       output_file - name of output file, ");
fprintf(stderr, "may be \"-\" as standard output.\n");
exit(1);
}

Этот файл прислал мне Сергей Сивков, при этом он сказал мне, что автор неизвестен.

Компилировать нужно так:

    gcc -o recode recode.c

или

    make recode.c

и пользоваться полученным файлом. У вас может уже стоять GNU recode, так что лучше переименовать одну из этих программ, или запускать как

    /some/path/to/recode

Почему у меня программа для работы с электронной почтой elm говорит Unknown charset, когда я пишу письма на русском языке? Как с этим бороться?

Дело опять таки в русификации.

Известный мне способ это победить таков:

  1. в домашнем каталоге создается каталог .elm
  2. в этом каталоге создается файл elmrc
  3. в этот файл прописывается строчка
             CHARSET=koi8-r

Как заставить Netscape Navigator показывать русские буквы в кодировках KOI-8 и CP1251?

Этот вопрос неизменно занимает сегодня умы многих начинающих. Несмотря на некоторое количество достаточно древних решений этот вопрос поднимается снова и снова. Ответ на него таков: на данный момент русифицировать Netscape Navigator корректно невозможно. Однако есть несколько хитрых приемов, которые хотя и не являются 100% корректными, но тем не менее позволяют вам добиться тех целей, которые ставит перед нами данный выше вопрос. Что же касается корректной русификации, то будем надеяться, что в скором времени она появится благодаря тому, что Netscape начинает распространять свои исходники бесплатно. Однако владельцам старых версий все равно придется жить по старому.

Хочу заметить, что здесь рассказывается о русификации именно старых версий. Современные версии Netscape Communicator уже не требуют установки специальных шрифтов в кодировке Windows 1251, а также прекрасно понимают как KOI8-R, так и cp1251 и работают через Xkb.

Начнем с кодировки KOI-8. Здесь особых проблем быть не должно. В дистрибутив входят кирилистрические (русские) шрифты для X Window, которые вам нужно установить перед тем как мы продолжим. Пакет с этими шрифтами называется в Debian 2.0 xfntcyr_3.3.2.2-4.deb и находится в секции x11. Естественно, что версия пакета может отличаться от приведенной мной.

Итак, установите данный пакет командой

        dpkg -i xfntcyr_3.3.2.2-4.deb

После чего поправьте файл /etc/X11/XF86Config. В этом файле вам нужно найти слова Section "Files" и в этой секции добавить строчку вида

        FontPath  "/usr/X11R6/lib/X11/fonts/cyrillic"

Это нужно, чтобы X Windows "увидела" ваши свежеустановленные шрифты. Затем, вам нужно перезапустить X Windows если вы уже находитесь там и запустить X Windows, в противном случае. Это нужно для того, чтобы X Windows при запуске перечитала файл конфигурации /etc/X11/XF86Config куда вы внесли изменения.

Теперь, когда запуск X Windows произошел, вы можете запустить Netscape Navigator. Зайдите в меню Options, затем General Preferences и наконец в Fonts. Выберите среди доступных кодировок Cyrillic(koi8-r), а затем установите для ее отображения какие-нибудь cronyx шрифты: рекомендую Helvetica и Courier.

Далее выйдите из меню настроек и зайдите в Options в подменю Document Encoding. В этом подменю выберите Cyrillic(KOI8-R). Теперь Netscape Navigator должен показывать вам русские буквы на страничках в кодировке KOI-8. Но здесь есть некоторые замечания, о которых читайте ниже.

С кодировкой CP1251 будет посложнее. Во-первых, в дистрибутивах шрифты для X Windows в этой кодировке просто отсутствуют и вам их потребуется где-то достать. Правда для вас я подготовил Debian'овский пакет с этими шрифтам и вы можете его взять прямо отсюда, если нажмете на xfnt1251_1.1-1.deb.

Если по какой-то причине вам не понравятся эти шрифты или этот пакет, то ищите их в Internet'е.

Далее вы проделываете те же манипуляции с установкой пакета, правкой файла /etc/X11/XF86Config и перезапуском (или запуском) X Windows как и для случая с кодировкой KOI-8. Так же как и в случае с KOI-8 вы должны затем запустить Netscape Navigator, зайдите в меню Options, затем General Preferences и наконец в Fonts. Но вот здесь начинаются различия. Среди доступных кодировок вам нужно выбрать User defined, так как создатели Netscape Navigator не предусмотрели в меню наличия кодировки CP1251. Для кодировки User defined (при условии установки пакета xfnt1251_1.1-1.deb) выберите какие-либо iccm шрифты.

Далее выйдите из меню настроек и зайдите в Options в подменю Document Encoding. В этом подменю выберите User defined. Теперь Netscape Navigator должен показывать вам русские буквы на страничках в кодировке CP1251. Но здесь есть некоторые замечания, о которых читайте ниже.

Финальной частью установки шрифтов как для KOI-8 так и для CP1251 является сохранение опций: зайдите в меню Options и выберите Save Options. Если вы этого не сделаете, то при следующем запуске Netscape Navigator вам придется задавать шрифты для кодировок и Document Encoding заново.

ЗАМЕЧАНИЯ.

  1. Для переключения между кодировками нужно зайти в Options и подменю Document Encoding и выбрать Cyrillic (KOI8-R) для кодировки KOI-8 и User defined для кодировки CP1251.
  2. Не удивляйтесь, если на страничке в тэгах FORM языка HTML (таких как Button, TextArea и т.д.) вы не увидите русских букв). Виноват Netscape, но поделать тут вряд ли что-то можно (хотя и здесь есть свои лазейки).
  3. В Netscape Navigator версий 3.x были проблемы с Java при включении кодировки KOI-8 (и вообще любой отличной от кодировки по умолчанию).
  4. Есть чудаки, которые жестко прописывают charset в тегах html. В том случае, если charset был установлен в cp1251, вы не сможете посмотреть эту страничку, несмотря на установленные шрифты в кодировке 1251, поскольку Netscape автоматически будет переключаться на cp1251, а не на User Defined.
  5. Данные способы русификации были опробованы на версиях 3.00-4.04, за остальные я не ручаюсь.

Назад | Содержание | Вперед

 

VPS в России, Европе и США

Бесплатная поддержка и администрирование

Оплата российскими и международными картами

🔥 VPS до 5.7 ГГц под любые задачи с AntiDDoS в 7 локациях

💸 Гифткод CITFORUM (250р на баланс) и попробуйте уже сейчас!

🛒 Скидка 15% на первый платеж (в течение 24ч)

Скидка до 20% на услуги дата-центра. Аренда серверной стойки. Colocation от 1U!

Миграция в облако #SotelCloud. Виртуальный сервер в облаке. Выбрать конфигурацию на сайте!

Виртуальная АТС для вашего бизнеса. Приветственные бонусы для новых клиентов!

Виртуальные VPS серверы в РФ и ЕС

Dedicated серверы в РФ и ЕС

По промокоду CITFORUM скидка 30% на заказ VPS\VDS

Новости мира IT:

Архив новостей

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 7861149
Пресс-релизы — pr@citforum.ru
Обратная связь
Информация для авторов
Rambler's Top100 TopList This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2019 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...