Accessibility · Assistive Technology

Braille Displays and the Translation Layer

How a refreshable braille display turns screen text into dot patterns through character encoding, and why contracted braille requires a separate translation step.

A refreshable braille display is a row of electromechanical cells that raise and lower pins to form dot patterns. A typical cell has eight pins arranged in two columns of four, and the display has enough cells for one or two short lines of text, commonly between twenty and eighty cells. The user reads the raised dots with a fingertip while the display rewrites the line as the reading position moves. Underneath that straightforward physical description sits a translation problem: the text a screen reader produces is a sequence of Unicode characters, but the cell needs a dot pattern, and the two are not the same alphabet.

The cell as a bitfield

A braille cell is naturally described as a bitfield. Number the eight dot positions from 1 to 8, and let bit i mean “pin i is raised”. Then a single cell is one byte, and a line of braille is a byte array. The six-dot subset used for most literary braille uses dots 1 through 6; the extra two dots, 7 and 8, extend the alphabet for computer braille, which needs to represent many more symbols than literary braille does.

The mapping from a cell’s dot pattern to a character code has a stable answer in Unicode. The Braille Patterns block, U+2800 through U+28FF, encodes every possible eight-dot pattern as a single code point, with the convention that dot 1 adds 0x01, dot 2 adds 0x02, dot 3 adds 0x04, dot 4 adds 0x08, dot 5 adds 0x10, dot 6 adds 0x20, dot 7 adds 0x40, and dot 8 adds 0x80. The code point U+2800 is the blank cell, and U+28FF is the cell with all eight dots raised. This is a pure enumeration: the 256 code points in the block are exactly the 256 possible cells, and the encoding is a direct bitmapping, not a phonetic or semantic assignment.

This enumeration is what makes the low-level layer of braille well-defined. A display driver receives, or produces, a string of code points in U+2800..U+28FF and raises the corresponding pins. The question the display never answers is what those code points mean. That is the translation layer’s job.

Grade 1 versus Grade 2

The simplest translation is one character in, one cell out, called grade 1, or uncontracted, braille. The letter “a” becomes the single-dot cell U+2801, and every character in the source text produces exactly one cell. Grade 1 is unambiguous and lossless, and it is the natural output when the system has no knowledge of the reader’s language conventions. Its cost is width: a line of printed text becomes a line of cells roughly as long, and a twenty-cell display shows only twenty characters at a time.

Contracted braille, grade 2 in English terminology, replaces frequent groups of letters and whole words with single cells or short sequences. The word “and” becomes one cell, “the” one cell, and common syllables like “ing” one cell. The result is measurably shorter than grade 1: a contracted text occupies roughly 60 to 70 percent of the cells of the same text uncontracted, though the exact ratio depends on the text. Contraction is not a compression algorithm in the information-theoretic sense; it is a codebook that exploits the statistics of the language, and it is what experienced braille readers actually read, which is why a display that offers only grade 1 is regarded as a poor substitute.

The translation from ordinary text to contracted braille is not a per-character substitution. It is context-sensitive, because a group of letters contracts only in some positions: an “and” inside a word may contract or not depending on the rules of the specific braille code, and proper names and foreign words may stay uncontracted. A real translator therefore works with a rule set and a dictionary for the language, and the same source string can produce different cells in American English, British English, and other national codes. This is the point where braille leaves the territory of a simple encoding and becomes a linguistic transform.

Where translation happens

There are two architectural answers, and they differ in who owns the dictionary. In one design the screen reader performs the translation and sends contracted cells to the display. In the other the display’s firmware performs it, receiving ordinary text and contracting it internally. The split matters for several practical reasons.

When the screen reader translates, it has access to the same semantics it uses for speech: it knows whether a token is a heading, a link, or a number, and it can translate accordingly. It also controls the language, so a document that switches languages can switch braille codes mid-line. The display is then a dumb output device, which is why such displays are often cheaper and simpler.

When the display translates, the screen reader sends text plus minimal markup, and the display’s firmware applies its own dictionary. This decouples the translation from the screen reader, so a user who prefers a particular braille code can use it with any reader. The cost is that the display has no access to the semantic markup the reader knows, so the braille version of a heading or a link is presented without the distinctions the reader could otherwise render as dots 7 and 8 or as capitalization.

Most deployments land somewhere in between, with the screen reader doing the semantic work and the display handling the final cell mapping, but the boundary is a product decision, not a standard one, and it is a frequent source of confusion when a user changes either component and finds the braille output has changed too.

Numeric and edge handling

Numbers, capitalization, and punctuation each require their own cell conventions, and they illustrate why a cell string is not self-describing. In literary braille a digit is conventionally preceded by a number sign cell, and the letters “a” through “j” reused as digits 1 through 0; a lone “1” therefore occupies two cells. In computer braille, which uses all eight dots, digits have their own single cells, so the same source digit produces different cell counts under the two codes. This is a concrete case of the grade 1 versus grade 2 distinction reappearing inside numeric rendering.

Capitalization is handled by a prefix cell before the capitalized letter, one cell per capital in some codes and a single “word is capitalized” marker in others. This means an uppercase word can be longer in cells than the same word lowercase, the opposite of what contraction does elsewhere, and it is one of the reasons contracted braille is not a simple length reduction everywhere.

Failure modes

The dominant failure is the mid-line context switch. A screen reader moves the reading cursor through a mixed document, and if the translation layer does not know the language of each span, it applies the wrong code to a substring, producing cells that are wrong for the reader’s language. The second failure is lossy round-tripping: contracted braille is not injective, so converting braille back to print is ambiguous, and any feature that tries to do so produces guesses. The third is the display itself, which is a mechanical device with moving pins and a finite refresh rate; a line of cells takes time to raise, and very fast cursor movement can outrun the pins, leaving the user reading a line that no longer matches the reading position.

The translation layer is the software answer to a hardware fact: the cell has eight pins and no meaning, and meaning is a convention that lives above the pins. The screen reader’s announcement pipeline and the accessible name computation both feed it text, and the braille translator is where that text leaves the world of characters and becomes something a fingertip can read.

References

  1. Unicode Standard, Braille Patterns block — Unicode Consortium
  2. Braille Patterns, The Unicode Standard, Chapter 21 — Unicode Consortium
  3. World Braille Usage, third edition — Perkins School for the Blind