Clozure CL中文版007:字符和外部格式
Category:帮助手册字符和外部格式
Clozure CL中的所有字符和字符串都使用UTF-32完全支持Unicode。Clozure CL中只有一种character类型和一种 string类型。有关此决定的讨论很多,可以通过http://clozure.com/pipermail/openmcl-devel/搜索openmcl-devel档案找到。我只想说,我们认为仅支持UTF-32的简单性和速度优势超过了空间劣势。
人物
characterClozure CL中有一种类型。所有character的都是base-chars。 char-code-limit现在#x110000,这意味着可以直接表示所有Unicode字符。从Unicode 5.0开始,char-code实际上只定义了大约100,000个1,114,112个可能的s。该函数code-char知道某些范围的代码值(特别是#xd800- #xddff)将永远不会是有效的字符代码,并将返回nil该范围内的参数,但可能返回非nilcharacter其他未分配的代码值 值(未定义/非标准对象)。
Clozure CL支持表单的字符名称u+xxxx- 其中 x是一个或多个十六进制数字的序列。十六进制数字的值表示字符的代码。该+ 字符是可选的,因此#\u+0020,#\U0020并且 #\U+20所有#\Space字符都指向该字符。
代码范围内的字符#xa0- #x7ff也具有符号名称这些是Unicode标准中的名称,其中空格由下划线替换。所以#\Greek_Capital_Letter_Epsilon可以用来指其性质char-code是#x395。要查看支持的字符名称的完整列表,请查看ccl::register-character-namein 的定义ccl:level-1;l1-reader.lisp。
外部格式
标准的功能open,load以及 compile-file所有接受:external-format关键字参数。值的值:external-format可以是 :default(默认值),行终止关键字(参见行终止关键字),字符编码关键字(参见字符编码),使用创建的外部格式对象make-external-format,或带键的plist :domain,:character-encoding和:line-termination。如果 参数是plist,则将使用结果。(apply #’make-external-format argument)
如果:default指定,则使用值*default-external-format*。如果未指定行终止,则使用值*default-line-termination* ,默认为:unix。如果未指定字符编码,则将*default-file-character-encoding*其用于文件流并*default-socket-character-encoding*用于套接字流。默认的默认字符编码是nil其中的同义词:iso-8859-1。
请注意,用于表示的关键字集合 character-encoding s的关键字集和用于表示行终止约定的关键字集是不相交的:关键字最多表示字符编码或行终止约定,但绝不是两者。
EXTERNAL-FORMATs是具有两个只读字段的对象(结构),可以通过函数访问:external-format-line-termination和external-format-character-encoding。
ccl:*default-external-format*[变量]
:external-format未指定或指定时使用此变量的值:default。可以有意义地给出任何可以用作外部格式的值(值除外:default)。
Clozure CL中此变量的初始值,:unix等同于 (:line-termination :unix)其中。
ccl:*default-line-termination*[变量]
当外部格式未指定行终止约定(或将其指定为:default。)时,将使用此变量的值。可以有意义地给出可用作行终止关键字的任何值(请参阅行终止关键字)。
Clozure CL中此变量的初始值为:unix。
make-external-format &key 域 字符编码 行终止[功能]
创建新的外部格式对象,或返回具有相同指定插槽值的现有格式对象。
域
这用于指示外部格式的使用位置。它的价值几乎可以是任何东西。它默认为NIL。在Clozure CL中有两个具有预定义含义的域::file表示文件系统中文件的编码,并:socket指示与套接字的i / o。域的值会影响字符编码和行终止的默认值。
字符编码
一个关键字,指定外部格式的字符编码。字符编码。默认为:default这意味着如果域是:file使用变量的值 *default-file-character-encoding*,并且如果 域是:socket,使用该变量的值*default-socket-character-encoding*。这两个变量的初始值是NIL,这意味着:iso-8859-1编码。
行终止
一个关键字,表示行终止关键字 行终止关键字。默认值 :default表示使用变量的值*default-line-termination*。
外部格式
如上所述的外部格式对象。
尽管函数的名称不同,但它不一定会创建一个新的唯一external-format对象:make-external-format在同一动态环境中使用相同参数进行的两次调用将 返回相同的(eq)对象。
线路终端关键词
行终止关键字指示哪些字符用于指示行的结尾。在输入时,外部线路终端字符由#\Newline输出和输出替换,#\Newlines被转换为外部线路终端字符。
线路终端关键词 | |
关键词 | 字符(S) |
:unix | #\Linefeed |
:macos | #\Return |
:cr | #\Return |
:crlf | #\Return #\Linefeed |
:cp/m | #\Return #\Linefeed |
:msdos | #\Return #\Linefeed |
:dos | #\Return #\Linefeed |
:windows | #\Return #\Linefeed |
:inferred | 见下文 |
:unicode | #\Line_Separator |
:inferred表示通过查看文件的内容来确定流的行终止约定。它只适用于file-stream开放的 :input或:io。检查第一个充满数据的缓冲区,如果一个#\Return字符出现在任何#\Linefeed字符之前 ,则行终止类型设置为:windows如果该#\Return字符后面紧跟一个#\Linefeed字符,:macos 否则。如果#\Return在缓冲区中找不到字符或者#\Return前面有字符#\Linefeed,则将文件的行终止类型设置为:unix。
字符编码
在内部,Clozure CL中的所有字符和字符串都是UTF-32。在外部,文件或套接字流可以以各种方式编码字符。国际标准化组织(ISO)广泛称为ISO,它定义了许多这些字符编码。Clozure CL实现了一些这些编码,如下所述。这些编码是外部格式规范的一部分(参见外部格式)。从流中读取时,字符将从指定的外部字符编码转换为UTF-32。写入流时,字符将从UTF-32转换为指定的字符编码。
在内部,character-encodings为是由字符编码的关键字(已命名的对象(结构):iso-8859-1,:utf-8等等)。结构包含用于编码/解码外部数据的编码和函数的属性,但除非您尝试定义或调试编码,否则几乎没有理由知道character-encoding对象,通常最好引用字符编码以它的名字命名。
可以通过调用检索Clozure CL支持的字符编码集describe-character-encodings。
describe-character-encodings[功能]
将所有已定义字符编码的描述写入*terminal-io*。这些描述包括编码别名的名称和文档字符串,它简要描述了每个编码的属性和预期用途。
编码问题
如果无法根据指定的外部格式对字符进行编码或解码,则将使用特定于编码的替换字符替换相关字符。#\Replacement_Character如果目标外部格式包含这样的字符,则这将是 ; 否则替换字符将是#\Sub。
替换字符的存在通常表示在翻译中丢失了某些内容:数据未正确编码或解码过程中存在错误。
字节顺序标记
字符编码的字节顺序有时是显式的,有时则不然。例如,:utf-16be表示big-endian,但是 :utf-16不指定endianness。字节顺序标记是一个特殊字符,可以出现在编码字符流的开头,以指定多字节字符编码的字节顺序。(它也可以与UTF-8字符编码一起使用,它仅用于表示编码是UTF-8。)
当字符编码的字节顺序不明确时,Clozure CL将字节顺序标记写为文件或套接字流的第一个字符。Clozure CL还期望来自流的输入上的字节顺序标记,其中字节顺序不明确。如果输入数据中缺少字节顺序标记,则假定该数据为大端顺序。
来自UTF-8编码输入流的字节顺序标记未经过特殊处理,只是从输入流中显示为普通字符。跳过这个角色可能是一个好主意。
选定的字符编码
这里描述了一些常用的编码。如需完整列表,请致电describe-character-encodings。大多数编码有别名,如命名的编码 :iso-8859-1,也可以通过名称提及:latin1和:ibm819,等等。在可能的情况下,编码的关键字化名称等同于首选MIME字符集名称(并且别名都是已注册的IANA字符集名称。)
:utf-8
一种8位可变长度字符编码,其中#x00-#x7f范围内CHAR-CODE的字符可以在一个八位字节中编码; 具有较大代码值的字符可以编码为2到4个字节。
Clozure CL *terminal-io*对所有未明确指定EXTERNAL-FORMAT的流使用此编码。*terminal-io*可以通过-K命令行参数设置 默认值 (请参阅命令行选项)。
:iso-8859-1
一种8位固定宽度的字符编码,其中所有字符代码都映射到它们的Unicode等价物。旨在支持大多数西欧语言中使用的大多数字符。
ISO-8859-1仅涵盖前256个Unicode代码点,其中前128个代码点等同于US-ASCII。这应该与Clozure CL的早期版本仅支持8位字符相当,但对于在特定区域设置中工作的用户来说可能不是最佳选择。
别名: :iso_8859-1, :latin1, :l1, :ibm819, :cp819, :csisolatin1
:us-ascii
一种7位固定宽度字符编码,其中所有字符代码都映射到它们的Unicode等价物。
别名: :csascii, :cp637, :ibm637, :us, :iso646-us, :ascii, :iso-ir-6
:utf-16
一种16位可变长度编码,其中CHAR-CODEs小于#x10000的字符可以在一个16位字中编码,而具有较大代码的字符可以用一对16位字编码。编码数据的字节顺序由数据前面的字节顺序标记字符(#u + feff)的字节顺序表示; 如果输入中没有这样的字符,则假定数据处于大端顺序。输出以本机字节顺序写入,带有前导字节顺序标记。
编码和解码字符串
Clozure CL提供了对字符串进行编码和解码的函数(简单数组(无符号字节8))。
count-characters-in-octet-vector vector &key start end external-format[功能]
返回根据外部格式解码向量(或由开始和结束分隔的子序列)生成的字符数。
decode-string-from-octets vector &key start end external-format string[功能]
根据外部格式将向量中的八位字节(或由开始和结束分隔的子序列)解码为字符串。
如果提供了string,则输出将被写入其中。它必须足够大以容纳解码的字符。如果字符串没有提供,一个新的字符串将被分配到保存解码的字符。
作为多个值返回解码的字符串和解码结束的向量中的位置。
矢量中不能根据外部格式解码成字符 的八位字节序列将被解码为 #\Replacement_Character。
encode-string-to-octets string &key start end external-format use-byte-order-mark vector vector-offset[功能]
根据 外部格式将字符串(或由开始和结束分隔的子字符串) 编码到向量中。它作为多个值返回包含编码数据的八位字节矢量和一个整数,该整数指定编码数据结束的矢量的偏移量。
当use-byte-order-mark为true时,字节顺序标记将包含在编码数据中。
如果提供了矢量,则输出将被写入。它必须是类型(simple-array (unsigned-byte 8)) 并且足够大以容纳编码数据。如果未提供,该函数将分配一个新向量来保存输出。
如果提供向量偏移,则数据将从该偏移量开始写入输出向量。
在字符串不能被编码成 外部格式将与依赖性编码替换字符(或者被替换#\Replacement_Character或者#\Sub)被编码并写入到输出向量之前。
string-size-in-octets string &key start end external-format use-byte-order-mark[功能]
返回根据编码字符串(或由:startand 分隔的子字符串:end)所需的八位字节数:external-format。
当use-byte-order-mark为true时,返回的大小将包括字节顺序标记所需的空间。
http://mip.i3geek.com