2017-09-03 52 views
0

要获得SBCL所有有效编码列表,我这样做:SBCL:列出所有有效字符编码

(let (encoding-list) 
    (let (symbol-list) 
    (do-external-symbols (s :keyword) 
     (push s symbol-list)) 
    (setf symbol-list (sort symbol-list #'string<)) 
    (mapc (lambda (x) 
      (when (ignore-errors 
        (with-open-file 
         (phyle "scratch1" 
         :direction  :output 
         :if-exists  :supersede 
         :external-format x) 
         1)) ; <-- produce something non-NIL 
       (push x encoding-list))) 
      symbol-list)) 
    (nreverse encoding-list)) 

是否有更简单的方法在SBCL做到这一点? (例如,在CLISP,所有的编码是在CHARSET包外部符号。)

+2

你需要什么目的列表?如果你只是想看看哪些是可用的,那么该手册有一个[list](http://www.sbcl.org/manual/#External-Formats)。内部SBCL似乎有一个散列表“SB-IMPL :: * EXTERNAL-FORMATS *”,它包含所有外部格式。 – jkiiski

+0

@jkiiski:我正在写一个LISP程序,以探索所有的格式,只是为了好玩。我的LISP程序无法阅读手册。你的建议奏效,并且(不奇怪)产生与手册中相同的格式;如果你把它变成真实的答案,我会很乐意接受它。我的kludgey方式产生相同的输出,除了它还包含“DEFAULT”。 –

回答

2

唯一的“正式”列表是the manual。如果你不介意的话寻找到SBCLs内部,外部格式存储在一个哈希表,SB-IMPL::*EXTERNAL-FORMATS*

CL-USER> (alexandria:hash-table-keys sb-impl::*external-formats*) 
(:UTF32BE :UTF-32BE :UTF32LE :UTF-32LE :UTF16BE :UTF-16BE :UTF16LE :UTF-16LE 
:UCS4BE :UCS-4BE :UCS4LE :UCS-4LE :UCS2BE :UCS-2BE :UCS2LE :UCS-2LE :CP932 
:|Shift_JIS| :SJIS :SHIFT_JIS :|eucJP| :EUCJP :EUC-JP :CP936 :GBK :|macintosh| 
:MACINTOSH :|mac| :MAC :|MacRoman| :|mac-roman| :MAC-ROMAN :|windows-1258| 
:WINDOWS-1258 :|cp1258| :CP1258 :|windows-1257| :WINDOWS-1257 :|cp1257| 
:CP1257 :|windows-1256| :WINDOWS-1256 :|cp1256| :CP1256 :|windows-1255| 
:WINDOWS-1255 :|cp1255| :CP1255 :|cp1254| :CP1254 :|windows-1253| 
:WINDOWS-1253 :|cp1253| :CP1253 :|windows-1252| :WINDOWS-1252 :|cp1252| 
:CP1252 :|windows-1251| :WINDOWS-1251 :|cp1251| :CP1251 :|windows-1250| 
:WINDOWS-1250 :|cp1250| :CP1250 :ISO8859-15 :ISO-8859-15 :LATIN9 :LATIN-9 
:|latin-8| :LATIN-8 :|iso-8859-14| :ISO-8859-14 :|latin-7| :LATIN-7 
:|iso-8859-13| :ISO-8859-13 :|iso-8859-11| :ISO-8859-11 :|latin-6| :LATIN-6 
:|iso-8859-10| :ISO-8859-10 :|latin-5| :LATIN-5 :|iso-8859-9| :ISO-8859-9 
:|iso-8859-8| :ISO-8859-8 :|iso-8859-7| :ISO-8859-7 :|iso-8859-6| :ISO-8859-6 
:|iso-8859-5| :ISO-8859-5 :|latin-4| :LATIN-4 :|iso-8859-4| :ISO-8859-4 
:|latin-3| :LATIN-3 :|iso-8859-3| :ISO-8859-3 :|latin-2| :LATIN-2 
:|iso-8859-2| :ISO-8859-2 :|cp874| :CP874 :|cp869| :CP869 :|cp866| :CP866 
:|cp865| :CP865 :|cp864| :CP864 :|cp863| :CP863 :|cp862| :CP862 :|cp861| 
:CP861 :|cp860| :CP860 :|cp857| :CP857 :|cp855| :CP855 :|cp852| :CP852 
:|cp850| :CP850 :|cp437| :CP437 :|x-mac-cyrillic| :X-MAC-CYRILLIC :|koi8-u| 
:KOI8-U :|koi8-r| :KOI8-R :IBM037 :IBM-037 :|cp037| :CP037 :EBCDIC-US :UTF8 
:UTF-8 :ISO8859-1 :ISO-8859-1 :LATIN1 :LATIN-1 :|646| :ISO-646-US :ISO-646 
:ANSI_X3.4-1968 :US-ASCII :ASCII) 

当然,由于这不是公共API,因此不保证它在将来的版本中不会被破坏。

+0

由于这不是一个公共的API,所以你的警告是值得赞赏的。如有必要,我总是可以回到我第一次提议的泥泞中。但也要感谢我提醒sb-impl。那里有很多其他的(可能是暂时的,但我会抓住机会)好东西。 –