SBCL:列出所有有效字符编码
问题描述:
要获得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包外部符号。)
答
唯一的“正式”列表是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。那里有很多其他的(可能是暂时的,但我会抓住机会)好东西。 –
你需要什么目的列表?如果你只是想看看哪些是可用的,那么该手册有一个[list](http://www.sbcl.org/manual/#External-Formats)。内部SBCL似乎有一个散列表“SB-IMPL :: * EXTERNAL-FORMATS *”,它包含所有外部格式。 – jkiiski
@jkiiski:我正在写一个LISP程序,以探索所有的格式,只是为了好玩。我的LISP程序无法阅读手册。你的建议奏效,并且(不奇怪)产生与手册中相同的格式;如果你把它变成真实的答案,我会很乐意接受它。我的kludgey方式产生相同的输出,除了它还包含“DEFAULT”。 –