Unicode bidirectional class (source code)

= Unicode bidirectional class
{c}

A <Unicode bidirectional class> is a character property, formally named `Bidi_Class`, used as input to the <Unicode Bidirectional Algorithm>. It classifies directional behavior; the algorithm combines the properties with context to compute <bidirectional embedding levels>. A class is not itself a final screen position.<Unicode Bidirectional Algorithm (Revision 51) by the Unicode Consortium>[definitionBD1 and section3.2, Table4: bidirectional character types]{ref}

For a compact example, Latin A (`U+0041`) has classL, Hebrew alef (`U+05D0`) has classR, digit1 (`U+0031`) has classEN, and ordinary space (`U+0020`) has classWS. These labels distinguish strong directions, a numeric class and whitespace. They carry information that a single left-to-right/right-to-left Boolean would lose.

An original data-structure example keeps the stages separate. Represent each stored item by a record containing its logical index, <code point>, original `Bidi_Class`, working directional type, resolved level and eventual visual index. A direction-resolution step can update the working fields while leaving the stored code point and original property intact. A later <level-based reordering of bidirectional text> step changes position mappings rather than assigning new code points.

The advantage appears in debugging a digit within mixed-direction text. Its original classEN identifies a numeric input. Its resolved level describes the computed directional context, and its visual index identifies a placement in one line. Reporting only the visual index would conceal whether a mistake arose during classification, context resolution or final reordering.

The normative property data are supplied by the <Unicode> character database; broad descriptions such as “a letter in this script” have exceptions. An implementation should use the data for its chosen Unicode version rather than infer every character's class from appearance.<Unicode Bidirectional Algorithm (Revision 51) by the Unicode Consortium>[section3.2: normative character data, exceptions and version-sensitive assignments]{ref}