LINUX.ORG.RU
ФорумTalks

Конвертор из текста, набранного при неправильной раскладке в русский


0

0

---ruslatconv.c---
#include <stdio.h>
char            lmatrix[] =
    { 'ф', 'и', 'с', 'в', 'у', 'а', 'п', 'р', 'ш', 'о', 'л', 'д', 'ь', 'т',
    'щ', 'з', 'й', 'к', 'ы', 'е', 'г', 'м', 'ц', 'ч', 'н', 'я'
};
int             lmatrix2i[] = { 39, 44, 46, 59, 91, 93, 96 };
int             lmatrix3i[] = { 123, 125, 58, 34, 60, 62, 126 };
char            lmatrix2c[] = { 'э', 'б', 'ю', 'ж', 'х', 'ъ', 'ё' };
main()
{
    int             i,
                    c,
                    o;
    while ((c = getchar()) != EOF) {
        if (c > 64 && c < 91)
            c += 32;
        if (c > 96 && c < 123) {
            putchar(lmatrix[c - 97]);
            continue;
        } else {
            o = 0;
            for (i = 0; i < 7; i++)
                if (lmatrix2i[i] == c || lmatrix3i[i] == c) {
                    putchar(lmatrix2c[i]);
                    o = 1;
                    break;
                }
            if (o)
                continue;
        }
        putchar(c);
    }
}
---
читает со стандартного ввода и пишет результат на стандартный вывод. Enjoy!
★★★★★
Ответ на: комментарий от A2K

>что-то не так с кодировкой? у меня UTF8.

У тебя UTF8

ttnl ★★★★★
()

tr "QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>qwertyuiop[]asdfghjkl;'zxcvbnm,." $(echo ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮйцукенгшщзхъфывапролджэячсмитьбю | iconv -t koi8r) | iconv -f koi8r

Фактически, то же самое, только для UTF-8. Для однобайтовой кодировки тоже сойдет, хотя там можно без iconv'ов.

anonymous
()

Студент детектед!

anonymous
()
Ответ на: комментарий от proDOOMman

> Юзай xneur

Анекдоты на си из него уже вычистили?

anonymous
()

---
#!/usr/bin/perl -w

binmode(STDIN,  ":utf8");
binmode(STDOUT, ":utf8");

%chars = (
	eng => "`~@#\$^&|/?F<DULT:PBQRKVYJGHCNEA{WXIO}SM\">Zf,dult;pbqrkvyjghcnea[wxio]sm'.z",

	rus => "\x{451}\x{401}\"\x{2116};:?/.,",
);
# cyrillic A - YA, a - ya
for ($i = 0x410; $i <= 0x44F; $chars{"rus"} = $chars{"rus"}.chr($i++)) {}
%qchars = (
	eng => quotemeta($chars{"eng"}),
	rus => quotemeta($chars{"rus"}),
);

$abc1 = "eng";	# current alphabet of input
$abc2 = "rus";	# opposite alphabet
$s = "";
until (eof()) {
	$qc = quotemeta($c = getc);
	$s = $s.$c;
	if ($chars{$abc2} =~ /$qc/) {
		if ($chars{$abc1} =~ /$qc/) {
			next;
		}
		$tmp  = $abc2;	
		$abc2 = $abc1;
		$abc1 = $tmp;
	}
	eval "\$s =~ tr/$qchars{$abc1}/$qchars{$abc2}/";
	print $s;
	$s = "";
}
eval "\$s =~ tr/$qchars{$abc1}/$qchars{$abc2}/";
print $s;
---
# капча fooing :)

anonymous
()

Да тебе звезду героя надо дать!

anonymousI
()
Ответ на: комментарий от bakagaijin

про tr незнал, спасибо. особенно удивило, что оно из coreutils.
про UTF8 когда постил забыл. у меня KOI8-R. а для UTF8 всё несколько усложняется 2-х байтностью кодировки...
согласен, что это велосипед, повторяющий часть функциональности tr, но может быть кому-нибудь и пригодится.
темболее, что реализовано оно с нуля.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от saahriktu

IMHO для начало следует научиться определять локаль и перекодировать в зависимости от неё - уже не tr, a как минимум tr+iconv :)

Evgueni ★★★★★
()
Ответ на: комментарий от anonymous

> Деда, вылазь из окопа, Берлин взяли давно уже!...

+1

Miguel ★★★★★
()
Ответ на: комментарий от Quasar

> Впрочем есть iconv + Emacs Lisp :)

Достаточно Emacs Lisp :)


;==========================
;;
;; rus<->lat перекодировка
;;
(require 'cl) 
(defvar usr:*en/ru-table*  '((?q . ?й) (?w . ?ц) (?e . ?у) (?r . ?к)
                            (?t . ?е) (?y . ?н) (?u . ?г) (?i . ?ш)
                            (?o . ?щ) (?p . ?з) (?\[ . ?х) (?\] . ?ъ)
                            (?a . ?ф) (?s . ?ы) (?d . ?в) (?f . ?а)
                            (?g . ?п) (?h . ?р) (?j . ?о) (?k . ?л)
                            (?l . ?д) (?\; . ?ж) (?' . ?э) (?z . ?я)
                            (?x . ?ч) (?c . ?с) (?v . ?м) (?b . ?и)
                            (?n . ?т) (?m . ?ь) (?, . ?б) (?. . ?ю)
                            (?Q . ?Й) (?W . ?Ц) (?E . ?У) (?R . ?К)
                            (?T . ?Е) (?Y . ?Н) (?U . ?Г) (?I . ?Ш)
                            (?O . ?Щ) (?P . ?З) (?{ . ?Х) (?} . ?Ъ)
                            (?A . ?Ф) (?S . ?Ы) (?D . ?В) (?F . ?А)
                            (?G . ?П) (?H . ?Р) (?J . ?О) (?K . ?Л)
                            (?L . ?Д) (?: . ?Ж) (?\" . ?Э) (?Z . ?Я)
                            (?X . ?Ч) (?C . ?С) (?V . ?М) (?B. ?И)
                            (?N . ?Т) (?M . ?Ь) (?< . ?Б) (?> . ?Ю)
                            (?`. ?ё) (?~ . ?Ё) (?@ . ?\") (?# . ?\')
                            (?$ . ?*) (?% . ?:) (?^ . ?,) (?& . ?.)
                            (?* . ?\;)))

(defun lat<->rus (beg end &optional arg)
  "Recode region that contains russain text typed in english into russian. With ARG given recode region in the other 
direction."
  (interactive "*r\nP")
  (save-excursion
    (goto-char beg)
    (do () ((>= (point) end))
        (let* ((en-char (char-after (point)))
               (ru-char (if arg
                            (car (rassoc en-char usr:*en/ru-table*))
                          (cdr (assoc en-char usr:*en/ru-table*)))))
          (delete-char 1)
          (insert (if ru-char ru-char en-char))))))

(defun rus<->lat (beg end &optional arg)
  "Recode region that contains russain text typed in russian into enflish. With ARG given recode region in the other 
direction."
  (interactive "*r\nP")
  (save-excursion
    (goto-char beg)
    (do () ((>= (point) end))
        (let* ((en-char (char-after (point)))
               (ru-char (if arg
                            (cdr (assoc en-char usr:*en/ru-table*))
                          (car (rassoc en-char usr:*en/ru-table*)))))
          (delete-char 1)
          (insert (if ru-char ru-char en-char))))))

;==========================

Evgueni ★★★★★
()
Ответ на: комментарий от Evgueni

Перекодировка идёт в выделенном фрагменте с помощью команд M^x lat<->rus и M^x rus<->lat (TAB естественно нажимается после четвёртого символа)

Evgueni ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.