LISP: есть у кого-нибудь процедура для преобразования кодировки строки (dos-win)?
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP: есть у кого-нибудь процедура для преобразования кодировки строки (dos-win)?

LISP: есть у кого-нибудь процедура для преобразования кодировки строки (dos-win)?

Ответ
Поиск в этой теме
Непрочитано 16.07.2012, 11:22 #1
LISP: есть у кого-нибудь процедура для преобразования кодировки строки (dos-win)?
cj_lex
 
Регистрация: 15.12.2011
Сообщений: 29

Добрый день.
Есть ли у кого-нибудь процедура на лиспе для преобразования кодировки строки (из win в dos и обратно)?
Заранее спасибо.
Просмотров: 3624
 
Непрочитано 16.07.2012, 11:23
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411


А dwgconvert от А.Ривилиса не катит?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 16.07.2012, 11:25
#3
cj_lex


 
Регистрация: 15.12.2011
Сообщений: 29


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А dwgconvert от А.Ривилиса не катит?
незнаком с такой, сейчас поищу...
нашел, но мне бы на лиспе, так как собираюсь использовать в своей программе.

Последний раз редактировалось cj_lex, 16.07.2012 в 11:44.
cj_lex вне форума  
 
Непрочитано 16.07.2012, 12:15
1 | #4
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,834
<phrase 1=


Делал когда-то на переходном этапе для файлов. Тогда работало...
Код:
[Выделить все]
;;;функция перекодировки текста строки файла
(defun codfl ( fl-nm ex-t1 ex-t2  
	      / fl fl2 s1 l n en ed t2 n1 l1)
;;;	fl-nm 	; имя, исходный файл в кодировке 866
;;;  	ex-t1	; расширение исходного файл в кодировке 866
;;;  	ex-t2 	; расширение принимающего файла в кодировке WINDOWS с тем же именем

(setq FL2nm (strcat fl-nm ex-t2)	;"d:\\user\\123.wnd" ; имя приходного файла в кодировке WINDOWS
;;;	  	fl (open "d:\\user\\123.dos" "r")		; исходный файл в кодировке 866
      fl1nm (strcat fl-nm ex-t1)
      fl    (open fl1nm "r")		; исходный файл в кодировке 866
      fl2   (open fl2nm "w")		; приходный файл в кодировке WINDOWS
)


(while
  (setq t1 (read-line fl))
   (setq l1 (strlen t1)
	 n1 1
	 t2 ""
   )
   (while (<= n1 l1)
     (setq s (zam (ascii (substr t1 n1 1))))
     (setq t2 (strcat t2 (chr s))
	   n1 (+ n1 1)
     )
   )
   (setq t2 t2)
;;;  (print t2)
   (write-line t2 fl2)
)
(close fl)
(close fl2)
) ; end defun
;;;функция замены символа из 866 в 1252
;;;параметр s - код символа
(defun zam (s)
  (cond	((< s 127) s)
;;;	((> s 241) s) ; так было
	((> s 249) s)
	((= s 127) 167)
	((= s 128) 192)
	((= s 129) 193)
	((= s 130) 194)
	((= s 131) 195)
	((= s 132) 196)
	((= s 133) 197)
	((= s 134) 198)
	((= s 135) 199)
	((= s 136) 200)
	((= s 137) 201)
	((= s 138) 202)
	((= s 139) 203)
	((= s 140) 204)
	((= s 141) 205)
	((= s 142) 206)
	((= s 143) 207)
	((= s 144) 208)
	((= s 145) 209)
	((= s 146) 210)
	((= s 147) 211)
	((= s 148) 212)
	((= s 149) 213)
	((= s 150) 214)
	((= s 151) 215)
	((= s 152) 216)
	((= s 153) 217)
	((= s 154) 218)
	((= s 155) 219)
	((= s 156) 220)
	((= s 157) 221)
	((= s 158) 222)
	((= s 159) 223)
	((= s 160) 224)
	((= s 161) 225)
	((= s 162) 226)
	((= s 163) 227)
	((= s 164) 228)
	((= s 165) 229)
	((= s 166) 230)
	((= s 167) 231)
	((= s 168) 232)
	((= s 169) 233)
	((= s 170) 234)
	((= s 171) 235)
	((= s 172) 236)
	((= s 173) 237)
	((= s 174) 238)
	((= s 175) 239)
	((= s 224) 240)
	((= s 225) 241)
	((= s 226) 242)
	((= s 227) 243)
	((= s 228) 244)
	((= s 229) 245)
	((= s 230) 246)
	((= s 231) 247)
	((= s 232) 248)
	((= s 233) 249)
	((= s 234) 250)
	((= s 235) 251)
	((= s 236) 252)
	((= s 237) 253)
	((= s 238) 254)
	((= s 239) 255)
	((= s 240) 168)
	((= s 241) 184)
;;;украинские буквы
	((= s 244) 170);170 Є 00aa
	((= s 245) 186);186 є 00ba
	((= s 246) 178);178 _ 00a2
	((= s 247) 179);179 _ 00b2
	((= s 248) 175);175 Ї 00af
	((= s 249) 191);191 ї 00bf
(t s)
  )
)
__________________
По теории майский жук летать не может.
Но он этого не знает. И летает...
Alan вне форума  
 
Автор темы   Непрочитано 16.07.2012, 12:55
#5
cj_lex


 
Регистрация: 15.12.2011
Сообщений: 29


Спасибо))
cj_lex вне форума  
 
Непрочитано 16.07.2012, 12:57
#6
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Делал когда-то на переходном этапе для файлов. Тогда работало...
Незачет. У тебя же функция, а человеку процедуру какую-то надо, он два раза по-русски написал.
И вопрос был есть-ли. На который может быть только отрицательный ответ, так как никаких "процедур" в Lisp не имеется вообще.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 16.07.2012, 13:20
#7
cj_lex


 
Регистрация: 15.12.2011
Сообщений: 29


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Незачет. У тебя же функция, а человеку процедуру какую-то надо, он два раза по-русски написал.
И вопрос был есть-ли. На который может быть только отрицательный ответ, так как никаких "процедур" в Lisp не имеется вообще.
я функцию и имел ввиду утро понедельника, видимо, сказывается %)....

уже переделываю под себя. закончу - выложу, может быть кому-нибудь полезным окажется.
cj_lex вне форума  
 
Непрочитано 16.07.2012, 13:26
#8
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,834
<phrase 1=


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Незачет. У тебя же функция..... он два раза по-русски написал.
Сами мы не местные... Я же не программист
__________________
По теории майский жук летать не может.
Но он этого не знает. И летает...
Alan вне форума  
 
Автор темы   Непрочитано 16.07.2012, 14:13
#9
cj_lex


 
Регистрация: 15.12.2011
Сообщений: 29


у меня получилось как-то так:
Код:
[Выделить все]
;замена кода символа из дос в вин кодировку
(defun decode_dos_to_win (s)
  (cond	
    ((= s 127) 167)
    ((and (>= s 128) (<= s 175)) (+ s 64))
    ((and (>= s 224) (<= s 239)) (+ s 16))
    ((= s 240) 168)
    ((= s 241) 184)
    (t s)
  ); end cond
); end defun

;замена кода символа из вин в дос кодировку
(defun decode_win_to_dos (s)
  (cond	
    ((= s 167) 127)
    ((and (>= s 192) (<= s 239))(- s 64))
    ((and (>= s 240) (<= s 255))(- s 16))
    ((= s 168) 240)
    ((= s 184) 241)
    (t s)
  ); end cond
)

;кодировка строки из вин в дос
(defun string_win_to_dos (txt / result i)
  (setq i 1 result "")
  (repeat (strlen txt)
    (setq result (strcat result (chr(decode_win_to_dos(ascii(substr txt i 1))))))
    (setq i (1+ i))
  ); end repeat
  result
); end defun

;кодировка строки из дос в вин
(defun string_dos_to_win (txt / result i)
  (setq i 1 result "")
  (repeat (strlen txt)
    (setq result (strcat result (chr(decode_dos_to_win(ascii(substr txt i 1))))))
    (setq i (1+ i))
  ); end repeat
  result
); end defun
вроде бы работает.
cj_lex вне форума  
 
Непрочитано 16.07.2012, 15:17
#10
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
у меня получилось как-то так:
Прынцып правильный, но не совсем. Логичней сделать в decode_win_to_dos (s) аргументом строковый символ. Чтоб только со строкой и работать. А преобразование символа туды-сюды спрятать.

Наподобие

Код:
[Выделить все]
 (defun ru-conv-oem-char (ch / code)
  (setq code (ascii ch))
  (chr (+ code
          (cond ((<= 128 code 175) 64)
                ((<= 176 code 223) -48)
                ((<= 224 code 239) 16)
                (t 0)
          ) 
       ) 
  ) 
)

(defun ru-conv-oem-to-ansi (str / result)
  (setq result "")
  (while (< 0 (strlen str))
    (setq
      result  (strcat result (ru-conv-oem-char (substr str 1 1)))
      str (substr str 2)
    ) 
  )
  result
)
PS. А если придет Дима, то вообще в лямбду завернет, шоб хрестьянинам вообще не разобраться было...
ShaggyDoc вне форума  
 
Непрочитано 16.07.2012, 16:37
#11
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Offtop: Вот и я, в данном случае дело не в лямбде, а в "цикличном" strcat'е - что есть идиологически не правильно (создаеться количество "мусорных" строчек равное - длинне обрабатываемой строки -1).
Код:
[Выделить все]
 (vl-list->string (mapcar '(lambda (x)...преобразование...) (vl-string->list str)))
Попробуйте на больших текстах, я думаю (честное слово не проверял), производительность раз в 10 выростет (ну в общем в зависимоти от размера).
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 16.07.2012 в 16:44.
Дима_ вне форума  
 
Непрочитано 17.07.2012, 00:15
#12
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


а чем вам не угодила встроенная в лисп функция vl-string-translate ??
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 17.07.2012, 00:48
#13
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Так там-же весь алфавит в параметры "городить"?? (записывать сразу - "не красиво", генерировать при каждом вызове - тоже не айс (на частых коротких вызовах - больше подготовки), инициализировать переменную при загрузке - тоже для такой задачи не очень).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 17.07.2012, 06:23
#14
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Напоминаю, что перекодировка dos-win была актуальна лет 15 назад. Тогда никаких vl- в AutoCAD ещё не было. Надо было на чистом Автолисп делать.

На чистоту идеологии можно наплевать - был бы правильный результат. Приходилось пакетом конвертировать сотни DWG-файлов в Win (все строки, которые там могли встретиться) и всё получалось. Конечно, можно было потрудиться, поэкспериментировать, потратить время на усовершенствование алгоритма. И получить вылизанный когда уже поздно было бы.
ShaggyDoc вне форума  
 
Непрочитано 17.07.2012, 07:44
#15
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Так там-же весь алфавит в параметры "городить"??
В итоге, с полным алфавитом будет не больше, чем в вашем варианте, а работать будет быстрее.
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 17.07.2012, 10:49
#16
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от Елпанов Евгений Посмотреть сообщение
а работать будет быстрее.
В данном случае скорость не будет принципиально отличаться - ИХМО я всегда предпочитаю более "широкий" алгоритм, при условии того-же уровня производительности - когда различие идет на проценты - а не на порядки то "не вооруженным глазом" не заметишь. Не имеет никакого значения обработался текст за 0.15 или 0.17 секунды (или если там вся энциклопедия - то Вы пошли "гулять" на 15 или 17 минут). А вот 10 секунд или 1ч. 40 минут - тут уже разница есть (а по моим прикидкам на достаточно большом тексте соотношение будет примерно такое).
То ShaggyDoc я еще в предыдущем посте хотел спросить - сколько лет данному коду - но "постеснялся" (while (< 0 (strlen str)) и прочие "казусы". Честно говоря я вобще не понимаю как на "тех" машинах, работали "эти" (а других написать было не возможно в силу голого Автолиспа) коды. Еслиб я в то время взялся за автолисп, то точно-бы "плюнул слюной" и писал-бы конвертор DXF на асме (тогда я его часто использовал), это сейчас машины быстрые (для таких задач) - и в общем все равно.
з.ы. Блин сейчас вспомнил, у меня-же была своя досовская ассемблерная программа для перевода любых файлов из dos->win и обратно (вроде фалы задавались через командную строку, а при пустой путь спрашивал), она даже по всем Питерским BBS'кам расползлась (надо в архивах будет ради интереса поковыряться - посмотреть как я тогда писал).
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 17.07.2012 в 10:56.
Дима_ вне форума  
 
Непрочитано 17.07.2012, 11:52
#17
Vov.Ka


 
Регистрация: 21.07.2008
Луцьк
Сообщений: 179


ставлю на ЕЕ
Vov.Ka вне форума  
 
Непрочитано 17.07.2012, 12:09
#18
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
хотел спросить - сколько лет данному коду - но "постеснялся" (while (< 0 (strlen str)) и прочие "казусы
А ты думаешь я этого не вижу? Просто нет смысла многое оптимизировать.

Напомню, в каких условиях мы тогда программировали:

1. AutoCAD R10 под DOS. Никакой "расширенной" памяти, только 640 Кб - и под саму DOS и под все программы.

2. Для Автолисп отводилось 64К. Там и сам интерпретатор сидел, для пользователя оставалось 45 кб. Это еще делилось на STACK и HEAP, размером которых еще надо было управлять.

3. А в HEAP еще было пространство "нодов" и "строковое" пространство. Это тоже надо было учитывать.

4. Вот и фиг тебе в этих условиях, а не рекурсия. Алгоритмы приходилось выбирать по-проще, последовательные. Имена переменных - коротенькие.

5. Чуть программа посложнее - приходилось использовать всякие функции для работы с памятью - vmon, alloc expand, gc. Да переменную LISPXMEM использовать.

Хорошо еще наши программисты "изобрели" компилятор ACOMP и компилированный Лисп и работал быстрее, и память рационально использовал.
ShaggyDoc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP: есть у кого-нибудь процедура для преобразования кодировки строки (dos-win)?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Есть ли у кого нибудь любой расчет многоэтажного здания в лире? заранее благодарю Карл Поиск литературы, чертежей, моделей и прочих материалов 2 20.10.2011 05:20
Плитка газонная - есть ли у кого нибудь опыт применения в обустройстве пешеходных зон Maria-Mirabella Прочее. Архитектура и строительство 3 14.10.2011 10:04
Есть ли у кого нибудь чертежи (как люди например красят стены и делают бетонный пол) Скиньте пожалуйста !!! Rustam4iik Поиск литературы, чертежей, моделей и прочих материалов 0 12.05.2011 21:29
Есть у кого нибудь, чертеж-план цеха по производству колбасы. Студент88 Поиск литературы, чертежей, моделей и прочих материалов 1 06.02.2011 13:11
Делаю диплом Тема "автосалон" Есть у кого нибудь рекомендации к проектированию автосалонов автодилеров nivis Поиск литературы, чертежей, моделей и прочих материалов 3 03.12.2010 06:41