2. DistinguishedName の ASN.1 から文字列への変換
X.501 [X.501] は識別名の ASN.1 [X.680] 構造を定義する。以下は議論のために示す変形である。
DistinguishedName ::= RDNSequence
RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
RelativeDistinguishedName ::= SET SIZE (1..MAX) OF
AttributeTypeAndValue
AttributeTypeAndValue ::= SEQUENCE {
type AttributeType,
value AttributeValue }
本節は、識別名を ASN.1 構造表現から UTF-8 [RFC3629] で符号化された Unicode [Unicode] 文字列表現に変換する推奨 (RECOMMENDED) アルゴリズムを定義する。識別名を文字列に変換する他のアルゴリズムを記述するドキュメントがあってもよいが、LDAP 実装は第 3 節で定義される文法に適合する文字列のみを生成しなければならない (SHALL)。
2.1. RDNSequence の変換
RDNSequence が空の列の場合、結果は空(長さ 0 の)文字列となる。
それ以外の場合、出力は RDNSequence 内の各 RelativeDistinguishedName の文字列符号化(第 2.2 節による)からなり、列の最後の要素から始めて先頭の要素に向かって逆向きに進む。
隣接する RelativeDistinguishedName の符号化はコンマ (',' U+002C) 文字で区切られる。
2.2. RelativeDistinguishedName の変換
ASN.1 の RelativeDistinguishedName を文字列に変換する場合、出力は各 AttributeTypeAndValue の文字列符号化(第 2.3 節による)からなり、その順序は問わない。
複数値 RDN の場合、隣接する AttributeTypeAndValue の出力はプラス記号 ('+' U+002B) 文字で区切られる。
2.3. AttributeTypeAndValue の変換
AttributeTypeAndValue は、AttributeType の文字列表現、それに続く等号 ('=' U+003D) 文字、さらにそれに続く AttributeValue の文字列表現として符号化される。AttributeValue の符号化は第 2.4 節で与えられる。
AttributeType が短縮名(記述子)[RFC4512] を持つと定義されており、その短縮名がその AttributeType を識別するものとして登録されている [REGISTRY][RFC4520] ことが既知である場合、その短縮名(
実装が登録済み短縮名の知識を動的に更新することは期待されない。しかし、実装は登録済み短縮名の知識を更新できる仕組みを提供すべきである (SHOULD)。
2.4. AttributeValue の ASN.1 から文字列への変換
AttributeType がドット区切り 10 進形式の場合、AttributeValue は数値記号 ('#' U+0023) 文字と、それに続く X.500 AttributeValue の BER 符号化の各オクテットの 16 進符号化で表現される。この形式は、AttributeValue の構文に LDAP 固有の([RFC4517] 第 3.1 節の)文字列符号化が定義されていない場合、またはその LDAP 固有の文字列符号化が UTF-8 符号化された Unicode 文字に制限されていない場合にも使われる。この形式は、可逆的な文字列表現が望まれる場合(第 5.2 節を参照)など、他の場合にも使われてよい。
それ以外の場合で、AttributeValue が LDAP 固有の文字列符号化を持つ構文であるなら、その値はまずその構文仕様に従って UTF-8 符号化された Unicode 文字列に変換される(例は [RFC4517] 第 3.3 節を参照)。その UTF-8 符号化 Unicode 文字列が、以下に示すエスケープが必要な文字を一切含まないなら、その文字列をそのまま値の文字列表現として使える。
- 文字列の先頭に現れる空白 (' ' U+0020) または数値記号 ('#' U+0023);
- 文字列の末尾に現れる空白 (' ' U+0020) 文字;
- 文字 '"'、'+'、','、';'、'<'、'>' または '' のいずれか(それぞれ U+0022、U+002B、U+002C、U+003B、U+003C、U+003E、U+005C);
- NULL (U+0000) 文字。
他の文字をエスケープしてもよい。
エスケープ対象の文字の各オクテットは、文字の符号内の 1 オクテットを構成する 2 桁の 16 進数とその前のバックスラッシュに置き換えられる。あるいは、エスケープ対象の文字が次のいずれかである場合に限り、
' ', '"', '#', '+', ',', ';', '<', '=', '>', または '\'
(それぞれ U+0020, U+0022, U+0023, U+002B, U+002C, U+003B,
U+003C, U+003D, U+003E, U+005C)
その前にバックスラッシュ ('' U+005C) を付けることでもエスケープできる。
エスケープ機構の例は第 4 節に示す。