
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.224.37.168] |
![]() |
|
Сообщ.
#1
,
|
|
|
необходимо определить кодировку текста из файла (при условии, что текст м.б. только на win1251, koi8-r, dos, + м.б.ШЫЩ(непринципиально).
помгоите кто может! хоть чем-нибудь! плз! можно сюда mail.ru]мыло |
Сообщ.
#2
,
|
|
|
точнее IIPuTBOPIIIuK@mail.ru
|
Сообщ.
#3
,
|
|
|
Для больших текстов можно найти самые часто встречающиеся буквы и по ним подобрать кодировку. Сейчас попробовал для нескольких текстов - получился порядок [о]-[ае]-[инт].
|
Сообщ.
#4
,
|
|
|
Alexey Dejneka,
да я тоже думаю надо для каждой кодировки создать массив символов, а затем в ходе анализа текста суммировать число встречающихся символов изт какой-либо кодировки, а затем провирить каких символов больше... основная проблема, что я почти ни в зуб ногой в ЛИСПе так что, если есть какой-либо пример - очень прошу прислать/выложить |
Сообщ.
#5
,
|
|
|
не умею делать преобрахование типов в лиспе...
![]() известна ли длина текста? известно ли хоть одно слово в тексте? (скорее всего нет) кстати "ШЫШ" - значит "или" в KOI-8 если текст большой, можно обойтись частотным анализом |
Сообщ.
#6
,
|
|
|
нет, не известно ничего, текст в файле, файл - любой, но с русской кодировкой
указанный выше частотный анализ - самое то, больше/лучше уже не надо.. просто надо запрогить этот подсчет символов... (т.е. сравнивать с заданной кодировкой сивмолы из текста) смысл вроде понятен- прогить на ЛИСПе не умею ![]() |
Сообщ.
#7
,
|
|
|
хмммммммм
![]() ![]() (defun addone (e l) (cond ((eq l nil (cons (list e '1) nil)) ((atom (car l)) (cons (car l) (addone e (cdr l)))) ((eq (caar l) (coerce e 'integer)) (cons (list (caar l) (+ 1 (cadar l))) (cdr l))) )) эта ф-я учитывает один чертов список-массив байтов-символов, составляющих текст файла (defun create-list (l) (cond ((listen) (create_list (cons (read-char) l))) (T l) )) эта ф-я создает список из символов файла, перевернутый, но нам пофигу (defun decipher (x) (cond ((eq x 140) 'WIN_1251) ..... (T 'HREN_EE_ZNAET) )) сюда нужно по образцу воткнуть значения символов "О" и "о", а еще лучше "А", "И", "Н" и меньших тоже, а результат должен быть именем соответствующей кодировки 140 написано от балды (defun max (l) (max_in l 0 0)) (defun max_in (l n e) (cond ((eq l nil) e) ((> (cadar l) n) (max_in (cdr l) (cadar l) (caar l))) (T (max_in (cdr l) n e)) )) эта ф-я ищет в списке, построенном ф-ей addone, вида ((symbol number) (symbol number) ...) максимум и возвращает сам символ (точнее соответствующее ему число) max (l) - просто оболочка для вызова ф-и max_in (defun buildl (l) (bl_in l NIL)) (defun bl_in (l e) (cond ((eq l nil) e) (T (bl_in (cdr l) (addone (car l) e))) )) эта ф-я вызывает addone для каждого символа в списке, созданном create-list (defun main () (decipher (max (buildl (create_list NIL))))) а эта главная ф-я, файл надо подавать на стандартный ввод, в этом минус для переделки нужно добавить параметр функции create-list, в котором будет файл |
Сообщ.
#8
,
|
|
|
спасибо большое, щас попробую разобраться
|
Сообщ.
#9
,
|
|
|
Цитата Vesper @ 20.10.04, 13:58 (read-char) ... (coerce e 'integer) Это неправильно. Для того, чтобы прочитать знаки из файла, нужно знать кодировку. Причем в реализациях, поддерживающих Unicode, (CHAR-CODE E), скорее всего, выдаст не то число, которое записано в файле. Нужно открыть файл в двоичном режиме и работать с самими кодами. ![]() ![]() (defun file-octet-frequencies (filename) (with-open-file (s filename :element-type '(unsigned-byte 8)) (loop with table = (make-array 256 :initial-element 0) for octet = (read-byte s nil nil) while octet do (incf (aref table octet)) finally (return table)))) (defun vector-max-index (vector &optional (start 0)) (loop with imax = start and max = (aref vector start) for i from (1+ start) below (length vector) for x = (aref vector i) do (when (> x max) (setq imax i max x)) finally (return imax))) (defun guess-file-encoding (filename) (let ((o-code (vector-max-index (file-octet-frequencies filename) 128))) (case o-code (#xee :windows-1251) (#xcf :koi8-r) (#xae :cp866) (#xde :iso-8859-5) (t (error "An assumed letter O has an unknown code ~S." o-code))))) |
Сообщ.
#10
,
|
|
|
Alexey Dejneka, эххххх
![]() а разве это нельзя сделать не выходя за рамки стандартного Лиспа с добавлением работы с файлом? а еще можно проверять букву А на максимум, АсобеннА в мАсковских текстах ![]() |
Сообщ.
#11
,
|
|
|
Цитата Vesper @ 21.10.04, 08:20 когда дело касается обработки файлов, стандартный Лисп уже не работает ?!?!?! Тот "стандартный" Лисп, который я знаю (ANSI Common Lisp), имеет функции для работы с файлами (см. мое предыдущее сообщение). |
Сообщ.
#12
,
|
|
|
Alexey Dejneka, я архаист
![]() |
Сообщ.
#13
,
|
|
|
Помогите,плз,написать на лиспе сортировку списка вставкой в бинарное дерево.есть отдельные ф-и,но они не работают.
![]() |