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

Известно, что lisp может читать/писать только кодировку ANSI. Ну, по крайней мере, если использовать штатные средства - open, write-line/princ, close. Но понадобилось мне тут читать файл с кодировкой utf-8. Что делать и как быть?

Естественно, гугл в помощь. Нашел коды на французском форуме. Коды привожу здесь только чтоб не потерять:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
;; gc:WriteStream
;; Ecrit un texte dans un fichier suivant l'encodage de caractère spécifié
;; Retourne le chemin du fichier ou nil si l'opération a échoué.
;;
;; Arguments
;; text     : le texte à écrire
;; filename : le chemin du ficher
;; charset  : le système d'encodage (exemples : "iso-8859-1" (ascii/ANSI), "utf-8", "unicode")
(defun gc:WriteStream (text filename charset / stream result)
  (vl-load-com)
  (if (setq stream (vlax-create-object "ADODB.Stream"))
    (progn
      (setq result
       (vl-catch-all-apply
         (function
     (lambda ()
       (vlax-put stream 'Charset charset)
       (vlax-invoke stream 'Open)
       (vlax-invoke stream 'WriteText text 0)
       (vlax-invoke stream 'SaveToFile filename 2)
       (vlax-invoke stream 'Close)
     )
         )
       )
      )
      (vlax-release-object stream)
      (if (not (vl-catch-all-error-p result))
  filename
      )
    )
  )
)

;; gc:ReadStream
;; Lit un texte dans un fichier suivant l'encodage de caractère spécifié
;; Retourne le contenu du fichier ou nil si l'opération a échoué.
;;
;; Arguments
;; filename : le chemin du ficher
;; charset  : le système d'encodage (exemples : "iso-8859-1" (ascii/ANSI), "utf-8", "unicode")
(defun gc:ReadStream (filename charset / stream retval)
  (vl-load-com)
  (if (and (setq filename (findfile filename))
     (setq stream (vlax-create-object "ADODB.Stream"))
      )
    (progn
      (vl-catch-all-apply
  (function
    (lambda ()
      (vlax-put stream 'Charset charset)
      (vlax-invoke stream 'Open)
      (vlax-invoke stream 'LoadFromFile filename)
      (setq retval (vlax-invoke stream 'ReadText -1))
      (vlax-invoke stream 'Close)
    )
  )
      )
      (vlax-release-object stream)
      retval
    )
  )
)


Поделитесь своим мнением


Я не робот.