3. 语法 (Syntaxes)
语法定义用于约束存储在 LDAP 目录中的属性值结构, 并确定在 LDAP 协议中传输的属性值和断言值的表示形式.
本节规定了目录操作所需或常用的语法. 服务器应该识别本文档列出的所有语法, 但不要求以其它方式支持这些语法, 并且可以识别或支持其它语法. 不过, 不鼓励定义额外的任意语法, 因为这会妨碍互操作性. 客户端和服务器实现通常不具备动态识别新语法的能力.
3.1. 一般考虑 (General Considerations)
每种语法的描述都会规定符合该语法的属性值或断言值在 LDAP 协议 [RFC4511] 中传输时应如何表示. 该表示称为 LDAP 专用编码 (LDAP-specific encoding), 用于区别于属性值的其它编码方法 (例如 X.500 [X.500] 目录使用的基本编码规则 (Basic Encoding Rules, BER) 编码 [BER]).
给定属性语法的 LDAP 专用编码总是生成按八位字节对齐的值. 在最大可行范围内, LDAP 语法的编码规则应生成字符字符串, 使实现 LDAP 的客户端无需转换或只需少量转换即可显示. 不过, 客户端不得假定未识别语法的值经过 LDAP 专用编码后一定是人类可读的字符字符串. 在少数情况下 (例如 JPEG 语法), 生成可读表示并不合理.
每个 LDAP 语法都由一个以点分十进制格式表示的对象标识符 (object identifier) [ASN.1] 唯一标识 (语法没有定义简短描述性名称). 这些对象标识符并不用于向用户显示. 本文档定义的语法对象标识符汇总在 Appendix A 中.
对于基于字符串的语法, 属性值中的字符数可以给出建议的最小上限; 对于所有其它语法, 值中的八位字节数可以给出建议的最小上限. 该上限可以通过在属性类型定义中, 于语法的 OBJECT IDENTIFIER 之后追加花括号括起的边界值来表示 (见 [RFC4512] 中的 <noidlen> 规则). 这样的边界值不视为语法标识符的一部分.
例如, 属性定义中的 "1.3.6.1.4.1.1466.115.121.1.15{64}" 表示目录服务器将允许该属性的值最长为 64 个字符, 尽管它也可能允许更长的字符字符串. 注意, Directory String 语法中的单个字符可以编码为多个八位字节, 因为 UTF-8 [RFC3629] 是一种变长编码. 因此, 一个 64 字符的字符串长度可能超过 64 个八位字节.
3.2. 通用定义 (Common Definitions)
以下 ABNF 规则用于第 3.3 节中的多个语法定义.
PrintableCharacter = ALPHA / DIGIT / SQUOTE / LPAREN / RPAREN /
PLUS / COMMA / HYPHEN / DOT / EQUALS /
SLASH / COLON / QUESTION / SPACE
PrintableString = 1*PrintableCharacter
IA5String = *(%x00-7F)
SLASH = %x2F ; forward slash ("/")
COLON = %x3A ; colon (":")
QUESTION = %x3F ; question mark ("?")
<ALPHA>, <DIGIT>, <SQUOTE>, <LPAREN>, <RPAREN>, <PLUS>, <COMMA>, <HYPHEN>, <DOT>, <EQUALS> 和 <SPACE> 规则在 [RFC4512] 中定义.