Lotus Multi-Byte Character Set


The Lotus Multi-Byte Character Set is a proprietary multi-byte character encoding originally conceived in 1988 at Lotus Development Corporation with input from Bob Balaban and others. Created around the same time and addressing some of the same problems, LMBCS could be viewed as parallel development and possible alternative to Unicode. For maximum compatibility, later issues of LMBCS incorporate UTF-16 as a subset.
Commercially, LMBCS was first introduced as the default character set of Lotus 1-2-3 Release 3 for DOS in March 1989 and Lotus 1-2-3/G Release 1 for OS/2 in 1990 replacing the 8-bit Lotus International Character Set and ASCII used in earlier DOS-only versions of Lotus 1-2-3 and Symphony. LMBCS is also used in IBM/Lotus SmartSuite, Notes and Domino, as well as in a number of third-party products.
LMBCS encodes the characters required for languages using the Latin, Arabic, Hebrew, Greek and Cyrillic scripts, the Thai, Chinese, Japanese and Korean writing systems, and technical symbols.

Encodings

Technically, LMBCS is a lead-byte encoding where code point 00hex as well as code points 20hex to 7Fhex are identical to ASCII.
Code point 00hex is always treated as NUL character to ensure maximum code compatibility with existing software libraries dealing with null-terminated strings in many programming languages such as C. This applies even to the UTF-16be codes, where code words with the form xx00hex are mapped to private-use codes with the form F6xxhex during encoding in order to avoid the use of NUL bytes, and to escaped control characters, where 20hex is added to the C0 control characters following the 0Fhex lead byte.
Code points 01hex to 1Fhex, which serve as control codes in ASCII, are used as lead bytes to switch the definition of code points above 7Fhex between several code groups and at the same time determine either a single- or multi-byte nature for the corresponding code group.
For example, code group 1 is almost identical to the SBCS code page 850, whereas code group 16 is similar to the Japanese MBCS code page 932. Multi-byte characters can thus occupy two or three bytes.
In canonical LMBCS, each character starts with its group byte.
To reduce the length, in optimized or compressed LMBCS a default code group or optimization group code can be defined on a per application or process basis and must be communicated to the interpreting code in some way. Thereby, the group byte can be omitted for these characters. Lotus 1-2-3 retrieves the optimization group code from the file header of the corresponding source file, whereas for Lotus Notes the optimization group code is fixed to be always 01hex.
DefaultGroupBytesDescription
N/A00hex1NUL
LMBCS-101hex2Code page 850
LMBCS-202hex2Code page 851
LMBCS-303hex2Code page 1255
LMBCS-404hex2Code page 1256
LMBCS-505hex2Code page 1251
LMBCS-606hex2Code page 852
N/A07hex1BEL
LMBCS-808hex2Code page 1254
N/A09hex1TAB
N/A0Ahex1LF
LMBCS-110Bhex2Code page 874
0Chex2Reserved
N/A0Dhex1CR
0Ehex2Reserved
0Fhex2Remapped C0/C1 control codes
LMBCS-1610hex3Code page 932/943
LMBCS-1711hex3Code page 949/1261
LMBCS-1812hex3Code page 950
LMBCS-1913hex3Code page 936/1386
14hex3UTF-16
N/A15hex3Reserved
N/A16hex3Reserved
N/A17hex3Reserved
N/A18hex3Reserved
N/A19hex1Lotus 1-2-3 system range
N/A1Ahex3Reserved
N/A1Bhex3Reserved
N/A1Chex3Reserved
N/A1Dhex3Reserved
N/A1Ehex3Reserved
N/A1Fhex3Reserved

Character set

Without prefix byte the code points 32 to 127 are interpreted as follows :

Group 1

LMBCS group 1 code points 128 to 255 are identical to the corresponding code points in code page 850, whereas code points 1 to 127 are defined according to the following exception list :

Group 2

LMBCS group 2 code points 128 to 255 are identical to the corresponding code points in code page 851, whereas code points 1 to 127 are defined according to the following exception list:

Group 6

LMBCS group 6 code points 128 to 255 are identical to the corresponding code points in code page 852, whereas code points 1 to 127 are defined according to the following exception list: