screen +CP866

Тем, кто пытается работать с серверами семейства windows по ssh протоколу посвящается...

Благодаря природной лени не могу похвастать авторством, проблему решили до меня здесь http://osdir.com/ml/gnu.screen/2003-09/msg00080.html

Основная проблема в том, что в отличие от luit, исходники screen не содержат кодировочных таблиц CP866. Для генерации таблицы нам любехно предоставили следующий скрипт:


#!/usr/bin/tclsh
#
# We need tcl >= 8.3
#
package require Tcl 8.3
#
# usage makeenc encoding-name screen-font-no
# screen-font-id must be valid C-style integer i.e. start hexadecimal
# value with 0x and octal with 0
# for example makeenc KOI8-R 0xa1.
#
set encoding_name [lindex $argv 0]
set font_no [expr [lindex $argv 1]+0]
regsub "cp-" [string tolower $encoding_name] "cp" tclenc
if {[string length $encoding_name]%2 ==0} {
append encoding_name "\0"
}
set filename [format %02x $font_no]
set f [open $filename w]
fconfigure $f -encoding binary
puts -nonewline $f "ScreenI2UTF8\0[format %c $font_no]\0\200$encoding_name\0"

for {set i 0x80} {$i<0x100} {incr i} {
set ucode [scan [encoding convertfrom $tclenc [format %c $i]] %c]
puts -nonewline $f [binary format "SS" $i $ucode]
}
puts -nonewline $f "\n"

Судя по коментам его необходимо записать в файлик makeenc, далее chmod a+x makeenc
Выполнять сей скрипт можно без рутовых прав:

wi@mylin$./makeenc CP866 0xbd

Собсно первый параметр указывает на кодировку, второй - идентификатор таблицы в терминах исходников screen. в каталоге появится файлик bd с необходимой таблицей.
Далее нам потребуется распаковать сурс

# ebuild /usr/portage/app-misc/screen/screen-4.0.3.ebuild unpack

Далее следует скопировать bg в каталог /var/tmp/portage/app-misc/screen-4.0.3/work/screen-4.0.3/utf8encodings
Для подключения таблицы CP866 необходимо подредактировать файл
/var/tmp/portage/app-misc/screen-4.0.3/work/screen-4.0.3/encoding.c

Ищем в файле struct encoding encodings[] = ... и добавляем в конец нашу таблицу кодировки через запятую следующим образом:


struct encoding encodings[] = {
  { "C",		0,		0,		0, 0, 0 },
  { "eucJP",		"B\002I\00401",	0,		1, 0, "\002\004I" },
  { "SJIS",		"BIBB01",	0,		1, 1, "\002I" },
  { "eucKR",		"B\003BB01",	0,		1, 0, "\003" },
  { "eucCN",		"B\001BB01",	0,		1, 0, "\001" },
  { "Big5",		"B\030BB01",	0,		1, 0, "\030" },
  { "KOI8-R",		0,		0x80|'!',	0, 1, 0 },
  { "CP1251",		0,		0x80|'?',	0, 1, 0 },
  { "UTF-8",		0,		-1,		0, 0, 0 },
  { "ISO8859-2",	0,		0x80|'B',	0, 0, 0 },
  { "ISO8859-3",	0,		0x80|'C',	0, 0, 0 },
  { "ISO8859-4",	0,		0x80|'D',	0, 0, 0 },
  { "ISO8859-5",	0,		0x80|'L',	0, 0, 0 },
  { "ISO8859-6",	0,		0x80|'G',	0, 0, 0 },
  { "ISO8859-7",	0,		0x80|'F',	0, 0, 0 },
  { "ISO8859-8",	0,		0x80|'H',	0, 0, 0 },
  { "ISO8859-9",	0,		0x80|'M',	0, 0, 0 },
  { "ISO8859-10",	0,		0x80|'V',	0, 0, 0 },
  { "ISO8859-15",	0,		0x80|'b',	0, 0, 0 },
  { "jis",		0,		0,		0, 0, "\002\004I" },
  { "GBK",		"B\031BB01",	0x80|'b',	1, 1, "\031" },

  { "CP866",            0,              0x80|'=',       0, 1, 0}

После этого продолжим сборку и установку screen

# ebuild /usr/portage/app-misc/screen/screen-4.0.3.ebuild compile test install qmerge

wi@mylin$ screen
ctrl+a+:
В появившемся приглашении пишем
encoding CP866 utf-8
Нажимаем enter

wi@mylin$ ssh winbox
wi@winbox's password:

Microsoft Windows [Версия 5.2.3790]
(С) Корпорация Майкрософт, 1985-2003.

C:\WINDOWS\system32>