我一直致力于一个通用的lisp程序,该程序解析两个XML文件,并以自定义方式将它们组合成第三个XML。不幸的是,lisp使用CP1252字符集,而我的XML文件使用UTF-8并包含一些不能在CP1252中使用的日文字符。
我一直试图通过添加
使clisp使用UTF-8:external-format 'charset:UTF-8
同时加载(如建议的here)和read-line
(因为为什么不是)函数,但clisp仍会抛出此错误:
READ-LINE:CHARSET中的字节#x81无效:CP1252转换
有没有办法用我的代码做我想要的?我对lisp来说还是一个新手。
完整读取功能代码:
(defun readXML (stream libSize)
(defparameter lib nil)
(defparameter x 1)
(loop
(defparameter lib (cons (read-line stream :external-format 'charset:UTF-8) lib))
(defparameter x (+ x 1))
(when (> x libSize) (return lib))))
答案 0 :(得分:5)
read-line
此函数不接受:external-format
参数。
它确实接受了几个可选参数,但它们无关 用编码。
defparameter
这是一个"顶级"运算符,它创建一个全局dynamic variable。
从不在函数内使用它。
而是使用let
- binds variables lexically。
loop
(见下文)也会绑定变量。
(defun read-lines (file-name max-lines)
"Open the file and read it line-by-line, at most `max-lines'."
(with-open-file (stream file-name :external-format charset:utf-8)
(loop :for line = (read-line stream nil nil)
:for line-number :upfrom 0
:while (and line (< line-number max-lines))
:collect line)))
或者,稍微简单一些(由@jkiiski建议):
(defun read-lines (file-name max-lines)
"Open the file and read it line-by-line, at most `max-lines'."
(with-open-file (stream file-name :external-format charset:utf-8)
(loop :for line = (read-line stream nil nil)
:repeat max-lines
:while line
:collect line)))
with-open-file
打开
文件,将stream
绑定到结果并确保流是
退出时关闭。
loop
非常先进
迭代设施。它将line
绑定到每个连续的行,计数
他们使用line-number
,并将行收集到返回值中:
PS。请按照答案中的所有链接。 他们详细解释了每个操作员。