Lotus Multi-Byte Character Set ( LMBCS ) — это фирменная кодировка многобайтовых символов, изначально задуманная в 1988 году в Lotus Development Corporation при участии Боба Балабана и других. [1] Созданная примерно в то же время и решающая некоторые из тех же проблем, LMBCS можно рассматривать как параллельную разработку и возможную альтернативу Unicode . [1] Для максимальной совместимости более поздние выпуски LMBCS включают UTF-16 в качестве подмножества. [2] [3]
В коммерческом плане LMBCS впервые был представлен как набор символов по умолчанию в Lotus 1-2-3 Release 3 для DOS в марте 1989 года [1] [4] и в Lotus 1-2-3/G Release 1 для OS/2 [1] в 1990 году, заменив 8-битный Lotus International Character Set (LICS) и ASCII, использовавшиеся в более ранних версиях Lotus 1-2-3 и Symphony только для DOS . [5] LMBCS также используется в IBM / Lotus SmartSuite , Notes и Domino , [1] а также в ряде сторонних продуктов.
LMBCS кодирует символы, необходимые для языков, использующих латинское [6] , арабское , еврейское , греческое и кириллическое [6] письмо, тайскую , китайскую , японскую [6] и корейскую письменности, а также технические символы.
Технически LMBCS представляет собой кодировку ведущих байтов, в которой кодовая точка 00 hex , а также кодовые точки от 20 hex (32) до 7F hex (127) идентичны ASCII [1] (а также LICS). [5]
Кодовая точка 00 hex всегда рассматривается как символ NUL для обеспечения максимальной совместимости кода с существующими библиотеками программного обеспечения, работающими со строками с нулевым завершением [1] во многих языках программирования , таких как C. [a] Это применимо даже к кодам UTF-16be, где кодовые слова с формой xx00 hex сопоставляются с кодами частного использования с формой F6xx hex во время кодирования, чтобы избежать использования байтов NUL, [7] и к экранированным управляющим символам, где 20 hex добавляется к управляющим символам C0 (но не C1) после ведущего байта 0F hex . [7]
Кодовые точки от 01 hex до 1F hex , которые служат управляющими кодами в ASCII, используются в качестве ведущих байтов для переключения определения кодовых точек выше 7F hex между несколькими кодовыми группами (аналогично кодовым страницам ) и в то же время определяют либо одно-, либо многобайтовую природу для соответствующей кодовой группы. [1]
Например, кодовая группа 1 (с групповым байтом 01 hex ) [1] почти идентична кодовой странице SBCS 850 , тогда как кодовая группа 16 (с групповым байтом 10 hex ) [1] похожа на японскую кодовую страницу MBCS 932. Таким образом, многобайтовые символы могут занимать два или три байта. [7] [6]
В каноническом LMBCS каждый символ начинается со своего группового байта. [1] Чтобы уменьшить длину, в оптимизированном или сжатом LMBCS группа кода по умолчанию или код группы оптимизации могут быть определены для каждого приложения или процесса (в идеале выбирается в соответствии с наибольшей вероятностью появления) [1] и должны быть сообщены интерпретирующему коду каким-либо образом (например, путем указания соответствующего имени "LMBCS- n "). [8] Таким образом, групповой байт для этих символов может быть опущен. [1] Lotus 1-2-3 извлекает код группы оптимизации из заголовка файла соответствующего исходного файла, [7] тогда как для Lotus Notes код группы оптимизации всегда фиксирован и равен 01 hex . [2] [7]
По умолчанию | Группа | Байты | Описание |
---|---|---|---|
Н/Д | 00 шестнадцатеричный | 1 [7] | НУЛЕВОЙ |
ЛМБКС-1 | 01 гекс | 2 [7] | Кодовая страница 850 (DOS Latin-1) [2] [7] |
ЛМБКС-2 | 02 шестнадцатеричный | 2 [7] | Кодовая страница 851 (DOS греческий) [2] [7] |
ЛМБКС-3 | 03 гекс | 2 [7] | Кодовая страница 1255 (Windows Hebrew) [2] [7] |
ЛМБКС-4 | 04 шестнадцатеричный | 2 [7] | Кодовая страница 1256 (Windows Arabic) [2] [7] |
ЛМБКС-5 | 05 гекс | 2 [7] | Кодовая страница 1251 (Windows Cyrillic) [2] [7] |
ЛМБКС-6 | 06 шестнадцатеричный | 2 [7] | Кодовая страница 852 (DOS Latin-2) [2] [7] |
Н/Д | 07 шестнадцатеричный | 1 [7] | БЕЛ [2] |
ЛМБКС-8 | 08 шестнадцатеричный | 2 [7] | Кодовая страница 1254 (Windows Turkish) [2] [9] [7] |
Н/Д | 09 шестнадцатеричный | 1 [7] | ВКЛАДКА [2] [9] [7] |
Н/Д | 0А шестнадцатеричный | 1 [7] | ЛФ [2] [9] [7] |
ЛМБКС-11 | 0B шестнадцатеричный | 2 [7] | Код страницы 874 (тайский) [9] [7] |
(ЛМБКС-12) | 0C шестнадцатеричный | 2 [7] | Зарезервировано [2] |
Н/Д | 0D шестнадцатеричный | 1 [7] | CR [2] [9] [7] |
(ЛМБКС-14) | 0E шестнадцатеричный | 2 [7] | Зарезервировано [2] |
(ЛМБКС-15) | 0F шестнадцатеричный | 2 [7] | Переназначенные коды управления C0/C1 [7] |
ЛМБКС-16 | 10 гекс | 3 [7] | Кодовая страница 932 / [2] 943 [7] (Японский / Shift-JIS) [2] [9] |
ЛМБКС-17 | 11 гекс | 3 [7] | Код страницы 949 / [2] 1261 [7] (корейский) [2] [9] |
ЛМБКС-18 | 12 гекс. | 3 [7] | Кодовая страница 950 [2] [7] (Традиционный китайский / Тайвань / Big5 ) [2] [9] |
ЛМБКС-19 | 13 гекс | 3 [7] | Код страницы 936 / [2] 1386 [7] (упрощенный китайский) [2] [9] |
(ЛМБКС-20) | 14 гекс. | 3 [7] | UTF-16 ( Юникод ) [2] [3] [7] |
Н/Д | 15 гекс. | 3 | Зарезервировано [2] |
Н/Д | 16 гекс. | 3 | Зарезервировано [2] |
Н/Д | 17 гекс. | 3 | Зарезервировано [2] |
Н/Д | 18 гекс. | 3 | Зарезервировано [2] |
Н/Д | 19 гекс. | 1 [7] | Диапазон систем Lotus 1-2-3 [9] [7] |
Н/Д | 1А шестигранник | 3 | Зарезервировано [2] |
Н/Д | 1B шестигранник | 3 | Зарезервировано [2] |
Н/Д | 1С шестнадцатеричный | 3 | Зарезервировано [2] |
Н/Д | 1D шестигранник | 3 | Зарезервировано [2] |
Н/Д | 1E гекс | 3 | Зарезервировано [2] |
Н/Д | 1F шестигранник | 3 | Зарезервировано [2] |
Без префиксного байта кодовые точки с 32 (20 hex ) по 127 (7F hex ) интерпретируются следующим образом (соответствуют кодам LMBCS с 32 по 127):
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | А | Б | С | Д | Э | Ф | |
2x | СП | ! | " | # | $ | % | & | ' | ( | ) | * | + | , | - | . | / |
3x | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? |
4x | @ | А | Б | С | Д | Э | Ф | Г | ЧАС | я | Дж. | К | Л | М | Н | О |
5x | П | В | Р | С | Т | У | В | Вт | Х | И | З | [ | \ | ] | ^ | _ |
6x | ` | а | б | с | г | е | ф | г | час | я | дж | к | л | м | н | о |
7x | п | д | г | с | т | ты | в | ж | х | у | з | { | | | } | ~ | ДЕЛ / ⌂ |
Кодовые точки группы LMBCS 128 (80 hex ) – 255 (FF hex ) идентичны соответствующим кодовым точкам в кодовой странице 850 (DOS Latin-1), тогда как кодовые точки 1 (01 hex ) – 127 (7F hex ) определяются в соответствии со следующим списком исключений (соответствующим кодам LMBCS 256–383):
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | А | Б | С | Д | Э | Ф | |
0x | НУЛЕВОЙ | ☺ | ☻ | ♥ | ♦ | ♣ | ♠ | • | ◘ | ○ | ◙ | ♂ | ♀ | ♪ | ♫ | ☼ |
1x | ► | ◄ | ↕ | ‼ | ¶ | § | ▬ | ↨ | ↑ | ↓ | → | ← | ∟ | ↔ | ▲ | ▼ |
2x | ¨ | ~ | ˚ | ^ | ` | ´ | « | ' | … | - [б] | — | ' [с] | ' [с] | ‹ | › | |
3x | ¨ [д] | ~ [д] | ˚ [д] | ^ [д] | ` [д] | ´ [д] | „ | ‚ | ” | ‗ | nbsp[с] | [ с] | ||||
4x | Œ | œ | Ÿ | ˙ [с] | ˚ [с] [д] | ╞ | ╟ | ▌ | ▐ | ◊ [с] | ⌘ [с] | [с] | [с] | Ω [с] | ||
5x | ╨ | ╤ | ╥ | ╙ | ╘ | ╒ | ╓ | ╫ | ╪ | ╡ | ╢ | ╖ | ╕ | ╜ | ╛ | ╧ |
6x | я | IJ | фи | fl | ʼn | ŀ | Ŀ | ¯ [с] | ˘ [с] | ˝ [с] | ˛ [с] | ˇ [с] | ~ [с] [д] | ^ [с] [д] | ||
7x | † | ‡ | Ħ [с] | ħ [с] | « [с] | » [с] | ™ | ℓ | Ŋ [c] | ŋ [с] | к [с] | Кр [э] | ⌐ | ₤ | ₧ |
Кодовые точки группы 2 LMBCS от 128 (80 hex ) до 255 (FF hex ) идентичны соответствующим кодовым точкам в кодовой странице 851 (DOS Greek), тогда как кодовые точки от 1 (01 hex ) до 127 (7F hex ) определяются в соответствии со следующим списком исключений: [f]
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | А | Б | С | Д | Э | Ф | |
0x | НУЛЕВОЙ | ͺ | ΅ | Ϊ | Ϋ | ― | ΄ | ʼ | ʽ | ‾ | | | ||||
1x | | | ⇕ | ⅞ | ⅝ | ⅜ | ⅛ | | ⇑ | ⇓ | ⇒ | ⇐ | | ⇔ | | |
2x | | | | | | | | | | | | | | | | |
3x | | | | | | | | | | | | | | | | |
4x | ∠ | ∇ | | | | | | | | | | | | | | |
5x | ∂ | ℵ | ℑ | ℜ | | | | | | | | ∋ | ∈ | ∉ | ⊆ | ⊇ |
6x | ⊗ | ⊕ | ✓ | ⋀ | ∁ | ∫ | ∀ | ∃ | | ′ | ″ | ∞ | ∝ | φ | ∪ | ∩ |
7x | ≡ | ≅ | ≥ | ≤ | ⌠ | ⌡ | ≠ | ≈ | ⁄ | ∙ | ‰ | √ | ⁿ | ∅ | ⊂ | ⊃ |
Кодовые точки группы 6 LMBCS от 128 (80 hex ) до 255 (FF hex ) идентичны соответствующим кодовым точкам в кодовой странице 852 (DOS Latin-2), тогда как кодовые точки от 1 (01 hex ) до 127 (7F hex ) определяются в соответствии со следующим списком исключений: [f]
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | А | Б | С | Д | Э | Ф | |
0x | НУЛЕВОЙ | а | Ч | Ч | Ċ | ч | Э | е | Э | е | Ĝ | г | Г | г | Г | г |
1x | ЧАС | час | Я | я | Я | я | Я | я | Ĵ | я | К | к | Я | ь | С | ņ |
2x | О | о | Ŗ | ŗ | Ŝ | ŝ | Ũ | ũ | Ū | u | Ŭ | ŭ | Ų | ų | А | |
3x | ||||||||||||||||
4x | ||||||||||||||||
5x | ||||||||||||||||
6x | ||||||||||||||||
7x |
В целях оптимизации групповой байт опущен в
примечаниях
для однобайтовых значений между X'20' и X'FF'. Например, LMBCS всегда оптимизируется для группы 0x01, что означает, что любой символ, где первый байт больше 0x1F, имеет неявный групповой байт 0x01.
[…] Notes использует один набор символов, Lotus Multibyte Character Set (LMBCS), для кодирования всех текстовых данных, используемых внутри его программ. Всякий раз, когда Notes впервые вводит текст, закодированный в наборе символов, отличном от LMBCS, он переводит текст в строку LMBCS, и всякий раз, когда он должен вывести текст в наборе символов, отличном от LMBCS, он переводит внутреннюю строку LMBCS в соответствующий набор символов. Поскольку весь текст внутренне форматируется LMBCS, все операции по обработке текста […] выполняются только одним способом. LMBCS использует до трех байтов в памяти для представления одного текстового символа […]