How Windows 95 Handled Right-to-Left Languages

Windows 95 handled right-to-left (RTL) languages, such as Arabic and Hebrew, through dedicated, localized editions that heavily modified core operating system subsystems. Because Windows 95 lacked modern, unified Unicode architecture, Microsoft altered the Graphical Device Interface (GDI) and the USER subsystem to manage bidirectional text layout, contextual character shaping, and full user-interface mirroring. This article explains the technical mechanisms Windows 95 used to display, input, and render RTL scripts.

Dedicated Localized Kernels and Subsystems

Standard Western editions of Windows 95 could not natively switch to RTL display formats. Instead, Microsoft released specific Middle Eastern (ME) editions. These releases replaced standard core dynamic link libraries (such as USER32.DLL and GDI32.DLL) with versions modified to intercept rendering calls and redirect coordinates.

The system relied on regional ANSI code pages rather than Unicode. Hebrew editions operated primarily on Windows-1255, while Arabic editions used Windows-1256. These code pages mapped single-byte character sequences to localized alphabets while reserving Latin characters for basic system compatibility.

Bidirectional (BiDi) Algorithm and Text Ordering

To correctly display text containing both RTL characters and left-to-right (LTR) elements, such as numbers or Latin phrases, Windows 95 implemented early bidirectional text algorithms.

  1. Logical vs. Visual Storage: Data was stored in logical order (the order in which characters were typed). The rendering engine converted this stream into visual order (the physical sequence of pixels on the screen) before drawing text.
  2. Text Reordering: When an application called text-output APIs such as TextOut or DrawText, the localized GDI calculated the directional boundary of each segment. Numbers and Latin text were tagged as LTR runs, while surrounding Semitic characters were tagged as RTL runs, ensuring numbers did not appear backward.

Contextual Glyph Shaping in Arabic

Unlike Hebrew, written Arabic is cursive, requiring characters to change their visual shape depending on their position within a word (isolated, initial, medial, or final).

In Arabic Windows 95, the GDI worked in tandem with the font rendering engine to dynamically evaluate adjacent character codes in memory. Before rasterizing the glyphs, the system substituted the standard character code with the specific ligatures and positional forms defined in the font’s character mapping tables. Specialized TrueType fonts included extra glyph slots to support these cursive variations, as well as vowel marks (Tashkeel) placed above or below letters.

User Interface Mirroring

Displaying RTL languages required more than just reversing text; the entire graphical layout had to be inverted to match the natural reading habits of RTL users.

Microsoft introduced extended window styles into the localized USER subsystems:

  • Window Coordinates: The coordinate origin (0,0) was moved from the top-left corner to the top-right corner. Positive horizontal coordinates advanced leftward.
  • UI Controls: Scrollbars were repositioned to the left side of windows, and drop-down menu arrows were aligned to the left edge of controls.
  • Window Chrome: Minimize, maximize, and close buttons shifted to the upper-left corner of the window frame, while the system icon and title bar text moved to the right.
  • Alignment Flags: Windows introduced internal flags such as WS_EX_RTLREADING and WS_EX_RIGHT to dictate whether controls should draw content from right to left, allowing legacy applications to maintain compatibility while modern software opted into full RTL layouts.

Keyboard and Input Management

Windows 95 Middle Eastern editions used a specialized keyboard layout driver to facilitate seamless typing between Latin and RTL scripts. Pressing the standard shortcut (such as Left Alt + Shift) altered the active code page context for the current thread.

This switch adjusted the caret (cursor) behavior instantly. In RTL mode, the blinking cursor rendered with a small directional flag pointing right-to-left and advanced to the left as users typed, automatically handling character insertion and backspace deletions in reverse coordinate space.